使用Windsor Castle IoC for Windows服务

问题描述:

我正在为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'。一般来说,你不想将容器/内核传递给你的实现... –

我同意帕特里克,你不应该取决于您的注册组件中的IWindsorContainer(或IKernel)。相反,依赖于你需要的组件(或者说这些组件实现的接口),确保它们也在你的容器中注册,并让Castle Windsor为你解决整个依赖关系层次结构。

为什么不应该提供解决每个组件的依赖性的机制?那么,它隐藏了组件的实际依赖关系,并且使得在测试中模拟/存根更困难,因为您必须模拟服务定位器和实际依赖关系。它还将管理依赖的责任推给你;在Castle Windsor城堡中,如果您明确地使用Resolve组件,那么最好的做法是在完成后再使用Release。最后,它将您的组件与您当前使用的依赖注入的特定风格相结合,I.E.温莎城堡。

+0

谢谢@Andy Lamb和Patrick。你能否详细说明一下。可能有一些例子。 – PaRsH

+0

@PaRsH内核/容器是一种“服务定位器”,注入它是一种反模式。从[此问题/答案](https://stackoverflow.com/q/22795459/1698557)开始,如果您需要更多信息,请使用一些额外的Google搜索。 –

我会推荐与Topshelf框架一起实施它。你可以在这里看到类似的例子:

https://github.com/EasyNetQ/EasyNetQ/wiki/Wiring-up-EasyNetQ-with-TopShelf-and-Windsor

相反的ActiveMQ他们使用EasyNetQ,但基本上这个问题应该是相同的。