我正在尝试通过使用NServiceBus“包装器”从应用程序包装XML导出来将遗留应用程序与NServiceBus集成,该封装基本上剥离了命名空间并添加了包络和NSB命名空间。
我有基本的解决方案,但前提是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 Serialization属性来控制反序列化行为:
[XmlRoot(ElementName = "PolicyEndorsed", Namespace = "", IsNullable = false)]
public partial class PolicyEndorsedV1
{
...
}
但是这被忽略了,因为NServiceBus使用它自己的序列化器(称为XmlMessageSerializer)而不是.Net自己的XmlSerializer。
所以有谁知道我怎么做到这一点?我认为可以选择将Xml名称与其NSB消息传递对应物分离。
非常感谢
答案 0 :(得分:1)
PolicyEndorsedV1
是否继承自PolicyEndorsed
?
如果是,请使用IHandleMessages<PolicyEndorsed>
,PolicyEndorsedV1Handler
将处理这两种类型的对象。
例如:
public class PolicyEndorsedV1Handler : IHandleMessages<PolicyEndorsed>
{
public void Handle(PolicyEndorsed message)
{
// Handles both PolicyEndorsed and PolicyEndorsedV1 messages
}
}