【问题标题】:AoP support in NServiceBus?NServiceBus 中的 AoP 支持?
【发布时间】:2013-08-28 05:23:26
【问题描述】:

回到我的老问题here

但我真的很想拦截消息并拥有一个处理程序实例,并且能够影响消息是否应该发送到处理程序。基本上是一个“周围的建议”。

现在最传统的实现方式是通过目标对象的动态继承和覆盖虚拟方法。由于缺乏文档,我无法判断 NServiceBus 是否创建或构建其消息处理程序实例。如果它建立起来了,那么它就不能动态继承,所以大多数 AoP 框架可能是不可能的,否则大多数流行的 DI 容器应该可以解决问题。

但是,使用 Saga 处理程序进行测试时,似乎 NServiceBus 是在构建而不是创建新的,因为需要默认构造函数,它指向 NServiceBus 手动激活类。

是的,我意识到我可以使用良好的 ole' OOP 来解决相同的问题,但我通常更喜欢 AoP 以获得更好(更少)的耦合。


【问题讨论】:

  • 我不认为这真的是 NServiceBus 问题。 NServiceBus 在后台使用了一个 IoC 容器(如果您愿意,您可以切换 IoC 实现)并且大多数 IoC 容器将允许您拦截或装饰类型的创建。使用 NServiceBus,您可能想要装饰您的消息处理程序。

标签: c# .net aop nservicebus soa


【解决方案1】:

如果您只想影响消息是否应该发送到处理程序,那么 NServiceBus 提供了一个解决方案 => DoNotContinueDispatchingCurrentMessageToHandlers()

您可以创建一个通用处理程序并将其设置为在任何其他处理程序之前触发。

public class SomeHandler: IHandleMessages<object>, ISpecifyMessageHandlerOrdering
{
    public IBus Bus {get;set;}

    public void Handle(object message)
    {
        Bus.DoNotContinueDispatchingCurrentMessageToHandlers();
    }

    public void SpecifyOrder(Order order)
    {
        order.SpecifyFirst<SomeHandler>();
    }
}

更多详情见this答案

或者,可以将其作为 mutator 插入

class StopThePipelineMutator: IMutateIncomingTransportMessages,INeedInitialization
{
    public IBus Bus { get; set; }

    public void MutateIncoming(TransportMessage transportMessage)
    {
        Bus.DoNotContinueDispatchingCurrentMessageToHandlers();    
    }

    public void Init()
    {
       Configure.Component<StopThePipelineMutator>(DependencyLifecycle.InstancePerCall);
    }
}

【讨论】:

    【解决方案2】:

    旧帖子,但有人正在寻找一种通过 NServiceBus 获得 AOP 的方法,这是一种不同的方法:

    https://github.com/MeTitus/NServiceBus/commit/278b6bf4e3daba2fbdfc5295b8718609946d653d

    另一种方法是使用 PostSharp。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-05
      • 1970-01-01
      • 2016-10-28
      相关资源
      最近更新 更多