我拥有从同一接口派生的服务。
public interface IService { }
public class ServiceA : IService { }
public class ServiceB : IService { }
public class ServiceC : IService { }
通常,像Unity这样的其他IoC容器允许你通过一些Key来注册具体的实现。
在ASP。NET Core,我如何注册这些服务,并在运行时根据一些关键字解析它们?
我没有看到任何带有key或name参数的Add服务方法,这些参数通常用于区分具体实现。
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?
}
}
工厂模式是这里唯一的选择吗?
< p > Update1 < br > 我已经阅读了文章在这里,它展示了当我们有多个具体实现时如何使用工厂模式来获得服务实例。然而,这仍然不是一个完整的解决方案。当我调用_serviceProvider.GetService()方法时,我不能将数据注入构造函数。< / p >
举个例子:
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缺少两样东西: