1

我想知道我是否可以在 EasyNetQ 中以类似于多态发布订阅的方式进行多态请求响应

这是一个使用 Mike Hadlow 的示例和Cats 和Dogs 的示例(查看上面的链接),但使用Animal的是类而不是接口。我正在尝试做类似的事情:

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

如果在接收端我有以下内容,

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

请求永远不会被响应者捕获,因为它是作为Animal而不是Dog.

这里的要点是请求并不真正关心它发送的内容(除了它发送的事实Animal)并且输入来自系统的不同部分,因此我无法提前知道确切的类型。将有不同的侦听器来响应不同的子类(一个侦听器为Dog,另一个为Cat),所以我不能只听Animal请求。TResponse不管TRequest.

有没有办法做一些相当于多态发布-订阅的事情?例如,类似:

bus.Request<string>(d.getType(), d);

提前非常感谢!

编辑:更多信息:

目前在我的代码库中,我使用 (extension) 方法,以便根据我仅在运行时知道bus.Publish(msg.GetType(), msg);的实例类型将消息正确路由到正确的侦听器。msg这允许我通过提供相同的函数调用(无代码流分支)作为发布不同类型消息的方式来避免代码bus.Publish<Dog>(msg)重复bus.Publish<Cat>(msg);。我也想使用非泛型bus.Request()方法,并像 一样使用它,以避免像 in一样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

尝试使用动态关键字;在发布命令之前。

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