いくつかの異なるデータベース接続を使用するアプリケーションがあります。IDbConnection
Castle 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
あります。ItemRepository
IConnectionFactory
- とという名前の2つの接続文字列もある
foo
としbar
ます。 AccountRepository
を呼び出すときに、 using接続文字列IConnectionFactory.CreateConnection()
を返すようにします。IDbConnection
foo
- ただし、を
ItemRepository
呼び出すときに、 using接続文字列IConnectionFactory.CreateConnection()
を返すようにします。IDbConnection
bar
これはCastleWindsorで可能ですか?
私はこのトピックを調査しましたが、私の正確なシナリオに適合する解決策は見つかりませんでした。理想的には、使用する正確な接続文字列をリポジトリに認識させないようにします。つまり、接続ファクトリを次のように変更したくありません。
public interface IConnectionFactory
{
IDbConnection CreateConnection(string connectionStringName);
}
また、見つけたすべてのドキュメントと記事を読みましたISubDependencyResolver
がITypedFactoryComponentSelector
、それらがこのシナリオに適用できるかどうか、またはすべてをつなぎ合わせる方法がわかりません。
ちなみに、私はCastleWindsor3.1と.NET4.0を使用しています。