сериализация сообщений 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);
    }
}

Новые сообщения будут создаваться путем подкласса этого базового класса. Вот такую ​​проблему я наблюдал. Когда я публикую сообщение, я вижу, что идентификатор сообщения и дата-время отличаются при его обработке.

Что мне не хватает?


person kind_robot    schedule 26.08.2010    source источник


Ответы (1)


Я знаю, что вы хотите объявить MessageID и UtcDateTime с помощью частных сеттеров, чтобы кто-то в дальнейшем не мог их изменить, но при этом вы предотвращаете повторное применение сериализатором этих значений при восстановлении сообщения в получателе.

Происходит следующее: сериализатор создает экземпляр нового экземпляра вашего типа сообщения, а ваши два свойства инициализируются как UtcNow и NewGuid(), а затем не переопределяются из сообщения. Вот почему они выглядят по-разному.

Если вы удалите ключевое слово private из объявления свойства, вы должны получить ожидаемое поведение.

Однако вместо создания собственных механизмов отслеживания, подобных этому, вам следует как минимум (при условии, что вы внедрили IBus в свой обработчик) взглянуть на Bus.CurrentMessageContext, который содержит свойство «Id» для обрабатываемого сообщения (строка, не Guid) и коллекцию заголовков. Я не уверен на 100%, но если вы проверите заголовки, возможно, там есть какое-то указание на исходное время отправки.

person David Boike    schedule 26.08.2010
comment
Спасибо, Дэвид, твой ответ точен. - person kind_robot; 27.08.2010