特定组件城堡温莎型工厂

时间:2012-12-07 14:12:17

标签: c# database-connection castle-windsor typed-factory-facility

我有一个使用多个不同数据库连接的应用程序。我想使用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作为依赖关系的组件。

例如:

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

Castle Windsor有可能吗?

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

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

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

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

1 个答案:

答案 0 :(得分:0)

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

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

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

Component.For<AccountRepository>()
    .DependsOn(
        ServiceOverride.ForKey<IConnectionFactory>().Eq(typeof(ConnectionAFactory)));