При использовании DDD и CRQS должно быть ровно одно событие на команду?

17

Я ищу способ разработки приложения DDD с соглашением по конфигурации.

Скажем, агрегат «Клиент» имеет команду, определенную как «FillProfile». Это будет логически вызывать событие «ProfileFilled».

Существуют ли случаи, когда команда будет вызывать больше, чем событие, или когда команда будет вызывать различные события на основе некоторой логики? Или это всегда отношение 1 - 1 (1 команда всегда не вызовет ничего или одно событие заданного типа).

Я спрашиваю об этом, потому что, если это факт, что команда всегда будет вызывать одно и то же событие, я могу построить свою систему соглашений на этом факте. Я знаю, что "RaiseEvent" приведет к "EventRaised" ...

Людовик С
источник
1
если команда вызывает две вещи, вы можете ожидать, что каждая из них вызовет событие. ProfileGenerated, ProfileSaved, также любое событие может вызвать ошибку, которая снова может вызвать событие
Ewan
Также тривиально, что системы могут реализовывать события BeforeCommand, AfterCommand и т. Д.
Ewan
Или команда может выполнить цикл, т.е. FillProfiles () profileFilled, profileFilled ....
Ewan
@ Иван, просто хочу поправить тебя. Домен-событие не может генерировать ошибку. Только команды могут. События в домене означают, что что- то произошло , так как команды означают, что есть намерение сделать что-то, что может быть отклонено или принято. Другими словами, ошибка должна возникать до того, как будет отправлено событие домена (если, конечно, это событие домена не связано с регистрацией ошибок).
Людовик C

Ответы:

18

Поскольку вы пометили свой вопрос как «CQRS», я думаю, вы имеете в виду события в контексте «CQRS & Event Sourcing», как описано здесь . В этом уроке различие между событиями и командами хорошо объяснено:

  • события фиксируют элементарные «вещи, которые могут произойти» в вашей системе, с точки зрения системы.

  • Команды определяются тем, что пользователь считает операцией, с его точки зрения.

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

Например, в учебнике упоминаются события

  • TabOpened
  • DrinksOrdered
  • FoodOrdered

и команды

  • OpenTab
  • Разместить заказ

Здесь команда «OpenTab» приведет к событию «TabOpened», а команда PlaceOrder приведет к событиям «DrinksOrdered», «FoodOrdered» или обоим.

Фактически, если вы разрабатываете новую систему «с нуля», вы можете попытаться спроектировать ее с соотношением 1: 1 между командами и событиями и посмотреть, насколько хорошо она масштабируется, когда система становится больше. Вы даже можете попробовать гибридный подход: список событий и команд с соответствием 1: 1, вместе с некоторыми дополнительными, комбинированными командами. Просто попробуйте, как далеко это приведет вас к конкретной системе, которую вы разрабатываете.

Док Браун
источник
10

Обычно одна команда приводит к одному событию. Но в некоторых случаях это также может быть несколько, это зависит от вашей реализации.

Либо ваша команда вызывает другие команды, и каждая из них запускает собственные события. Или ваша команда выполняет разные задачи самостоятельно и выдает несколько событий. Например:

RegisterUserCommand

  • User.create (электронная почта, пароль) → UserCreatedEvent
  • User.updateProfile (firstName, lastName, location) → UserProfileUpdatedEvent
  • User.joinDefaultGroup () → UserJoinedGroupEvent
synthomat
источник
Что произойдет, если вы позже решите иметь UserWasAddedToCrm? Переписать весь поток?
mcintyre321
@ mcintyre321 поиск хореографии против организованных событий
Бентен
10

Одна команда может вызвать несколько событий. Это просто логический вывод одного факта: Composite commandсуществует.

Допустим, у вас есть две команды, каждая из которых вызывает событие. Затем вы создаете составную команду из этих двух. С точки зрения того, кто использует составную команду, кажется, что команда вызвала два события.

Таким образом, ничто не мешает вам иметь одну команду, вызывающую несколько (или даже вообще нет) событий.

Euphoric
источник