0

这是关于如何在 ServiceStack.net 中使用 Funq 注册多个 IDbConnectionFactory 实例的问题

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

这是否意味着每个服务不能多次使用依赖类的实现,例如 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"].Select... Db["DB_2"].Select 或 Db_1.Select.. Db_2.Select...

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

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

谢谢蒂姆

4

1 回答 1

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 写了一篇关于为什么不应该使用服务定位器模式的好文章。

对于命名实例,我看不出有任何方法可以避免让消费者需要一些关于注入什么的知识。

于 2013-10-11T02:51:44.270 回答