2012-03-05 65 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

相关问题