NServiceBus中的AoP支持?

Alw*_*wyn 1 .net c# soa aop nservicebus

在这里回到我以前的问题:

但我真的想拦截消息并拥有处理程序的实例,并能够影响消息是否应该转到处理程序.基本上是"围绕建议".

现在,实现这类事物的最传统方式是通过目标对象的动态继承和覆盖虚拟方法.由于缺少文档,我无法分辨的是,NServiceBus是否创建或构建其消息处理程序实例.如果它构建起来,那么它就不能动态继承,所以大多数AoP框架可能都是不可能的,否则最流行的DI容器应该可以做到.

然而,使用Saga handers进行测试似乎NServiceBus建立而不是创建新的,因为需要一个默认构造函数,它指向NServiceBus手动激活类.

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


Chr*_*ski 6

如果您想要做的就是影响消息是否应该发送到处理程序,那么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>();
    }
}
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅答案

或者,这可以作为增变器插入

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

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

    public void Init()
    {
       Configure.Component<StopThePipelineMutator>(DependencyLifecycle.InstancePerCall);
    }
}
Run Code Online (Sandbox Code Playgroud)