使用 NHibernate & Castle WCF 设施在 WCF 上下文中进行 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();

处理这种情况的最佳方法是什么?

最好的方法是在您的进程中为每个"逻辑应用程序"提供一个WindsorContainer实例,其中逻辑应用程序将是一个WCF应用程序和一个Rebus应用程序。

一般来说,尝试配置组件的生活方式以在两个不同的应用程序中工作,这是一项艰苦的工作,而且通常太困难而不是有趣,这实际上是当您在WCF和Rebus中使用单个容器时尝试做的事情。

当您考虑它时,在IoC容器中围绕生活方式的所有内容都被配置为匹配一个特定的激活模型,在WCF上下文中,它通常将实例与WCF操作绑定在一起,就像您所做的那样。

在Rebus上下文中,短暂的生活方式在可能的情况下通常是可取的,并且一切都将按照应有的方式工作。

因此,我建议您在进程中托管两个容器,并将每个容器配置为完全独立于另一个容器。这也带来了很大的灵活性,因为将后端处理与服务web请求的部分分开将变得微不足道。

如果您需要在WCF应用程序中有一个IBus,您可以为WCF容器配置一个单向客户端(*)。

我希望这是有意义的:)


(*)请注意,文档已经更新,以反映Rebus 2的api(版本0.90.0及以上),但他们非常类似于旧的Rebus

相关内容

  • 没有找到相关文章

最新更新