0

IMyServiceをコンストラクタ引数として使用するクラスがたくさんあります。Windsor Iocコンテナ:特定のコンストラクタを登録するには、インタフェースの実装方法が異なります

ClassA(IMyservice myservice) 
// this should take a Concrete1 for IMyService 

ClassB(IMyservice myservice) 
// this should take a Concrete2 for IMyService 

ClassBがConcrete2を取得し、ClassAがConcrete1を取得するように登録するにはどうすればよいですか?

さらに、既定値から逸脱するインスタンスのみを指定する方法はありますか?私は流暢なインターフェイス、ませ XML構成を使用しています(大半のようConcrete1がかかりますし、わずか数がConcrete2がかかります。)

を。

答えて

1

利用サービスオーバーライド:

var container = new WindsorContainer(); 
container.Register(
    Component.For<IMyService>().ImplementedBy<Concrete1>().Named("C1"), 
    Component.For<IMyService>().ImplementedBy<Concrete2>().Named("C2"), 
    Component.For<ClassA>().ServiceOverrides(ServiceOverride.ForKey("service").Eq("C1")), 
    Component.For<ClassB>().ServiceOverrides(ServiceOverride.ForKey("service").Eq("C2")) 
); 
+0

はデフォルトを持っているだけで例外を無効にする方法があります。それ以外の場合は、コンクリート1の具体的な登録は100回、コンクリート2の場合は約3回行う必要があります。 – ChrisCa

+0

コンポーネントに「IMyService」が必要な場合、Windsorは常に最初に登録されたものを返すと思います。 ClassAのServiceOverride(およびその他の100のケース)をスキップして、3つのフリンジケースで使用することもできます。 – PatrickSteele

+0

この場合C1とC2は何ですか?彼らはあなたがserviceOverridesでそれらを参照することができるように登録に与えられた任意の名前ですか?私のプロジェクトの実際のクラスに対応していますか?もう一度ありがとう – ChrisCa

関連する問題