1

ポリモーフィック パブリッシュ/サブスクライブと同様の方法で、EasyNetQ でポリモーフィック リクエスト/レスポンスを実行できるかどうか疑問に思っていました。

これは、Mike Hadlow の例をCats とDogs (上記のリンクを確認してください)で使用する例ですAnimalが、インターフェイスではなくクラスです。私は次のようなことをしようとしています:

Animal d = new Dog();
bus.Request<Animal, string>(d);

受信側に次のものがあれば、

bus.Respond<Dog, string>(...);

Animalの代わりにとして送信されるため、リクエストがレスポンダーによってキャプチャされることはありませんDog

ここでのポイントは、リクエストが何を送信しているか ( を送信しているという事実は別としてAnimal) をあまり気にせず、入力はシステムのさまざまな部分から来るため、事前に正確なタイプを知ることができないということです。さまざまなサブクラスに応答するさまざまなリスナーが存在するため (1 つのリスナーDogと の別のリスナー)、リクエストCatをただリッスンすることはできません。に関係なく同じになります。AnimalTResponseTRequest

ポリモーフィックなパブリッシュ/サブスクライブと同等のことを行う方法はありますか? たとえば、次のようなものです。

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);

4

2 に答える 2

1

ルーティングは TRequest と TResponse の組み合わせによるため、リクエスターとレスポンダーの両方で同じであることを確認する必要があります。TRequest、TResponse のサブタイプの組み合わせは、正しくシリアル化する必要があります。

于 2014-12-30T16:19:31.547 に答える
0

dynamic キーワードを使用してみました。コマンドを発行する前に。

  public void MethodName(IAnimal animal)
    {
        dynamic actualObject = animal;
        bus.Publish(actualObject);
    }
于 2015-06-29T13:49:36.830 に答える