2013-08-28 45 views
1

領帶回到我的老問題hereNServiceBus中的AoP支持?

但我真的想攔截的消息,並有處理程序的實例,並能夠影響消息是否應該去處理的。基本上是一個「圍繞建議」。

現在最類似實現的傳統方式是通過目標對象的動態繼承和重寫虛擬方法。由於缺乏文檔,NServiceBus是否創建或建立其消息處理程序實例,這是我無法說明的。如果它建立起來,那麼它就不能動態繼承,所以大多數AoP框架可能是不可能的,否則大多數流行的DI容器都應該做到這一點。

但是使用Saga handers進行測試,似乎NServiceBus建立起來而不是創建新的,因爲需要默認的構造函數,它指向NServiceBus手動激活類。

是的我意識到我可以使用優秀的OOP來解決同樣的問題,但我通常更喜歡AoP以獲得更好(更少)的耦合。


+0

我不認爲這真的是一個NServiceBus問題。 NServiceBus使用封面下的IoC容器(如果你喜歡,你可以切換IoC實現),大多數IoC容器將允許你截取或修飾類型的創建。使用NServiceBus,你可能想要裝飾你的消息處理程序。 – Steven

回答

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答案

或者,這可以被插入的突變

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

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

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