使用 NHibernate 和 Castle WCF 工具在 WCF 上下文中处理 Rebus 消息
Rebus message handling in WCF context with NHibernate & Castle WCF Facility
我们托管一些 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 并且在接收消息时无法注入到 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();
处理这种情况的最佳方法是什么?
肯
最好的方法是在您的流程中每个 "logical application" 有一个 WindsorContainer
个实例,其中您的逻辑应用程序将是一个 WCF 应用程序和一个 Rebus 应用程序。
总的来说,尝试为您的组件配置生活方式以在两个不同的应用程序中工作,这只是一项艰苦的工作,而且通常太难了,没有乐趣,这实际上是您的当您有一个同时适用于 WCF 和 Rebus 的容器时,请重新尝试执行此操作。
仔细想想,IoC 容器中生活方式的一切都被配置为匹配一个特定的激活模型,在 WCF 上下文中,它通常会将实例与 WCF 操作相关联,如你知道。
在 Rebus 上下文中,如果可能的话,短暂的生活方式通常更可取,这样一切都会正常进行。
因此,我建议您在进程中托管两个容器,并将每个容器配置为完全独立于另一个容器工作。这也带来了很大的灵活性,因为将后端处理与服务于网络请求的部分分开将变得微不足道。
如果您需要在 WCF 应用程序中有一个 IBus
,您只需为 WCF 容器配置一个 one-way client(*)。
我希望这是有道理的:)
(*) 请注意,文档已更新以反映 Rebus 2(版本 0.90.0 及更高版本)的 API,但它们与旧 Rebus 非常相似
我们托管一些 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 并且在接收消息时无法注入到 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();
处理这种情况的最佳方法是什么?
肯
最好的方法是在您的流程中每个 "logical application" 有一个 WindsorContainer
个实例,其中您的逻辑应用程序将是一个 WCF 应用程序和一个 Rebus 应用程序。
总的来说,尝试为您的组件配置生活方式以在两个不同的应用程序中工作,这只是一项艰苦的工作,而且通常太难了,没有乐趣,这实际上是您的当您有一个同时适用于 WCF 和 Rebus 的容器时,请重新尝试执行此操作。
仔细想想,IoC 容器中生活方式的一切都被配置为匹配一个特定的激活模型,在 WCF 上下文中,它通常会将实例与 WCF 操作相关联,如你知道。
在 Rebus 上下文中,如果可能的话,短暂的生活方式通常更可取,这样一切都会正常进行。
因此,我建议您在进程中托管两个容器,并将每个容器配置为完全独立于另一个容器工作。这也带来了很大的灵活性,因为将后端处理与服务于网络请求的部分分开将变得微不足道。
如果您需要在 WCF 应用程序中有一个 IBus
,您只需为 WCF 容器配置一个 one-way client(*)。
我希望这是有道理的:)
(*) 请注意,文档已更新以反映 Rebus 2(版本 0.90.0 及更高版本)的 API,但它们与旧 Rebus 非常相似