我有从相同接口派生的服务。
public interface IService { }
public class ServiceA : IService { }
public class ServiceB : IService { }
public class ServiceC : IService { }
通常,其他IoC容器,如Unity
允许您通过以下方式注册具体的实现Key
这就是他们的不同之处。
在ASP.NET核心中,如何注册这些服务,并在运行时根据某个键解析它们?
我什么也没看到Add
服务方法需要key
或者name
参数,该参数通常用于区分具体的实现。
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
我已经把这篇文章看了一遍。here这说明了当我们有多个具体实现时,如何使用工厂模式来获取服务实例。然而,它仍然不是一个完整的解决方案。当我调用_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背道而驰,因为它增加了客户端具有的依赖项的数量
详细信息here](https://www.cuttingedge.it/blogs/steven/pivot/entry.php?id=100) [..。因此,我认为ASP.NET核心中的默认DI缺少两个东西:
https://stackoverflow.com/questions/39174989
复制相似问题