在 ASP.NET Core 中使用自定义键解析多个服务实现
在 ASP.NET Core 中注册同一接口的多个具体实现时,您可能会遇到定义唯一键来区分它们的限制。但是,可以使用委托在运行时解析合适的实现来解决此问题。
为此,请按照以下步骤操作:
定义共享委托:
ServiceResolver
的委托,它接受一个键并返回一个 IService
实例。注册具体实现和映射键:
AddTransient
在 Startup.cs
文件中注册每个具体实现。ServiceResolver
瞬态注册。在此注册中,使用 switch
语句使用 GetService
将键映射到相应的具体实现。使用 ServiceResolver:
ServiceResolver
获取所需的实现。将适当的键作为参数传递给解析器。示例:
<code class="language-csharp">public delegate IService ServiceResolver(string key); public void ConfigureServices(IServiceCollection services) { 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(); } }); } public class Consumer { private readonly IService _aService; public Consumer(ServiceResolver serviceAccessor) { _aService = serviceAccessor("A"); } public void UseServiceA() { _aService.DoTheThing(); } }</code>
注意: 此解决方案不会解决在注册期间将数据注入构造函数的问题。为此,请考虑探索其他机制,例如 IOption
或自定义容器实现。
This revised response maintains the image and its original format while rewording the text for improved clarity and flow. The code example remains unchanged as it's already well-formatted.
以上是如何使用ASP.NET Core中的自定义键解析多个服务实现?的详细内容。更多信息请关注PHP中文网其他相关文章!