Должен ли я поместить командную шину между контроллером и службой домена? - PullRequest
0 голосов
/ 25 июня 2019

Я работаю над бэкэндом и пытаюсь реализовать шаблоны CQRS.Я довольно четко разбираюсь в событиях, но иногда борюсь с командами.

Я видел, что команды запрашиваются пользователями, или, например, ChangePasswordCommand.Однако на уровне реализации пользователь просто вызывает конечную точку, обрабатываемую некоторым контроллером.

Я могу ввести UserService в мой контроллер, который будет обрабатывать логику домена, и так поступают базовые учебные пособия (я использую Nest.JS).Однако я чувствую, что, возможно, именно здесь я должен использовать команду - поэтому я должен выполнить команду ChangePasswordCommand в моем контроллере, и тогда модуль домена справится с этим?

Важно то, что мне нужно возвращаемое значение из команды, что не является проблемой с точки зрения реализации, но не очень хорошо с точки зрения CQRS - мне нужно ADD и GET одновременно.

Или, возможно, последний вариант - выполнить команду в контроллере, а затем выдать событие (PasswordChangedEvent) в обработчике команд.Затем подождите, пока событие не вернется и верните значение в контроллере.

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

Я базируюсь на https://docs.nestjs.com/recipes/cqrs

1 Ответ

1 голос
/ 28 июня 2019

По мере развития вашей архитектуры вы можете обнаружить, что вам нужна командная шина, если вы используете Processes / Sagas для управления рабочими процессами и межагрегатного взаимодействия.Если и когда это так, то, естественно, имеет смысл использовать эту шину для всех команд.

Следующий метод, который я бы предпочел:

выполнить команду в контроллере, а затем выдать событие (PasswordChangedEvent) в обработчике команд.Затем дождитесь возвращения события и верните значение в контроллер.

Что касается деталей реализации, в .NET мы используем службу веб-сокетов SignalR, которая будет читать шину событий (где публикуются все события).) и будет пересылать события клиентам, которые подписались на них.

В этом случае рабочий процесс будет выглядеть следующим образом:

  1. Пользователь отправляет сообщения на контроллер.
  2. Контроллер добавляет команду на командную шину.
  3. Контроллер возвращает идентификатор, идентифицирующий команду.
  4. Клиент (клиент браузера) подписывается на события, относящиеся к этой команде.
  5. Команда получена службой домена иобрабатываются.Событие отправляется в хранилище событий.
  6. Событие публикуется в шине событий.
  7. Служба подписки прослушивателя событий получает событие, находит подписку и отправляет событие клиенту.
  8. Клиент получает событие и уведомляет пользователя.
...