2010-05-12 6 views
3

pour le paramètre de contexte, j'échange des messages entre mon client nServiceBus et le serveur nSerivceBus. c'est l'espace de noms xyz.Messages et et une classe, Message: IMessageProblème de sérialisation Nservicebus des types dérivés

J'ai plus de messages qui sont dans les autres dll, comme xyz.Messages.Domain1, xyz.Messages.Domain2, xyz.Messages.Domain3. et les messages qui dérivent de ce message de base, Message.

Je les points de terminaison définis comme comme:

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> 

au serveur

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

et le bus initialisées

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

maintenant lorsque je tente d'envoyer par exemple de type de message ou tout type de type dérivé de Message, il envoie avec succès le message et au serveur, je reçois le pro par type.

par ex.

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 

Mon problème se pose lorsque tout type, par exemple MessageDerived1, contient une variable membre de type message, et quand je l'attribuer à un type dérivé, le type est correctement transféré sur le fil. Il ne transfère que le type de message, pas le type dérivé.

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) 

toute aide est fortement appréciée.

Merci TJ

Répondre

3

Le NServiceBus XmlSerializer ne supporte pas - voir le fil à http://tech.groups.yahoo.com/group/nservicebus/message/6549

BinarySerializer fonctionnera, ou vous pouvez mettre en œuvre un message personnalisé. Sérialiseur À mon avis, DataContractSerializer devrait être disponible dès la sortie de la boîte pour les scénarios de sérialisation que XmlSerializer ne gère pas. Notez qu'en faisant cela, vous perdrez probablement le support de gestion des versions NSB - si cela vous intéresse, je vous suggérerais de repenser la conception de votre message.

3

Voici la réponse

d'abord Udi tout, il est très rare d'avoir les files d'attente des clients apparaissent dans la configuration du serveur. Je recommande de supprimer cela. Deuxièmement, je suppose que vous n'utilisez pas l'hôte générique car vous initialisez manuellement le bus - c'est bien, je voulais juste vérifier. En outre, utilisez-vous le même code pour l'initialisation côté client et côté serveur? Ce n'est pas particulièrement recommandé. À tout le moins, le côté serveur doit être transactionnel (sauf si vous utilisez une route de messagerie idempotente). Troisièmement, ce que vous essayez de faire devrait fonctionner correctement si vous utilisez le Sérialiseur binaire. La raison en est l'hypothèse d'un couplage plus serré et moins d'un besoin de contrats de messages explicites. Le XML Serializer, d'autre part, est construit pour appliquer un schéma de message plus explicite - ne supportant donc pas ce genre de types dérivés.Les scénarios dans lesquels vous pouvez utiliser des types dérivés dans vos messages (requêtes, manipulation directe des données, etc.) sont généralement les domaines dans lesquels vous ne devriez pas utiliser la messagerie pour commencer.

Espérons que cela aide d'une manière ou d'une autre.

- Udi Dahan

Questions connexes