ポリモーフィック パブリッシュ/サブスクライブと同様の方法で、EasyNetQ でポリモーフィック リクエスト/レスポンスを実行できるかどうか疑問に思っていました。
これは、Mike Hadlow の例をCat
s とDog
s (上記のリンクを確認してください)で使用する例ですAnimal
が、インターフェイスではなくクラスです。私は次のようなことをしようとしています:
Animal d = new Dog();
bus.Request<Animal, string>(d);
受信側に次のものがあれば、
bus.Respond<Dog, string>(...);
Animal
の代わりにとして送信されるため、リクエストがレスポンダーによってキャプチャされることはありませんDog
。
ここでのポイントは、リクエストが何を送信しているか ( を送信しているという事実は別としてAnimal
) をあまり気にせず、入力はシステムのさまざまな部分から来るため、事前に正確なタイプを知ることができないということです。さまざまなサブクラスに応答するさまざまなリスナーが存在するため (1 つのリスナーDog
と の別のリスナー)、リクエストCat
をただリッスンすることはできません。に関係なく同じになります。Animal
TResponse
TRequest
ポリモーフィックなパブリッシュ/サブスクライブと同等のことを行う方法はありますか? たとえば、次のようなものです。
bus.Request<string>(d.getType(), d);
よろしくお願いします!
編集:詳細:
現在私のコードベースでは、実行時にしか知らないbus.Publish(msg.GetType(), msg);
インスタンスタイプに基づいてメッセージを正しいリスナーに適切にルーティングするために、(拡張) メソッドを使用しています。これにより、さまざまな種類のメッセージを発行する方法として同じ関数呼び出し (コード フロー分岐なし) を提供することで、 のようmsg
なコードの重複を回避できます。のようにこのメソッドを複数回呼び出すのを避けるために、非ジェネリックメソッドも使用し、 のように使用したかったのです。うまくいけば、これを避けることができます:実行時にジェネリック メソッドを呼び出します。bus.Publish<Dog>(msg)
bus.Publish<Cat>(msg);
bus.Request()
bus.Request(msg.GetType(), string.GetType(), msg)
bus.Request<Dog, string>(msg)
bus.Request<Cat, string>(msg);