2010-05-12 199 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