1

我有一个使用多个不同数据库连接的应用程序。我想使用 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 以根据作为依赖项 IDbConnection的组件为我设置连接字符串(或将其传递给连接构造函数) 。IConnectionFactory

例如:

  • 假设我有两个存储库,AccountRepository并且ItemRepository,它们IConnectionFactory在其构造函数中作为依赖项。
  • 假设我还有两个名为fooand的连接字符串bar
  • AccountRepository调用时IConnectionFactory.CreateConnection(),我希望它返回一个IDbConnection使用连接字符串foo
  • 但是,当一个ItemRepository调用时IConnectionFactory.CreateConnection(),我希望它返回一个IDbConnection使用连接字符串bar

温莎城堡有可能吗?

我已经研究过这个主题,但没有找到任何适合我的确切情况的解决方案。理想情况下,我想让我的存储库不知道要使用的确切连接字符串,即我不想将我的连接工厂更改为:

public interface IConnectionFactory
{
    IDbConnection CreateConnection(string connectionStringName);
}

我还阅读了我可以找到的所有文档和文章ISubDependencyResolverITypedFactoryComponentSelector但我不确定它们是否适用于这种情况或如何将所有内容拼凑在一起。

顺便说一句,我正在使用 Castle Windsor 3.1 和 .NET 4.0。

4

1 回答 1

0

也许使用真正的工厂,而不是打字工厂:

public ConnectionAFactory : IConnectionFactory
{
     public ConnectionAFactory()
     {
          this.connectionString = "foo";
     }
}

并使用正确的存储库在 windsor 中注册它:

Component.For<AccountRepository>()
    .DependsOn(
        ServiceOverride.ForKey<IConnectionFactory>().Eq(typeof(ConnectionAFactory)));
于 2012-12-20T15:18:17.177 回答