1

ここで私の古い質問に戻ります:

しかし、私は本当にメッセージをインターセプトし、ハンドラーのインスタンスを持ち、メッセージがハンドラーに送られるべきかどうかに影響を与えたいと思っています。基本的には「周りのアドバイス」。

現在、このようなものを実装する最も伝統的な方法は、ターゲット オブジェクトの動的継承と仮想メソッドのオーバーライドによるものです。ドキュメントが不足しているため、NServiceBus がメッセージ ハンドラー インスタンスを作成または構築するかどうかはわかりませんでした。構築された場合、動的に継承できないため、ほとんどの AoP フレームワークはおそらく問題外です。それ以外の場合は、最も人気のある DI コンテナーでうまくいくはずです。

ただし、Saga ハンドラーでテストすると、NServiceBus がクラスを手動でアクティブ化することを指すデフォルト コンストラクターの要件により、NServiceBus が新規作成ではなく構築されているように見えます。

はい、私は同じ問題を解決するために古き良き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>();
    }
}

詳細については、この回答を参照してください

または、これをミューテーターとしてプラグインすることもできます

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

もう 1 つの方法は、PostSharp を使用することです。

于 2014-05-05T11:21:59.830 に答える