这是来自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的一些关键点,所以会很感激有人让我直截了当。
由于 添
答案 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,说明了为什么不应该使用服务定位器模式。
对于命名实例,我认为没有办法避免消费者需要了解注入的内容。