【问题标题】:Rebus message handling in WCF context with NHibernate & Castle WCF Facility使用 NHibernate 和 Castle WCF Facility 在 WCF 上下文中重新处理消息
【发布时间】:2015-09-07 08:20:48
【问题描述】:

我们托管一些 WCF 服务,我们使用 Castle Windsor 作为 IOC,并使用 WCF 设施来托管服务:

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();

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

【问题讨论】:

    标签: c# wcf nhibernate castle-windsor rebus


    【解决方案1】:

    最好的方法是在您的流程中为每个“逻辑应用程序”创建一个 WindsorContainer 实例,其中您的逻辑应用程序将是一个 WCF 应用程序和一个 Rebus 应用程序。

    一般来说,尝试将组件的生活方式配置为在两个不同的应用程序中工作,这只是一项艰苦的工作,而且通常过于艰巨而没有乐趣,这实际上是你在何时尝试做的事情您可以为 WCF 和 Rebus 使用一个容器。

    仔细想想,IoC 容器中与生活方式有关的一切都被配置为匹配一个特定的激活模型,在 WCF 上下文中,它通常会将实例与 WCF 操作联系起来,就像你所做的那样。 p>

    在 Rebus 的情况下,如果可能的话,短暂的生活方式通常是更可取的,并且一切都会以这种方式进行。

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

    如果您需要在 WCF 应用程序中使用 IBus,您只需为 WCF 容器配置 one-way client(*)。

    我希望这是有道理的:)


    (*) 请注意,文档已更新以反映 Rebus 2(0.90.0 及更高版本)的 API,但它们与旧的 Rebus 非常相似

    【讨论】:

    • 谢谢。这是有道理的。因此,如果我想做一个“每消息会话”模式,其中 ISession 在消息处理的生命周期内可用并自动提交结束,是 BeforeMessage 和 AfterMessage 挂钩进行会话管理吗?将会话存储在 CallContext 上是否安全,或者另一个上下文更好?
    • 实际上有一个 LifestylePerRebusMessage()Windsor 配置扩展正在开发中 - 今晚晚些时候将在 0.98.6 中提供
    • 如果你想在处理 Rebus 消息时安全地存储东西,你应该使用 MessageContext.Current.TransactionContext.Items - 当使用 async/await 时,它将自动跨延续转移到正确的线程跨度>
    • OnCommitOnAbortedOnDisposed MessageContext.Current.TransactionContext 上的“事件”也是您可以连接处理提交/回滚的地方
    • 谢谢,但不幸的是我们现在卡在 0.83 版本上,所以我可以使用MessageContext.GetCurrent().Items 来存储会话吗?
    猜你喜欢
    • 1970-01-01
    • 2011-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多