2017-01-03 4 views
4

(特定の問題を強調するシナリオはやや簡略化されています)。Castle Windsorはゼロ個以上の実装を解決します

私は、サービス・インターフェースの配列である単一のパラメータを持つコンストラクタを持つコンポーネントを、解決するために城ウィンザーを使用しようとしている

ウィンザーコンテナはArrayResolverを使用するように設定されて
public class TestClass<T> 
{ 
    public TestClass(IService<T>[] services) 
    { 
     ... 
    } 
} 

container.Kernel.Resolver.AddSubResolver(new ArrayResolver(container.Kernel)); 

このすべてが正常に動作し、1つ以上のサービスがしかし、いくつかのTのために、何のimplemeがないT.

の様々なインスタンスのために注入されます。 IService<T>の番号。目標は、長さゼロの配列でコンストラクタを呼び出すことです。

特定のTのIServiceの具体的な実装がない場合、実装しないでIServiceの定義をどのように登録すればよいのですか?そのため、コンテナはその型を認識していますか?

私が使用して、現在のよ:これは具体的なクラスから駆動されるため

container.Register(
    Classes.FromAssembly(Assembly.GetExecutingAssembly()) 
     .BasedOn<IService<>>() 
     .WithService.FirstInterface()); 

をしかし、それは明らかに任意の「未使用」IServiceを登録していません。

フォールバックは、「本当の」実装を持たないTに対してIServiceのスタブ実装を提供することですが、そのようなスタブを多数使用してコードを汚染したくない場合があります。 (オープンジェネリックを通じていくつかのリフレクションを提供することもできます...)。同僚によってそれに向けられてきた自分の質問に、答える

答えて

4

...二番目のパラメータでArrayResolverの登録

は空の配列が可能指定 - 問題のコンポーネントが登録されていない場合場合です:

container.Kernel.Resolver.AddSubResolver(new ArrayResolver(container.Kernel, true)); 

です。そのため、動作はまったく同じです。

関連する問題