回到我原来的问题here:
但我真的想拦截消息并拥有处理程序的实例,并且能够影响消息是否应该转到处理程序。基本上是“围绕建议”。
现在,实现这种方式的最传统方式是通过目标对象的动态继承和覆盖虚拟方法。由于缺少文档,我无法分辨的是,NServiceBus是否创建或构建其消息处理程序实例。如果它建立起来,那么就无法动态继承,所以大多数AoP框架可能都是不可能的,否则最流行的DI容器应该可以做到。
然而,使用Saga handers测试似乎NServiceBus建立而不是创建新的,因为需要一个默认构造函数,它指向NServiceBus手动激活类。
是的我意识到我可以使用好的'OOP来解决同样的问题,但我通常更喜欢AoP以获得更好(更少)的耦合。
答案 0 :(得分: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>();
}
}
有关详细信息,请参阅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);
}
}
答案 1 :(得分:0)
老帖子,但是有人想找到一种方法来获得使用NServiceBus的AOP,这是一种不同的方式:
https://github.com/MeTitus/NServiceBus/commit/278b6bf4e3daba2fbdfc5295b8718609946d653d
另一种方式是使用PostSharp。