Func当我发现自己处于这种情况时,我做了一个简单的解决方法。
首先声明一个共享的委托:
public delegate IService ServiceResolver(string key);
然后在中
Startup.cs,设置多个具体的注册以及这些类型的手动映射:
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(); // or maybe return null, up to you }});并从DI注册的任何类中使用它:
public class Consumer{ private readonly IService _aService; public Consumer(ServiceResolver serviceAccessor) { _aService = serviceAccessor("A"); } public void UseServiceA() { _aService.DoTheThing(); }}请记住,在此示例中,为简单起见,并且因为OP特别要求这种情况,所以解析的键是字符串。
但是您可以使用任何自定义解析类型作为键,因为通常您不希望使用大型的n-case开关来破坏您的代码。取决于您的应用扩展方式。



