2011-12-16 2 views
4

私は、インターフェイスの複数の実装を注入するシナリオをサポートするために、CollectionResolver(特にListResolver)を使用しています。以前は、ResolveAll()は解決可能な実装のみを返し、解決できなかった実装済みの実装は黙って無視します。現在、登録された実装のいずれかが解決できない場合、ResolveAll()は失敗します。Castle 3の古いCollectionResolverの動作に戻すには?

一般的に、これは良い変化だと思うのですが、私たちが実際に考えているすべての実装を実際に取得していることを保証します。しかし、私は実際に私の利益のために古い行動を使用していたいくつかのシナリオがあります。共通のインストーラによって登録されたインフラストラクチャコンポーネント(IBar)は、IFooのコレクション(コレクションリゾルバによって実行される)に依存します。一般的なインストーラでは、私もIFooのいくつかの実装を登録しますが、これらの実装は登録されていてもいなくてもよいサービスに依存しています。アイデアは、クライアントが、依存するサービスを登録することによってIFooのそのような実装を「アクティブ化」できるということです。以前は、クライアントが特定のIFooの依存関係を登録しなかった場合、IFooの実装はIBarに単純に注入されませんでした(他の解決可能な実装もそうです)。このシナリオでは、(以前はオプションの)IFooを解決できなかったため、IBarの解決は失敗しました。

古い動作を簡単に復元する方法はありますか?理想的には、デフォルトでは新しい動作を使用したいが、特定のサービス(この場合はIFoo)の古い動作に戻すことが望ましい。私は、これを達成するためにIHandlersFilterの実装を作成しようとしましたが、すべての候補ハンドラ(SelectHandlersから空の配列を返します)をフィルタリングすることができないことを発見しました。とにかくすべての候補ハンドラを解決してください。

アイデア?私はあなたが私が間違ったやり方をしていると思うならば、私の目標を達成する全く異なるアプローチにもオープンしています。

答えて

1

IHandlersFilterと呼ばれるウィンザーの新しい拡張ポイントを使用して、ResolveAllの動作を細かく制御できます。例については、this blogpostを参照してください。

+0

こんにちはKrzysztof - 私はこのアプローチを試みましたが、残念なことに、SelectHandlerから空の配列を返すと、Windsorはフィルタを無視します(このコードはDefaultNamingSubSystem.GetFiltersOpinionにあります)。登録された実装 また、別の質問に値するかもしれませんが、特定のハンドラが解決可能かどうかを判断する簡単な方法がIHandlersFilter実装内にありますか? –

+0

私は別の質問を掲載しました:上記のコメント:http://stackoverflow.com/questions/8567780/how-to-determine-if-a-component-is-resolvable-from-an-ihandlersfilter-implementa –

+0

私はこれを将来の参照のために受け入れられたものとしてマークしていますが、上記のコメントに注意してください。このメカニズムを介してすべてのIHandlerを削除することはできません。したがって、古い動作を完全に復元することはできないようです(ResolveAllに依存するメカニズムを使用)。 –

関連する問題