我想通过包装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