2010-08-26 94 views
2

我想用一个基本邮件类,如: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和日期时间在处理时不同。

我错过了什么?

回答

5

我知道你想用private setters声明MessageID和UtcDateTime,这样下线的人就不能改变它,但是这样做时,你可以防止序列化器在消息重建时重新应用这些值接收器。

发生了什么是序列化器实例化消息类型的新实例,并且您的两个属性被初始化为UtcNow和NewGuid(),然后不会从消息中重写。这就是它们显得不同的原因。

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

+0

谢谢大卫,你的答案是现货。 – 2010-08-26 21:28:48