1

いくつかの異なるデータベース接続を使用するアプリケーションがあります。IDbConnectionCastle Windsorの型付きファクトリサポートを使用して、インスタンスをリポジトリやその他のコンポーネントに返すファクトリを注入したいと思います。

入力したファクトリのインターフェイスは次のようになります。

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)を使用して実装されていますが、使用する必要のあるいくつかの異なる接続文字列があります。IDbConnection理想的には、依存関係を持つコンポーネントに応じて、接続文字列を設定する(または接続コンストラクターに渡す)ようにWindsorを設定したいと思いますIConnectionFactory

例えば:

  • コンストラクターの依存関係をとる2つのリポジトリーとがAccountRepositoryあります。ItemRepositoryIConnectionFactory
  • とという名前の2つの接続文字列もあるfooとしbarます。
  • AccountRepositoryを呼び出すときに、 using接続文字列IConnectionFactory.CreateConnection()を返すようにします。 IDbConnectionfoo
  • ただし、をItemRepository呼び出すときに、 using接続文字列IConnectionFactory.CreateConnection()を返すようにします。IDbConnectionbar

これはCastleWindsorで可能ですか?

私はこのトピックを調査しましたが、私の正確なシナリオに適合する解決策は見つかりませんでした。理想的には、使用する正確な接続文字列をリポジトリに認識させないようにします。つまり、接続ファクトリを次のように変更したくありません。

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

また、見つけたすべてのドキュメントと記事を読みましたISubDependencyResolverITypedFactoryComponentSelector、それらがこのシナリオに適用できるかどうか、またはすべてをつなぎ合わせる方法がわかりません。

ちなみに、私はCastleWindsor3.1と.NET4.0を使用しています。

4

1 に答える 1

0

タイプされたファクトリではなく、実際のファクトリを使用するかもしれません。

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

そして、それをウィンザーに正しいリポジトリに登録します。

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