【发布时间】:2012-12-07 14:12:17
【问题描述】:
我有一个使用多个不同数据库连接的应用程序。我想使用 Castle Windsor 的类型化工厂支持将返回 IDbConnection 实例的工厂注入到我的存储库和其他组件中。
我的类型化工厂的界面如下所示:
public interface IConnectionFactory
{
IDbConnection CreateConnection();
}
这是一个示例存储库:
public class AccountRepository
{
private readonly IConnectionFactory connectionFactory;
public AccountRepository(IConnectionFactory connectionFactory)
{
this.connectionFactory = connectionFactory;
}
public Account FindAccountById(int id)
{
using (var connection = connectionFactory.CreateConnection())
{
// TODO use the connection here
}
}
}
还有我的组件注册摘录:
// ...
container.Register(Component.For<IDbConnection>()
.ImplementedBy<NpgsqlConnection>()
.LifestyleTransient());
container.Register(Component.For<IConnectionFactory>()
.AsFactory());
// ...
我所有的IDbConnections 都是使用相同的类型(NpgsqlConnection)实现的,但是我需要使用几个不同的连接字符串。理想情况下,我想设置 Windsor 以根据具有 IConnectionFactory 作为依赖项的组件为我设置 IDbConnection 上的连接字符串(或将其传递给连接构造函数)。
例如:
- 假设我有两个存储库,
AccountRepository和ItemRepository,它们将IConnectionFactory作为其构造函数中的依赖项。 - 假设我还有两个连接字符串,分别名为
foo和bar。 - 当
AccountRepository调用IConnectionFactory.CreateConnection()时,我希望它使用连接字符串foo返回一个IDbConnection。 - 但是,当
ItemRepository调用IConnectionFactory.CreateConnection()时,我希望它使用连接字符串bar返回IDbConnection。
温莎城堡有可能吗?
我研究了这个主题,但没有找到任何适合我的确切情况的解决方案。理想情况下,我想让我的存储库不知道要使用的确切连接字符串,即我确实不想将我的连接工厂更改为:
public interface IConnectionFactory
{
IDbConnection CreateConnection(string connectionStringName);
}
我还阅读了在 ISubDependencyResolver 和 ITypedFactoryComponentSelector 上可以找到的所有文档和文章,但我不确定它们是否适用于这种情况或如何将所有内容拼凑在一起。
顺便说一句,我正在使用 Castle Windsor 3.1 和 .NET 4.0。
【问题讨论】:
-
命名组件能给你想要的吗?我认为这将允许您在注册时表达特定的依赖关系。
标签: c# database-connection castle-windsor typed-factory-facility