我想知道我是否可以在EasyNetQ中进行多态请求 - 响应,方式类似于polymorphic publish-subscribe
以下示例使用了Mike Hadlow的示例Cat
和Dog
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。
答案 0 :(得分:1)
路由是TRequest,TResponse的组合,因此您必须确保它们在请求者和响应者上是相同的。 TRequest,TResponse的任何子类型组合都应该正确序列化。
答案 1 :(得分:0)
尝试使用dynamic关键字;在发布命令之前。
public void MethodName(IAnimal animal)
{
dynamic actualObject = animal;
bus.Publish(actualObject);
}