3

コンテキスト設定については、nServiceBusクライアントとnSerivceBusサーバーの間でメッセージを交換しています。それは名前空間xyz.Messagesであり、クラスはMessage:IMessageです。

xyz.Messages.Domain1、xyz.Messages.Domain2、xyz.Messages.Domain3など、他のdllにあるメッセージが他にもあります。そして、その基本メッセージであるメッセージから派生するメッセージ。

エンドポイントは次のように定義されています:

 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などのタイプに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

4

2 に答える 2

3

NServiceBus XmlSerializer はこれをサポートしていません。http://tech.groups.yahoo.com/group/nservicebus/message/6549のスレッドを参照してください。

BinarySerializer が機能するか、カスタム メッセージ シリアライザーを実装できます。私の意見では、DataContractSerializer は、XmlSerializer が処理しないシリアライゼーション シナリオのためにすぐに利用できるはずです。

これを行うと、おそらく NSB メッセージのバージョン管理サポートが失われることに注意してください。これが重要な場合は、メッセージの設計を再考することをお勧めします。

于 2010-05-20T00:45:47.877 に答える
3

ウディの返事はこちら

まず第一に、サーバーの構成にクライアント キューが表示されることは非常にまれです。それを取り除くことをお勧めします。

第二に、手動でバスを初期化しているので、汎用ホストを使用していないと思います-それは問題ありません。確認したかっただけです。また、クライアント側とサーバー側の両方の初期化に同じコードを使用していますか? それは特にお勧めしません。少なくとも、サーバー側はトランザクション対応である必要があります (冪等のメッセージング ルートを使用する場合を除きます)。

第三に、Binary Serializer を使用すれば、あなたがしようとしていることは問題なく動作するはずです。その理由は、結合がより密であり、明示的なメッセージ コントラクトの必要性が少ないと想定されているためです。一方、XML シリアライザーは、より明示的なメッセージ スキーマを適用するように構築されているため、これらの種類の派生型はサポートされていません。

メッセージで派生型を使用する可能性があるシナリオ (クエリ、直接的なデータ操作など) は、通常、最初からメッセージングを使用すべきではない領域です。

何らかの形で役立つことを願っています。

-- ウディ・ダハン

于 2010-06-17T13:19:53.150 に答える