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

时间:2013-10-10 19:24:50

标签: c# inversion-of-control servicestack

这是来自How to register multiple IDbConnectionFactory instances using Funq in ServiceStack.net

的后续问题

我需要做同样的事情(让一个服务访问不同的数据库连接) - 但上面提到的stackoverflow讨论的答案对我来说并不完全有意义(因此我不会让我添加评论)。 / p>

是否意味着,您不能每个服务多次使用依赖类的实现,例如IDbConnectionFactory(OrmLiteConnectionFactory)?因此,如果您需要使用多个,您需要创建它的新实现(除了获得唯一的类名之外没有其他原因)?

我曾希望,这就是name参数(在container.Register方法中)的用途(用于标识同一类的其他实例)。例如,如果你有这样的东西会很方便:  container.Register(“Db_1”,c => new OrmLiteConnectionFactory(connString1,SqlServerOrmLiteDialectProvider.Instance));  container.Register(“Db_2”,c => new OrmLiteConnectionFactory(connString2,SqlServerOrmLiteDialectProvider.Instance)); 然后使用您服务中的每个连接,如下所示: DB [ “DB_1”。选择... DB [ “DB_2”。选择 要么 Db_1.Select .. Db_2.Select ...

叫我懒惰,但写一个类只是为了得到一个新的类型名称(因为它是100%继承而没有其他属性/方法),似乎是多余的。

我假设我错过了IoC / DI的一些关键点,所以会很感激有人让我直截了当。

由于 添

1 个答案:

答案 0 :(得分:2)

我相信在这种情况下,命名实例用于服务定位器模式,这被许多人视为反模式。

例如,您可以使用这样的命名实例:

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撰写了nice article,说明了为什么不应该使用服务定位器模式。

对于命名实例,我认为没有办法避免消费者需要了解注入的内容。