CQRS и доменные события - PullRequest
       14

CQRS и доменные события

13 голосов
/ 01 октября 2010

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

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

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

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

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

  • Я могу думать о том, чтобы удерживать события, которые будут опубликованы, в списке «в рамках одной и той же области действия» и после того, как фиксация транзакциибыл сохранен и опубликован.Озвучивает ли это что-то, что можно сделать?

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

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

Заранее спасибо,

Март

1 Ответ

10 голосов
/ 18 октября 2010

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

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

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

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

.
...