2

我正在爲Active MQ編寫Windows服務Listner。我正試圖在項目中實現依賴注入。但我不確定在哪裏註冊Container以及它如何解決?使用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構造函數 - 沒有運氣。甚至嘗試把它放在主要功能。但是我總是在事件記錄器中得到低於錯誤的信息。

「Namespace.HttpClient.HttpClientProxyHandler」正在等待以下依賴性: - 服務「Castle.Windsor.IWindsorContainer」這是未註冊。

任何人都可以幫忙嗎?

+1

嘗試使用'IKernel'而不是'IWindsorContainer'。一般來說,你不想將容器/內核傳遞給你的實現... –

回答

2

我同意帕特里克,你不應該取決於您的註冊組件中的IWindsorContainer(或IKernel)。相反,依賴於你需要的組件(或者說這些組件實現的接口),確保它們也在你的容器中註冊,並讓Castle Windsor爲你解決整個依賴關係層次結構。

爲什麼不應該提供解決每個組件的依賴性的機制?那麼,它隱藏了組件的實際依賴關係,並且使得在測試中模擬/存根更困難,因爲您必須模擬服務定位器和實際依賴關係。它還將管理依賴的責任推給你;在Castle Windsor城堡中,如果您明確地使用Resolve組件,那麼最好的做法是在完成後再使用Release。最後,它將您的組件與您當前使用的依賴注入的特定風格相結合,I.E.溫莎城堡。

+0

謝謝@Andy Lamb和Patrick。你能否詳細說明一下。可能有一些例子。 – PaRsH

+0

@PaRsH內核/容器是一種「服務定位器」,注入它是一種反模式。從[此問題/答案](https://stackoverflow.com/q/22795459/1698557)開始,如果您需要更多信息,請使用一些額外的Google搜索。 –