同一类的多个实例的控制反转

本文关键字:实例 控制 一类 | 更新日期: 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 写了一篇很好的文章,说明为什么不应该使用服务定位器模式。

对于命名实例,我认为没有任何方法可以避免使用者需要有关注入内容的一些知识。