我们托管一些 WCF 服务,我们使用 CaSTLe Windsor 作为 IOC 并使用 WCF Facility 托管服务:
Component.For<IInter1>()
.ImplementedBy<Class1>()
.LifestylePerWcfOperation()
.AsWcfService()
所有其他依赖项都在 Windsor 的 LifestylePerWcfOperation 中注册。
Rebus 处理程序是这样的:
public class TestCastleRebusHandler : IHandleMessages<CastleRebusMessage>
{
public TestCastleRebusHandler(DependenchyWithWCFContext failsHere) { }
public void Handle(CastleRebusMessage message) { }
}
问题是所有注册都是 PerWcfOperation,并且在接收消息时无法将它们注入(inject) Rebus,因为上下文不是 WCF。 Rebus 配置是:
_adapter = new Rebus.Castle.Windsor.WindsorContainerAdapter(Container);
_bus = Configure.With(_adapter)
.Logging(x => x.ColoredConsole(LogLevel.Info))
.Transport(x => x.UseMsmqAndGetInputQueueNameFromAppConfig())
.MessageOwnership(m => m.FromRebusConfigurationSection())
.Subscriptions(x => x.StoreInMemory())
.CreateBus()
.Start();
处理这种情况的最佳方法是什么?
肯
最佳答案
最好的方法是在您的流程中为每个“逻辑应用程序”创建一个 WindsorContainer
实例,其中您的逻辑应用程序将是一个 WCF 应用程序和一个 Rebus 应用程序。
一般来说,尝试为您的组件配置生活方式以在两个不同的应用程序中工作是一项艰苦的工作,而且通常太难了,这实际上是您在尝试做的事情您有一个容器同时适用于 WCF 和 Rebus。
仔细想想,IoC 容器中生活方式的一切都被配置为匹配一个特定的激活模型,在 WCF 上下文中,它通常会像您一样将实例绑定(bind)到 WCF 操作。 p>
在 Rebus 的上下文中,如果可能的话,短暂的生活方式通常是更可取的,并且一切都会以这种方式进行。
因此,我建议您在进程中托管两个容器,并将每个容器配置为完全独立于另一个容器工作。这也带来了极大的灵 active ,因为将后端处理与服务于网络请求的部分分开将变得微不足道。
如果您的 WCF 应用程序中需要一个 IBus
,您可以只配置一个 one-way client (*) 用于 WCF 容器。
我希望这是有道理的:)
(*) 请注意,文档已更新以反射(reflect) Rebus 2(版本 0.90.0 及更高版本)的 API,但它们与旧 Rebus 非常相似
关于c# - 使用 NHibernate 和 CaSTLe WCF 工具在 WCF 上下文中处理 Rebus 消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32434077/