nservicebus消息序列化

she*_*per 2 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

我错过了什么?

Dav*_*ike 5

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

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

如果从属性声明中删除private关键字,则应该获得预期的行为.

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