同一类的多个实例的控制反转
本文关键字:实例 控制 一类 | 更新日期: 2023-09-27 18:35:03
这是如何在 ServiceStack.net 中使用Funq注册多个IDbConnectionFactory实例的后续问题
我需要做同样的事情(让一个服务访问不同的数据库连接( - 但上述堆栈溢出讨论的答案对我来说并不完全有意义(SO 不允许我添加评论(。
这是否意味着,您不能在每个服务中多次使用依赖项类的实现,例如 IDbConnectionFactory (OrmLiteConnectionFactory(? 因此,如果您需要使用多个,则需要创建它的新实现(除了获得唯一的类名之外没有其他原因(?
我希望,这就是名称参数(在容器中。寄存器方法(用于(用于标识同一类的其他实例(。 例如,如果您可以拥有这样的东西,那将很方便: 容器。Register("Db_1", c => new OrmLiteConnectionFactory(connString1, SqlServerOrmLiteDialectProvider.Instance((; 容器。Register("Db_2", c => new OrmLiteConnectionFactory(connString2, SqlServerOrmLiteDialectProvider.Instance((;然后,使用服务中的每个连接,如下所示:db["DB_1"]。选择。。。db["DB_2"]。选择或Db_1.选择..Db_2.选择...
说我懒惰,但是编写一个类除了获取一个新类型名称之外没有其他目的(因为它是 100% 继承的,没有额外的属性/方法(似乎是多余的。
我假设我错过了 IoC/DI 的一些关键点,所以希望有人让我直截了当。
谢谢提姆
在这种情况下,命名实例用于服务定位器模式,这被许多人视为一种反模式。
例如,可以使用如下所示的命名实例:
container.Register<IDbConnectionFactory>("Db_1", c => new OrmLiteConnectionFactory(connString1, SqlServerOrmLiteDialectProvider.Instance));
container.Register<IDbConnectionFactory>("Db_2", c => new OrmLiteConnectionFactory(connString1, SqlServerOrmLiteDialectProvider.Instance));
然后你可以(但不应该(做这样的事情:
public void GetData()
{
var factory1 = container.TryResolveNamed<IDbConnectionFactory>("Db_1");
var factory2 = container.TryResolveNamed<IDbConnectionFactory>("Db_2");
...
}
Mark Seemann 写了一篇很好的文章,说明为什么不应该使用服务定位器模式。
对于命名实例,我认为没有任何方法可以避免使用者需要有关注入内容的一些知识。