gpt4 book ai didi

c# - 将 Windsor CaSTLe IoC 用于 Windows 服务

转载 作者:行者123 更新时间:2023-11-30 23:10:41 26 4
gpt4 key购买 nike

我正在为 Active MQ 编写 Windows 服务 Listner。我正在尝试在项目中实现依赖注入(inject)。但我不确定在哪里注册 Container 以及它将如何解决?

我试着将它放在 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 Constructor - 运气不好。甚至尝试将它放在 Main 函数中。但是我总是在事件记录器中遇到错误。

'Namespace.HttpClient.HttpClientProxyHandler' 正在等待以下依赖项:- 未注册的服务“CaSTLe.Windsor.IWindsorContainer”。

有人可以帮忙吗?

最佳答案

我同意 Patrick 的观点,您不应该在注册的组件中依赖于 IWindsorContainer(或 IKernel)。相反,取决于您需要的组件(或者更确切地说,这些组件实现的接口(interface)),确保它们也在您的容器中注册,并让 CaSTLe Windsor 为您解析整个依赖层次结构。

为什么不应该提供一种机制来解决每个组件的依赖关系?好吧,它隐藏了组件的实际依赖关系,并使在测试中模拟/ stub 它们变得更加困难,因为您必须模拟服务定位器和实际依赖关系。它还将管理依赖项的责任推给了您;在 CaSTLe Windsor 中,如果您明确地 Resolve 一个组件,最好的做法是在完成后也 Release 它。最后,它将您的组件与您当前使用的依赖注入(inject)的特定风格耦合,即 I.E.温莎城堡。

关于c# - 将 Windsor CaSTLe IoC 用于 Windows 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45221600/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com