2012-03-05 53 views
0

我想通過包裝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消息傳遞對象解耦是很好的。

非常感謝

回答

1

是否從PolicyEndorsedPolicyEndorsedV1繼承?

如果是這樣,使用IHandleMessages<PolicyEndorsed>PolicyEndorsedV1Handler將處理這兩種類型的對象。

例如:

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

感謝你的答案你好,然而,這並非如此。 PolicyEndorsed沒有定義,只適用於PolicyEndorsedV1。我的問題是關於如何使我從傳統應用程序「映射」到PolicyEndorsedV1消息類型的XML所接收到的XML? – 2012-03-06 08:08:54

+0

我可能不瞭解大局,但在我看來,如果傳統消息(PolicyEndorsed)理論上可以映射到非傳統消息(PolicyEndorsedV1),那麼您應該能夠創建一個通用接口。如果您想要分開遺留/非遺留處理程序方法,還可以將多個「IHandleMessages」添加到您的處理程序。 – 2012-03-07 01:58:20

+0

標記此答案是因爲它對我有用。但是,我最終得到了提供XML的第三方來更改根節點,使其符合我們的LOB消息傳遞約定。謝謝 – 2012-03-21 09:32:40

相關問題