2

Active MQのWindowsサービスListnerを作成しています。私はプロジェクトにDependency Injectionを実装しようとしています。しかし、私はコンテナをどこに登録するのか、それがどのように解決されるのか分かりません。Windsor Castle IoC for Windowsサービスの使用

下記のようにOnStartメソッドに入れようとしましたが、運がありません。

protected override void OnStart(string[] args) 
     { 
      container = new WindsorContainer(); 
      // IWindsorContainer container = new WindsorContainer(); 
      //container.Install(FromAssembly.This()); 
      container.Register(
       Component.For<IHttpClientProxyHandler>().ImplementedBy<HttpClientProxyHandlerWeb>().LifestyleTransient(), 
       Component.For<IHttpClientProxy>().ImplementedBy<HttpClientProxyWeb>().LifestyleTransient(), 
       //Component.For<IRedisCacheClient>().ImplementedBy<RedisCacheClient>().LifestyleTransient(), 
       Component.For<IApplicationSettings>().ImplementedBy<ApplicationSettings>().LifeStyle.PerWebRequest, 

       Component.For<ILogger>().ImplementedBy<Logger>().LifeStyle.PerWebRequest 

      ); 


      this.messagingQueue = new ActiveMessagingQueue(new ApplicationSettings(), new Logger()); 
      this.logger = new Logger(); 
      this.applicationSettings = new ApplicationSettings(); 
      this.httpClientProxyHandler = container.Resolve<IHttpClientProxyHandler>(); 

      this.messagingQueue.OnMessageReceived += this.OnListenerMessage; 
     } 

次に、私はServiceBaseコンストラクタを入れようとしました。メイン機能に入れてみました。しかし、イベントロガーでは常に下にエラーが表示されます。登録されていなかったサービス「Castle.Windsor.IWindsorContainer」 - :

は「Namespace.HttpClient.HttpClientProxyHandler」は次の依存関係を待っています。

誰でも助けてもらえますか?

+1

'IWindsorContainer'の代わりに' IKernel'を使ってみてください。そして、一般的にコンテナ/カーネルを実装に渡すことは望ましくありません。 –

答えて

2

私は、登録されたコンポーネントのIWindsorContainer(またはIKernel)に依存してはいけないとPatrickに同意します。代わりに、必要なコンポーネント(またはそれらのコンポーネントが実装するインターフェイス)に依存し、それらもコンテナに登録されていることを確認し、Castle Windsorが依存関係の階層全体を解決するようにします。

なぜ各コンポーネントへの依存関係を解決するためのメカニズムを提供してはいけませんか?つまり、コンポーネントの実際の依存関係が隠され、サービスロケータと実際の依存関係を模擬しなければならないため、テストでの模擬/スタブをより困難にします。それはまた、あなたへの依存関係を管理する責任も負います。城ウィンザーで明示的にResolveコンポーネントの場合は、完了したらReleaseにすることをお勧めします。最後に、現在使用しているDependency Injectionの特定のフレーバーにコンポーネントを結合します。ウィンザー城。

+0

Thanks @Andy LambとPatrickに感謝します。もう少し詳しいことを教えてください。おそらくいくつかの例があります。 – PaRsH

+0

@PaRsHカーネル/コンテナは "サービスロケータ"の一種であり、注入は反パターンです。 [この質問/回答](https://stackoverflow.com/q/22795459/1698557)から始め、さらに詳しい情報が必要な場合は追加のGoogle検索を行います。 –

関連する問題