我有一个使用多个不同数据库连接的应用程序。我想使用 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());
// ...
我所有的IDbConnection
s 都使用相同的类型 ( NpgsqlConnection
) 实现,但我需要使用几个不同的连接字符串。理想情况下,我想设置 Windsor 以根据作为依赖项 IDbConnection
的组件为我设置连接字符串(或将其传递给连接构造函数) 。IConnectionFactory
例如:
- 假设我有两个存储库,
AccountRepository
并且ItemRepository
,它们IConnectionFactory
在其构造函数中作为依赖项。 - 假设我还有两个名为
foo
and的连接字符串bar
。 AccountRepository
调用时IConnectionFactory.CreateConnection()
,我希望它返回一个IDbConnection
使用连接字符串foo
。- 但是,当一个
ItemRepository
调用时IConnectionFactory.CreateConnection()
,我希望它返回一个IDbConnection
使用连接字符串bar
。
温莎城堡有可能吗?
我已经研究过这个主题,但没有找到任何适合我的确切情况的解决方案。理想情况下,我想让我的存储库不知道要使用的确切连接字符串,即我不想将我的连接工厂更改为:
public interface IConnectionFactory
{
IDbConnection CreateConnection(string connectionStringName);
}
我还阅读了我可以找到的所有文档和文章ISubDependencyResolver
,ITypedFactoryComponentSelector
但我不确定它们是否适用于这种情况或如何将所有内容拼凑在一起。
顺便说一句,我正在使用 Castle Windsor 3.1 和 .NET 4.0。