1

在这里回到我的旧问题:

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

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

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

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


4

2 回答 2

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

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

或者,可以将其作为 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);
    }
}
于 2013-08-28T08:22:08.327 回答
0

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

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

另一种方法是使用 PostSharp。

于 2014-05-05T11:21:59.830 回答