问题陈述
在使用实现相同接口的服务时,基于唯一键注册和解析它们可能是一个挑战。与允许使用键来区分具体实现的其他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中文网其他相关文章!