2012-01-27 9 views
1

NServiceBusにIHandleMessages <ハンドラをNServiceBusと強く結びついていない独自のバージョンのインターフェイスに置き換える方法はありますか?NServiceBusカスタムメッセージハンドラのタイプ

イベント/コマンドマーカーインターフェイス(Via NServiceBus 3控えめな構文)を置き換える方法を見つけましたが、実際のハンドラではこれを行う方法はありません。私はハンドラとNServiceBusの間の結合を取り除くためにこれをしようとしています。

答えて

1

これは、NServiceBusでは不可能と思われます。

私がこれをできるだけ控えめに作ったのは、自分のバスにメッセージを転送するためにNServiceBusプロキシを作成することでした。これは、NServiceBusの参照を私のプロジェクトのほとんどから守っていました。

1

NServiceBus 3.0 Unobtrusive Mode(Andreas Ohlund's article on thisを参照)の理由は、異なるエンドポイントで異なるバージョンのNServiceBusを実行していると、複数のサービス間で共有されるイベント定義が問題になることがあります。依存関係は一致しません。

この引数は、メッセージハンドラ(IHandleMessagesを実装するクラス)自身で水を保持しません。ハンドラの共有はありません。メッセージハンドラは定義によりNServiceBusに結合されています。

+0

ご回答ありがとうございます。私はあなたの議論を理解している、私はこれが私のアプリケーションの内部coneceptは私がメッセージを介して通信しているということですが、私はこれが欲しい理由だと思う。私にとって、NServiceBusは単にトランスポートの実装です。私は本当に、アプリケーション・コンテキストでメッセージ・バスが何であるか、メッセージ・ハンドラがどのように見えるか、より一般的な概念を持つことができるようにしたいと考えています。私はおそらくトップを横切ってシムを構築することでこれを行うことができますが、これを行うためのツーリングがそれを使用して行うことを好むならば。 NServiceBusでこれを行うには何も言いませんか? –

0

は、私はそれが可能に少しのコードが必要で見つかりました

1)IHandleMessages<TMessage>を実装するジェネリッククラスを作成し、それを見つけるか(カスタムハンドラの正しいインスタンスを作成することhandleメソッドを実装DIコンテナ、静的レジストリなどから)。この例では、任意のメッセージタイプを受け入れるvoid HandleMessageMyWay(object message)方法でMyCustomHandlerクラスを持っていることを前提としています

public class MessageHandlerAdapter<TMessage> 
    : IHandleMessages<TMessage> 
{ 
    public void Handle(TMessage message) 
    { 
     new MyCustomHandler().HandleMessageMyWay(message); 
    } 
} 

これはオープンジェネリックですので、あなたは(クローズジェネリックを必要とするのでNServiceBusは、有効なハンドラとしてそれを検出しませんTMessageは、具体的な型のハンドラとしてNServiceBusに認識されるMyMessage1のような具体的な型です)。

2)ISpecifyMessageHandlerOrderingを実装します。その中でSpecifyOrder方法メイク(実行時に)あなたがサポートする各メッセージタイプのクローズジェネリックアダプタタイプです:

public class MessageHandlerAdapterLister : ISpecifyMessageHandlerOrdering 
{ 
    public void SpecifyOrder(Order order) 
    { 
     //You would normally iterate through your message types (over DI registry or some other registry of messages): 
     var adapterType1 = typeof(MessageHandlerAdapter<>).MakeGenericType(typeof(MyMessage1)); 
     var adapterType2 = typeof(MessageHandlerAdapter<>).MakeGenericType(typeof(MyMessage2)); 

     order.Specify(new[] { adapterType1, adapterType2 }); 
    } 
} 

ISpecifyMessageHandlerOrderingインスタンスが自動的にNServiceBusによって発見されています。これらは通常、NServiceBusによって検出されたハンドラタイプの順序を指定するために使用されます。検出されなかったタイプ(実行時に作成されたクローズされた汎用アダプタタイプなど)を指定すると、明らかにレジストリに追加されます。

それだけで十分です。 NServiceBusは、MyMessage1MyMessage2をオープン汎用のIHandleMessages<TMessage>でルーティングし、カスタムクラスに処理を委任します。