EasyNetQ中的多态请求 - 响应

时间:2014-12-23 11:24:21

标签: c# rabbitmq easynetq

我想知道我是否可以在EasyNetQ中进行多态请求 - 响应,方式类似于polymorphic publish-subscribe

以下示例使用了Mike Hadlow的示例CatDog s(请查看上面的链接),但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);

提前多多感谢!

编辑:更多信息:

目前在我的代码库中我使用(扩展)方法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);。希望我能避免这样做:calling generic method at runtime

2 个答案:

答案 0 :(得分:1)

路由是TRequest,TResponse的组合,因此您必须确保它们在请求者和响应者上是相同的。 TRequest,TResponse的任何子类型组合都应该正确序列化。

答案 1 :(得分:0)

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

  public void MethodName(IAnimal animal)
    {
        dynamic actualObject = animal;
        bus.Publish(actualObject);
    }