使用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”这是未注册。
任何人都可以帮忙吗?
我同意帕特里克,你不应该取决于您的注册组件中的IWindsorContainer
(或IKernel
)。相反,依赖于你需要的组件(或者说这些组件实现的接口),确保它们也在你的容器中注册,并让Castle Windsor为你解决整个依赖关系层次结构。
为什么不应该提供解决每个组件的依赖性的机制?那么,它隐藏了组件的实际依赖关系,并且使得在测试中模拟/存根更困难,因为您必须模拟服务定位器和实际依赖关系。它还将管理依赖的责任推给你;在Castle Windsor城堡中,如果您明确地使用Resolve
组件,那么最好的做法是在完成后再使用Release
。最后,它将您的组件与您当前使用的依赖注入的特定风格相结合,I.E.温莎城堡。
谢谢@Andy Lamb和Patrick。你能否详细说明一下。可能有一些例子。 – PaRsH
@PaRsH内核/容器是一种“服务定位器”,注入它是一种反模式。从[此问题/答案](https://stackoverflow.com/q/22795459/1698557)开始,如果您需要更多信息,请使用一些额外的Google搜索。 –
我会推荐与Topshelf框架一起实施它。你可以在这里看到类似的例子:
https://github.com/EasyNetQ/EasyNetQ/wiki/Wiring-up-EasyNetQ-with-TopShelf-and-Windsor
相反的ActiveMQ他们使用EasyNetQ,但基本上这个问题应该是相同的。
尝试使用'IKernel'而不是'IWindsorContainer'。一般来说,你不想将容器/内核传递给你的实现... –