Я ищу способ разработки приложения DDD с соглашением по конфигурации.
Скажем, агрегат «Клиент» имеет команду, определенную как «FillProfile». Это будет логически вызывать событие «ProfileFilled».
Существуют ли случаи, когда команда будет вызывать больше, чем событие, или когда команда будет вызывать различные события на основе некоторой логики? Или это всегда отношение 1 - 1 (1 команда всегда не вызовет ничего или одно событие заданного типа).
Я спрашиваю об этом, потому что, если это факт, что команда всегда будет вызывать одно и то же событие, я могу построить свою систему соглашений на этом факте. Я знаю, что "RaiseEvent" приведет к "EventRaised" ...
domain-driven-design
cqrs
event-sourcing
Людовик С
источник
источник
Ответы:
Поскольку вы пометили свой вопрос как «CQRS», я думаю, вы имеете в виду события в контексте «CQRS & Event Sourcing», как описано здесь . В этом уроке различие между событиями и командами хорошо объяснено:
события фиксируют элементарные «вещи, которые могут произойти» в вашей системе, с точки зрения системы.
Команды определяются тем, что пользователь считает операцией, с его точки зрения.
И хотя это часто приводит к паре команд и событий с соответствием 1: 1, эти разные точки зрения могут привести к командам, которые запускают более одного события, или к различным событиям в зависимости от параметров команды. Я даже могу представить себе случаи, когда команда вообще не вызывает событие, но это будет очень исключительный случай, а не очень типичный.
Например, в учебнике упоминаются события
и команды
Здесь команда «OpenTab» приведет к событию «TabOpened», а команда PlaceOrder приведет к событиям «DrinksOrdered», «FoodOrdered» или обоим.
Фактически, если вы разрабатываете новую систему «с нуля», вы можете попытаться спроектировать ее с соотношением 1: 1 между командами и событиями и посмотреть, насколько хорошо она масштабируется, когда система становится больше. Вы даже можете попробовать гибридный подход: список событий и команд с соответствием 1: 1, вместе с некоторыми дополнительными, комбинированными командами. Просто попробуйте, как далеко это приведет вас к конкретной системе, которую вы разрабатываете.
источник
Обычно одна команда приводит к одному событию. Но в некоторых случаях это также может быть несколько, это зависит от вашей реализации.
Либо ваша команда вызывает другие команды, и каждая из них запускает собственные события. Или ваша команда выполняет разные задачи самостоятельно и выдает несколько событий. Например:
RegisterUserCommand
источник
UserWasAddedToCrm
? Переписать весь поток?Одна команда может вызвать несколько событий. Это просто логический вывод одного факта:
Composite command
существует.Допустим, у вас есть две команды, каждая из которых вызывает событие. Затем вы создаете составную команду из этих двух. С точки зрения того, кто использует составную команду, кажется, что команда вызвала два события.
Таким образом, ничто не мешает вам иметь одну команду, вызывающую несколько (или даже вообще нет) событий.
источник