在 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中文网其他相关文章!