在 ASP.NET Core 中解決多個實現註冊
ASP.NET Core 本身並不支持註冊多個可通過鍵區分的同一接口的實現。為了克服這個限制,開發人員依賴於替代方法,例如工廠模式。但是,這些解決方案會導致依賴性增加,並可能違反依賴倒置原則 (DIP)。
更有效的解決方法是使用共享委託 ServiceResolver
將鍵值映射到具體的實現。以下是具體步驟:
委託聲明:
定義一個委託 IService ServiceResolver(string key)
用於服務解析。
服務註冊:
在 Startup.cs
中將每個具體實現註冊為瞬態服務:
<code class="language-csharp">services.AddTransient<ServiceA>(); services.AddTransient<ServiceB>(); services.AddTransient<ServiceC>();</code>
鍵到類型的映射:
配置 ServiceResolver
委託以將鍵值映射到具體的實現:
<code class="language-csharp">services.AddTransient<ServiceResolver>(serviceProvider => key => { switch (key) { case "A": return serviceProvider.GetService<ServiceA>(); case "B": return serviceProvider.GetService<ServiceB>(); case "C": return serviceProvider.GetService<ServiceC>(); default: throw new KeyNotFoundException(); } });</code>
服務使用:
將 ServiceResolver
注入到需要註冊服務的類中。例如:
<code class="language-csharp">public class Consumer { private readonly IService _aService; public Consumer(ServiceResolver serviceAccessor) { _aService = serviceAccessor("A"); } public void UseServiceA() { _aService.DoTheThing(); } }</code>
這種方法提供了一種靈活的方式來註冊和解析同一接口的多個實現,從而實現更有效的依賴管理並遵守 DIP。雖然它不是 ASP.NET Core 的內置功能,但它為常見的 DI 挑戰提供了一種可行的解決方案。
以上是如何在ASP.NET Core中解析相同接口的多個實現?的詳細內容。更多資訊請關注PHP中文網其他相關文章!