2009-06-07 4 views
0

私は自分のリゾルバパターンの実装でCastle Windsorを使用しています。サービスの実装が2つあります。MethodAServiceMethodBServiceの両方にIMethodServiceが実装されています。ウィンザーをブートストラップするときに "Convention Over Over Configuration"を使用しています。Castle Windsorに常にMethodAService(Debug、Releaseなど)を使用するように指示することはできますが、もう一方はMethodBServiceを使用します。あなたの時間をありがとう!ここで城ウィンザーの設定はビルドファイルまたは設定ファイルに基づいています

+0

が質問:http://using.castleproject.org/display/IoC/FAQ –

答えて

2

IHandlerSelectorを使用して、それを行うための一つの方法です:

public class DebugHandlerSelector: IHandlerSelector { 
    private readonly Type serviceType; 
    private readonly Type debugImplementation; 
    private readonly Type releaseImplementation; 

    public DebugHandlerSelector(Type serviceType, Type debugImplementation, Type releaseImplementation) { 
     this.serviceType = serviceType; 
     this.debugImplementation = debugImplementation; 
     this.releaseImplementation = releaseImplementation; 
    } 

    public bool HasOpinionAbout(string key, Type service) { 
     return service == serviceType; 
    } 

    public IHandler SelectHandler(string key, Type service, IHandler[] handlers) { 
     return handlers.First(h => h.ComponentModel.Implementation == 
#if DEBUG 
      debugImplementation 
#else 
      releaseImplementation 
#endif      
      ); 
    } 
} 

使用例:ウィンザーよくある質問に追加

container.Kernel.AddHandlerSelector(new DebugHandlerSelector(typeof(IMethodService), typeof(MethodAService), typeof(MethodBService))); 
+1

これをIHandlerSelectorに依存しないようにするにはどうすればよいですか? –

+0

それとも城ウィンザーでどうですか? –

+0

私は実際にこれを本当に好きです。コンストラクタ呼び出しで3つのtypeofの代わりにGenericsを使用するようにリファクタリングしました。 –

関連する問題