2010-05-12 3 views
3

для настройки контекста, я обмениваюсь сообщениями между моим клиентом nServiceBus и сервером nSerivceBus. это пространство имен xyz.Messages и класс, Сообщение: IMessageПроблема сериализации Nservicebus производных типов

У меня есть больше сообщений, которые находятся в других dll, например xyz.Messages.Domain1, xyz.Messages.Domain2, xyz.Messages.Domain3. и сообщения, которые формируют это базовое сообщение, Message.

У меня есть конечные точки, определенные как, как:

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, он успешно отправляет сообщение поверх и на сервере, я получаю pro по типу.

например.

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, содержит переменную-член типа Message, и когда я назначить его производный тип, тип не правильно передается по проводам. Он передается только как тип сообщения, а не производный тип.

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 будет работать, или вы можете реализовать пользовательское сообщение serialiser. На мой взгляд, DataContractSerializer должен быть доступен из коробки для сценариев сериализации, которые XmlSerializer не обрабатывает.

Обратите внимание, что при этом вы, вероятно, потеряете поддержку поддержки версий сообщений NSB - если это важно для вас, я предлагаю переосмыслить ваш дизайн сообщений.

3

Вот ответ UDI в

Прежде всего, это очень необычно иметь очереди клиентов появляются в конфигурации сервера. Я бы рекомендовал удалить это.

Во-вторых, я предполагаю, что вы не используете общий хост, поскольку вы вручную инициализируете шину - это нормально, просто нужно проверить. Кроме того, используете ли вы тот же код для инициализации на стороне клиента и на сервере? Это не особенно рекомендуется. По крайней мере, серверная сторона должна быть транзакционной (если вы не опускаете какой-то маршрут idempotent messaging).

В-третьих, то, что вы пытаетесь сделать, должно работать нормально, если вы используете двоичный сериализатор. Причиной является предположение о более жесткой связи и меньшая потребность в явных контрактах сообщений. С другой стороны, XML-сериализатор построен для обеспечения более явной схемы сообщений, поэтому не поддерживает эти типы производных типов.

Сценарии, в которых вы можете использовать производные типы в своих сообщениях (запросы, прямое манипулирование данными и т. Д.), Обычно являются областями, в которых вы не должны использовать обмен сообщениями для начала.

Надеюсь, что это поможет в некотором роде.

- Udi Dahan

Смежные вопросы