nservicebus消息序列化

时间:2010-08-26 19:50:23

标签: serialization nservicebus

我想使用基本的消息类,如:

[Serializable]
public abstract class MessageBase : IMessage
{
    public Guid MessageID { get; private set; }
    public DateTime UtcDateTime { get; private set; }

    protected MessageBase()
    {
        UtcDateTime = DateTime.UtcNow;
        MessageID = Guid.NewGuid();
    }

    public override string ToString()
    {
        return string.Format("{0} MessageID={1}, UtcDate={2}", GetType().FullName, MessageID, UtcDateTime);
    }
}

将通过从此基类继承来创建新消息。这是我观察到的问题。当我发布消息时,我发现消息id和datetime在处理时是不同的。

我错过了什么?

1 个答案:

答案 0 :(得分:5)

我知道您要使用私有设置器声明MessageID和UtcDateTime,以便线下的某个人无法更改它,但这样做可以防止序列化程序在接收器重建消息时重新应用这些值

正在发生的事情是,序列化程序实例化了您的消息类型的新实例,并且您的两个属性被初始化为UtcNow和NewGuid(),然后不会从消息中重写。这就是它们看起来不同的原因。

如果从属性声明中删除private关键字,则应该得到您期望的行为。

但是,不应该像这样烘焙自己的跟踪机制,至少应该(假设你已经将IBus注入到处理程序中)看一下Bus.CurrentMessageContext,它包含正在处理的消息的“Id”属性(字符串,而不是Guid)和Headers集合。我不是100%肯定,但如果你检查标题,可能会有一些原始发送时间的指示。