Разница между командой и событием в автобусном сообщении мне кажется немного расплывчатой. Я знаю, что команды должны выполняться только один раз, в то время как событие может быть обработано несколько раз, но все же я не уверен, когда использовать команду или событие.
Давайте посмотрим на пример:
Когда новый пользователь регистрируется в веб-приложении, мы должны создать ему учетную запись и отправить электронное письмо с подтверждением.
Создание учетной записи - кажется, это правильное место для отправки CreateUserCommand
на шину и позволить специализированному компоненту обработать ее.
Или, может быть, это даже не должно быть реализовано с асинхронной коммуникацией по шине? Мы хотим, чтобы пользователь мог сразу войти в приложение. С шиной у нас нет гарантии, когда команда будет выполнена.
Отправка электронной почты - после того, как компонент создает учетную запись, я вижу 2 возможности
- Отправить еще одну команду на автобус
SendConfirmationEmailCommand
- Опубликовать событие
UserAccountCreatedEvent
И тогда пусть компонент отправителя электронной почты возьмет его и приступит к работе.
С одной стороны, я хочу, чтобы электронное письмо с подтверждением отправлялось только один раз (используйте команду), с другой стороны, я считаю, что может быть несколько компонентов, заинтересованных в новых зарегистрированных пользователях. Регистратор или, возможно, отправитель SMS.
Как бы вы это реализовали?