2012-03-05 4 views
0

私は、基本的に名前空間を取り除いてエンベロープとNSB名前空間を追加するNServiceBus "ラッパー"で、アプリケーションからXMLエクスポートをラップすることによって、従来のアプリケーションをNServiceBusに統合しようとしています。NServiceBusでデシリアライズを制御できますか?

私は、XMLエクスポートのルート要素がNServiceBusメッセージタイプ名と正確に一致する場合にのみ、基本的な解決策を実行しています。

例えばXMLの場合:

<?xml version="1.0"?> 
<Messages xmlns="http://tempuri.net/MyMessagesNamespace"> 
    <!-- Note: the "V1" --> 
    <PolicyEndorsedV1> 
     ... 
    </PolicyEndorsedV1> 
</Messages> 

はその後、私のハンドラコードは喜んでデシリアライズすることができます:

namespace MyMessagesNamespace 
{ 
    public class PolicyEndorsedV1Handler : IHandleMessages<PolicyEndorsedV1> 
    { 
     public void Handle(PolicyEndorsedV1 message) 
     { 
      // All work fine! 
      ... 
     } 
    } 
} 

しかし、輸出のXMLがある場合

<?xml version="1.0"?> 
<Messages xmlns="http://tempuri.net/MyMessagesNamespace"> 
    <!-- Note: the "V1" has been removed --> 
    <PolicyEndorsed> 
     ... 
    </PolicyEndorsed> 
</Messages> 

これはしませんデシリアル化される。 NServiceBusは私にを通知しますSystem.TypeLoadException: 'Beazley.Messages.Risks.Events.PolicyEndorsed'を処理できませんでした。唯一の情報は着信XMLのルートノードの名前です。

私は、.NETシリアル化が私のメッセージ定義に属性のいくつかを追加することにより、直列化復元の動作を制御することを試みた:

[XmlRoot(ElementName = "PolicyEndorsed", Namespace = "", IsNullable = false)] 
public partial class PolicyEndorsedV1 
{ 
    ... 
} 

をしかしNServiceBusは(XmlMessageSerializerと呼ばれる)それ自身のシリアライザを使用していないので、これは無視されます。 Net独自のXmlSerializer。

私はこれをどのように行うことができるのか誰にも分かりますか? Xmlの名前をNSBのメッセージング相手と切り離すという選択肢があればいいと思う。

多くのおかげで

答えて

1

PolicyEndorsedV1PolicyEndorsedから継承していますか?

の場合は、IHandleMessages<PolicyEndorsed>を使用し、PolicyEndorsedV1Handlerは両方のタイプのオブジェクトを処理します。例えば

:あなたの答えのための

public class PolicyEndorsedV1Handler : IHandleMessages<PolicyEndorsed> 
{ 
    public void Handle(PolicyEndorsed message) 
    { 
     // Handles both PolicyEndorsed and PolicyEndorsedV1 messages 
    } 
} 
+0

こんにちはおかげで、しかし、このケースではありません。 PolicyEndorsedの定義はなく、PolicyEndorsedV1の定義のみです。私の質問は、私がレガシーアプリケーションから "Map"をPolicyEndorsedV1メッセージタイプに受け取るXMLをどうやって作るのですか? –

+0

大きな画像は理解できないかもしれませんが、レガシーメッセージ(PolicyEndorsed)を理論的に非レガシーメッセージ(PolicyEndorsedV1)にマップできる場合は、共通のインターフェイスを作成できるはずです。レガシー/非レガシーハンドラメソッドを分離したい場合は、複数の 'IHandleMessages'をハンドラに追加することもできます。 –

+0

これは私にとって便利だったので、これをマークしてください。しかし、XMLを提供しているルートノードをLOBメッセージングの慣習に沿って変更するサードパーティを取得しました。ありがとう –

関連する問題