2010-05-12 124 views
3

用于上下文设置,我在nServiceBus客户端和nSerivceBus服务器之间交换消息。它是命名空间xyz.Messages和和类,消息:IMessageNservicebus派生类型的派生类型问题

我有更多的邮件在其他dll中,如xyz.Messages.Domain1,xyz.Messages.Domain2,xyz.Messages.Domain3。 和派生的消息形成该基本消息,消息。

我定义为像端点:

at client 
<UnicastBusConfig> 
<MessageEndpointMappings> 
    <add Messages="xyz.Messages" Endpoint="xyzServerQueue" /> 
    <add Messages="xyz.Messages.Domain1" Endpoint="xyzServerQueue" /> 
    <add Messages="xyz.Messages.Domain2" Endpoint="xyzServerQueue" /> 
    </MessageEndpointMappings> 
</UnicastBusConfig> 

在服务器

<UnicastBusConfig> 
<MessageEndpointMappings> 
    <add Messages="xyz.Messages" Endpoint="xyzClientQueue" /> 
    <add Messages="xyz.Messages.Domain1" Endpoint="xyzClientQueue" /> 
    <add Messages="xyz.Messages.Domain2" Endpoint="xyzClientQueue" /> 
</MessageEndpointMappings> 
</UnicastBusConfig> 

和或总线初始化为

 IBus serviceBus = Configure.With() 
      .SpringBuilder() 
      .XmlSerializer() 
      .MsmqTransport() 
      .UnicastBus() 
      .LoadMessageHandlers() 
      .CreateBus() 
      .Start(); 

现在,当我尝试发送消息类型的实例任何类型的派生类型的消息,它成功地发送消息在服务器上,我得到了亲每种类型。

例如。

Message message= new Message(); 
Bus.Send(message); // works fine, transfers Message type 
message = new MessageDerived1(); 
Bus.Send(message); // works fine, transfers MessageDerived1 type 
message = new MessageDerived2(); 
Bus.Send(message); // works fine, transfers MessageDerived2 type 

我的问题出现时的任何类型的,说MessageDerived1,包含类型的消息的成员变量,并且当我将其分配给一个派生类型,类型未正确通过线路传输。它只作为消息类型传递,而不是派生类型。

public class MessageDerived2 : Message 
{ 
    public Message message; 
} 

MessageDerived2 messageDerived2= new MessageDerived2(); 
messageDerived2.message = new MessageDerived1(); 
message = messageDerived2; 
Bus.Send(message); // incorrect behaviour, transfers MessageDerived2 correctly, but looses type of MessageDerived2.Message (it deserializes as Message type, instead of MessageDerived1) 

任何帮助,强烈赞赏。

感谢 TJ

回答

3

的NServiceBus XmlSerializer的不支持这一点 - 看到线程http://tech.groups.yahoo.com/group/nservicebus/message/6549

BinarySerializer会工作,也可以实现自定义消息串行器。在我看来,DataContractSerializer应该可用于XmlSerializer无法处理的序列化场景。

请注意,通过这样做,您可能会失去NSB消息版本控制支持 - 如果这对您很重要,我建议您重新考虑您的消息设计。

3

这里是乌迪的答复

首先,这是极不寻常的有客户队列出现在服务器的配置。我建议删除它。

其次,我假设你没有使用通用主机,因为你正在手动初始化总线 - 这很好,只是想检查。 另外,你是否使用相同的代码进行客户端和服务器端的初始化?这不是特别推荐。 至少,服务器端应该是事务性的(除非你正在关注一些幂等消息路由)。

第三,如果您使用二进制序列化程序,您要做的工作应该很好。原因是假设更紧密的耦合和更少的需要明确的消息合约。另一方面,XML序列化程序的构建是为了实施更加明确的消息模式 - 因此不支持这些类型的派生类型。

您可能想要在消息中使用派生类型(查询,直接数据操作等)的场景通常是您不应该使用消息传递开始的地方。

希望能以某种方式提供帮助。

- Udi Dahan