私は、基本的に名前空間を取り除いてエンベロープと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のメッセージング相手と切り離すという選択肢があればいいと思う。
多くのおかげで
こんにちはおかげで、しかし、このケースではありません。 PolicyEndorsedの定義はなく、PolicyEndorsedV1の定義のみです。私の質問は、私がレガシーアプリケーションから "Map"をPolicyEndorsedV1メッセージタイプに受け取るXMLをどうやって作るのですか? –
大きな画像は理解できないかもしれませんが、レガシーメッセージ(PolicyEndorsed)を理論的に非レガシーメッセージ(PolicyEndorsedV1)にマップできる場合は、共通のインターフェイスを作成できるはずです。レガシー/非レガシーハンドラメソッドを分離したい場合は、複数の 'IHandleMessages'をハンドラに追加することもできます。 –
これは私にとって便利だったので、これをマークしてください。しかし、XMLを提供しているルートノードをLOBメッセージングの慣習に沿って変更するサードパーティを取得しました。ありがとう –