2017-08-09 7 views
2

新しいNServiceBus 6エンドポイント環境から古いv4エンドポイント環境にイベントを公開する方法を探しています。問題をもっと面白くするために、v6はJSONを使用し、v4はXMLを使用しています。v6 JSONからv4 XML環境へのNServiceBusイベントの公開

  • 私は単に、着信V4エンドポイント上のミューテータを追加する必要がありますか?
  • JSONメッセージをXMLメッセージに変換するにはどうすればよいですか?上記ミューテーターでは?
  • 発信イベントメッセージに特定のv4メッセージヘッダーを追加する必要がありますか。

私は基礎となるトランスポート層としてMSMQを使用しています。

+0

v4はすでに複数のシリアライザをサポートしていますhttps://docs.particular.net/nservicebus/serialization/?version=core_4 v4エンドポイントをJsonに切り替えるのはなぜですか?それとも、そのエンドポイントにXmlで送信する送信者がまだありますか?はいの場合は、v6のJsonに切り替えるために何をしましたか? –

+0

v6とJSONへの切り替えは、システム全体の再設計と部品の交換を一度に1つずつ行うことによって促進されます。 JSONは、これが私たちがRESTエンドポイント、Javaエンドポイントでのコミュニケーションで使用するものであるために選ばれました... –

+0

私は短い時間枠で何かを考え出します。その間、http://www.newtonsoft.com/json/help/html/ConvertingJSONandXML.htmを使用してみましたか? –

答えて

1

潜在的に最も簡単な方法は、カスタムシリアライザ定義を記述することです。次の例では、NServiceBus v6で使用可能なデフォルトのXmlSerializerとJsonSerializerが使用されていることを前提としています。

public class CustomJsonSerializer : SerializationDefinition 
{ 
    public override Func<IMessageMapper, IMessageSerializer> Configure(ReadOnlySettings settings) 
    { 
     var xmlSerializerDefinition = new XmlSerializer(); 
     var xmlSerializerFactory = xmlSerializerDefinition.Configure(settings); 

     var jsonSerializerDefinition = new JsonSerializer(); 
     var jsonSerializerFactory = jsonSerializerDefinition.Configure(settings); 
     return mapper => new DecoratorSerializer(xmlSerializerFactory(mapper), jsonSerializerFactory(mapper)); 
    } 
} 

カスタム・シリアライザの定義を書くには、それらがV4の終点に向けて標的化されている場合のXmlSerializerにメッセージタイプを転送するためのカスタムロジックを持つシリアライザデコレータを書きます。

class DecoratorSerializer : IMessageSerializer 
{ 
    IMessageSerializer xmlSerializer; 
    IMessageSerializer jsonSerializer; 

    public DecoratorSerializer(IMessageSerializer xmlSerializer, IMessageSerializer jsonSerializer) 
    { 
     this.xmlSerializer = xmlSerializer; 
     this.jsonSerializer = jsonSerializer; 
    } 

    public void Serialize(object message, Stream stream) 
    { 
     if (message.GetType() == typeof(MyMessage)) 
     { 
      xmlSerializer.Serialize(message, stream); 
     } 
     else 
     { 
      jsonSerializer.Serialize(message, stream); 
     } 
    } 

    public object[] Deserialize(Stream stream, IList<Type> messageTypes = null) 
    { 
     return jsonSerializer.Deserialize(stream, messageTypes); 
    } 

    public string ContentType 
    { 
     get { return jsonSerializer.ContentType; } 
    } 
} 

this github repoで見つけることができ、次の

endpointConfiguration.UseSerializer<CustomJsonSerializer>(); 

ワーキングサンプルのようなCustomSerializerを使用しています。このサンプルではコマンドを使用していますが、PubSubでもこのアプローチが有効です。唯一の注意点は、特定のメッセージタイプが常に1つのフォーマットを使用することです。したがって、同じイベントをXmlで一度公開したり、Jsonで他の公開することはできません。

+0

それを試してみて、それは魅力のように動作します。 –

関連する問題