Я перехожу от чистой парадигмы DDD к CQRS. Моя текущая проблема связана с Event Sourcing и, в частности, с организацией Event Store. Я прочитал тонны постов в блогах, но все еще не могу понять некоторые вещи. Так что поправьте меня, если я ошибаюсь.
Каждое событие в основном состоит из:
- Дата / время события
- тип события (из этого мы также можем определить тип AggregateRoot)
- AggregateRoot id (Guid)
- версия AggregateRoot (для поддержания порядка обновлений)
- Данные о событиях (некоторый сериализованный класс с данными, необходимыми для обновления)
Теперь, если мои данные Event состоят из простых типов значений (целые числа, строки, перечисления и т. Д.), Тогда это легко. Но что, если я должен передать другой AggregateRoot? Я не могу сериализовать весь AR как часть данных событий (подумайте обо всех данных и отложенной загрузке), в основном мне нужно только хранить Id этого AR. Но затем, когда мне нужно применить это событие, мне нужно сначала получить этот AR из базы данных. И это неправильно из моей доменной модели (вызов репозиториев и работа с идентификаторами AR).
Какой лучший подход для этого?
p.s. Для конкретного примера, давайте предположим, что есть Модель, которая состоит из сущностей Task и User (оба AR). Задача провести ссылку на ответственного пользователя. Но ответственный пользователь может быть изменен.
Обновление: Я думаю, что нашел источник своего замешательства. Я считаю, что источник событий должен использоваться только для построения модели чтения. И в этом случае передача идентификаторов и необработанных данных в порядке. Но те же события используются на самих агрегатах. И это я не могу понять.