Как получить исторические события после изменений в структуре событий домена - PullRequest
5 голосов
/ 07 февраля 2012

Данное хранилище событий с полями:

  • AggregateId: целое число
  • Полезная нагрузка: blob
  • Версия: целое число

Содержитсобытия на основе:

public class OrderLineAdded
{
    int Id;
    short Quantity;
}

... и затем к ним добавляются дополнительные события с обновленной структурой:

public class OrderLineAdded
{
    int ProductId; // field name has changed
    int Quantity; // field datatype has changed
}

Когда эти исторические данные извлекаются (для анализа и т. д.), какВы реконструируете двоичную полезную нагрузку в значимые данные?

Примечание: приведенный выше код не является примером хорошей реализации хранилища событий / событий.Я просто хочу знать, как этот сценарий должен быть обработан.

Ответы [ 2 ]

3 голосов
/ 07 февраля 2012

Ринат Абдуллин излагает некоторые стратегии управления версиями событий в домене, которые вы можете найти полезными для чтения.

https://abdullin.com/post/event-sourcing-versioning/

Он предлагает два возможных подхода:

  1. Используйте сериализатор, который может автоматически справиться с переименованием свойств в вашем событии, например, Google ProtoBuf Serializer.
  2. Реализация следующего интерфейса для самостоятельного обновления событий в памяти.
public interface IUpgradeDomainEvents
{
    IEnumerable<IDomainEvent> Upgrade(IDomainEvent e, string id);
}
1 голос
/ 07 февраля 2012

Единственный метод обратной совместимости, который я видел, это версия каждого изменения вашего события.Некоторые люди создают новые версии в другом пространстве имен, так что пространство имен отражает информацию о версии / функции:

namespace Foo.ProjectA.Release1
{
  public interface ISomeEvent {...}
}

namespace Foo.ProjectA.Release3
{
  public interface ISomeEvent {...}
}

В качестве альтернативы, создайте новую версию класса с информацией о версии / функции в имени класса:

namespace Foo.ProjectA
{
  public interface ISomeEvent {...}
  public interface ISomeEvent_MoreRefinedVersion {...}
}

Лично я предпочитаю первый подход, , если новая версия не добавляет более конкретное семантическое значение событию.

...