我有一个使用多个不同数据库连接的应用程序。我想使用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
都使用相同的类型(NpgsqlConnection
)实现,但我需要使用几个不同的连接字符串。理想情况下,我想设置Windsor在IDbConnection
上设置连接字符串(或将其传递给连接构造函数),具体取决于具有IConnectionFactory
作为依赖关系的组件。
例如:
AccountRepository
和ItemRepository
,它们将IConnectionFactory
作为其构造函数中的依赖项。foo
和bar
的连接字符串。AccountRepository
调用IConnectionFactory.CreateConnection()
时,我希望它使用连接字符串IDbConnection
返回foo
。 ItemRepository
调用IConnectionFactory.CreateConnection()
时,我希望它使用连接字符串IDbConnection
返回bar
。Castle Windsor有可能吗?
我已经研究了这个主题,但没有找到适合我的确切场景的任何解决方案。理想情况下,我想让我的存储库不知道要使用的确切连接字符串,即我 不 想要将我的连接工厂更改为:
public interface IConnectionFactory
{
IDbConnection CreateConnection(string connectionStringName);
}
我还阅读了我在ISubDependencyResolver
和ITypedFactoryComponentSelector
上可以找到的所有文档和文章,但我不确定它们是否适用于此场景或如何将所有内容拼凑在一起。
顺便说一下,我正在使用Castle Windsor 3.1和.NET 4.0。
答案 0 :(得分:0)
也许使用真正的工厂,而不是打字工厂:
public ConnectionAFactory : IConnectionFactory
{
public ConnectionAFactory()
{
this.connectionString = "foo";
}
}
使用正确的存储库在windsor中注册:
Component.For<AccountRepository>()
.DependsOn(
ServiceOverride.ForKey<IConnectionFactory>().Eq(typeof(ConnectionAFactory)));