сериализация сообщений nservicebus - PullRequest
2 голосов
/ 26 августа 2010

Я хотел бы использовать базовый класс сообщений, например:

[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);
    }
}

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

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

1 Ответ

5 голосов
/ 27 августа 2010

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

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

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

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

...