【问题标题】:Component-specific Castle Windsor typed factory特定组件的 Castle Windsor 类型工厂
【发布时间】: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 上的连接字符串(或将其传递给连接构造函数)。

例如:

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

温莎城堡有可能吗?

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

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

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

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

【问题讨论】:

  • 命名组件能给你想要的吗?我认为这将允许您在注册时表达特定的依赖关系。

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


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-14
    • 2015-10-08
    相关资源
    最近更新 更多