我拥有从同一接口派生的服务。
public interface IService { }
public class ServiceA : IService { }
public class ServiceB : IService { }
public class ServiceC : IService { }
通常情况下,其他IoC容器如Unity允许你通过一些区分它们的Key来注册具体的实现。
在ASP。NET Core,我如何注册这些服务,并在运行时根据一些关键字解析它们?
我没有看到任何接受键或名称参数的Add Service方法,这些参数通常用于区分具体实现。
public void ConfigureServices(IServiceCollection services)
{
// How do I register services of the same interface?
}
public MyController:Controller
{
public void DoSomething(string key)
{
// How do I resolve the service by key?
}
}
工厂模式是这里唯一的选择吗?
Update1
在这篇文章中,我已经展示了当我们有多个具体实现时,如何使用工厂模式来获取服务实例。然而,这仍然不是一个完整的解决方案。当我调用_serviceProvider.GetService()方法时,我不能将数据注入构造函数。
举个例子:
public class ServiceA : IService
{
private string _efConnectionString;
ServiceA(string efconnectionString)
{
_efConnecttionString = efConnectionString;
}
}
public class ServiceB : IService
{
private string _mongoConnectionString;
public ServiceB(string mongoConnectionString)
{
_mongoConnectionString = mongoConnectionString;
}
}
public class ServiceC : IService
{
private string _someOtherConnectionString
public ServiceC(string someOtherConnectionString)
{
_someOtherConnectionString = someOtherConnectionString;
}
}
_serviceProvider.GetService()如何注入适当的连接字符串?
在Unity或任何其他IoC库中,我们可以在类型注册时做到这一点。我可以使用IOption,但是,这将要求我注入所有设置。我无法向服务中注入特定的连接字符串。
还要注意,我试图避免使用其他容器(包括Unity),因为这样我就必须注册其他所有东西(例如,控制器)与新容器以及。
此外,使用工厂模式创建服务实例是不利于DIP的,因为它增加了客户端在这里有详细信息的依赖项数量。
所以,我认为默认DI在ASP。NET Core缺少两样东西:
使用键注册实例的能力
在注册期间向构造函数注入静态数据的能力