События CQRS и домена

CQRS включил меня в режим мышления. Я пытаюсь начать новый проект с идеями CQRS. Главное, что мне нравится, - 1) разделение запросов и команды. Проблемы с доменом были проблемой.
2) Использование хранилища событий для аудита - я не буду использовать его для воспроизведения - по крайней мере, не сейчас.

Я хорошо разбираюсь в стороне запроса, и у меня все еще есть некоторые вопросы о событиях домена

Если команда приводит к обновлению корней многоагрегатов (пример заказа и OrderDetail), я буду иметь их в рамках UnitofWork (транзакционный). Теперь каждый домен отвечает за публикацию событий, когда изменение происходит в его состоянии.

скажем, команда изменяет 3 записи OrderDetail. Каждый OrderDetail опубликует 2 события. В итоге мы имеем 6 событий.

a) Если я публикую события, как только я внес изменения в объект домена (но не совершил транзакцию), как я могу отменить опубликованные события (и, возможно, они были использованы подписчиками)

  • Я могу представить, что события должны быть опубликованы в списке "под одной и той же единицей объема работ" и после того, как был вызван committ на транзакции, сохраните его и опубликуйте. Звучит ли это что-то, что можно было бы сделать.

b) Если изменения в OrderDetail требуют, чтобы некоторые изменения также имели место в Order Aggregate Root, то
  i) Должен ли я основывать эти изменения, обрабатывая события, опубликованные с помощью OrderDetail Aggregate? Напр. скажем, две детали заказа были удалены. Это делает статус заказа от "предпочтительного" до "Не предпочтительным".   ii) Что делать, если ошибки события и не обновляют состояние заказа. Если заказ остается предпочтительным, он отправляется через 2 дня.

Добавление другого вопроса
c) Являются ли "события домена источником всех изменений состояния приложения" или являются ли они "результатом всех изменений состояния приложения"

Спасибо, Advance,

The Mar

Ответы

Ответ 1

a) вы не должны публиковать события до совершения транзакции, событие, представляющее собой событие, которое произошло, и, следовательно, причина, по которой все они названы в период прохождения (например, OrderClearedEvent). Также в случае, если вам нужно "вернуть" событие, вы должны предпринять корректирующие действия, то есть не удалять событие, вы должны инициировать новое событие, которое исправляет эффекты события, которое вы хотите вернуть

b) кажется, что это больше проблема в том, как вы моделируете сущности и команды, которые что-либо еще. Я не могу думать о причине, почему OrderDetail будет AggregateRoot, но я не знаю вашего домена...

c) Команды приведут к публикации хотя бы одного события

Надеюсь, что это поможет:) Как сказал Ринат, группа google - это лучшее место для вопросов, а также посмотрите на cqrsinfo.com и пример кода из github.com/MarkNijhof/Fohjin и github.com/gregoryyoung/г-н