我想通過包裝NServiceBus的應用程序與NServiceBus「包裝」基本上剝離命名空間並添加信封和NSB名稱空間從應用程序的XML導出集成遺留應用程序。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。我的問題是關於如何使我從傳統應用程序「映射」到PolicyEndorsedV1消息類型的XML所接收到的XML? – 2012-03-06 08:08:54
我可能不瞭解大局,但在我看來,如果傳統消息(PolicyEndorsed)理論上可以映射到非傳統消息(PolicyEndorsedV1),那麼您應該能夠創建一個通用接口。如果您想要分開遺留/非遺留處理程序方法,還可以將多個「IHandleMessages」添加到您的處理程序。 – 2012-03-07 01:58:20
標記此答案是因爲它對我有用。但是,我最終得到了提供XML的第三方來更改根節點,使其符合我們的LOB消息傳遞約定。謝謝 – 2012-03-21 09:32:40