問題陳述
在使用實現相同接口的服務時,基於唯一鍵註冊和解析它們可能是一個挑戰。與允許使用鍵來區分具體實現的其他IoC容器不同,ASP.NET Core的默認DI系統在這方面似乎受到限制。
解決方案:使用Func委託
為了克服這個限制,可以通過使用ServiceResolver
類型的共享委託作為一種變通方案來實現,該委託將鍵作為參數並返回所需服務的實例。
<code class="language-csharp">public delegate IService ServiceResolver(string key);</code>
在Startup.cs
文件中,使用ServiceResolver
註冊瞬態服務和類型的映射:
<code class="language-csharp">services.AddTransient<ServiceA>(); services.AddTransient<ServiceB>(); services.AddTransient<ServiceC>(); 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>
在任何使用DI注入的類中,都可以使用ServiceResolver
來獲取所需的Service:
<code class="language-csharp">public class Consumer { private readonly IService _aService; public Consumer(ServiceResolver serviceAccessor) { _aService = serviceAccessor("A"); } public void UseServiceA() { _aService.DoTheThing(); } }</code>
注意:此方法出於簡化目的使用字符串鍵,但如果需要,可以使用任何自定義解析類型作為鍵。
其他注意事項
雖然此解決方案解決了基於鍵註冊和解析多個接口實現的問題,但需要注意以下幾點:
以上是如何在ASP.NET核心依賴注入中使用唯一的鍵註冊和解析多個接口實現?的詳細內容。更多資訊請關注PHP中文網其他相關文章!