CQRS - одна команда, запускающая другие команды / состоящая из других команд - PullRequest
1 голос
/ 01 мая 2020

Может ли одна команда запускать другие команды в CQRS или состоять из других команд?

Заданный случай c, который меня интересует, заключается в том, что у меня есть команда «CreateAppointmentNote», которая создает заметку для существующего деловое свидание, встреча. У меня также есть команда «CreateAppointment», которая создает встречу (без примечаний).

Мне нужно добавить функциональность так, чтобы, если объект, используемый в команде «CreateAppointment», имел значения для заметки, он также должен был создавать заметку. Может ли команда «CreateAppointment» вызывать команду «CreateAppointmentNote» для этого?

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

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

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

1 Ответ

1 голос
/ 01 мая 2020

Как соотносятся встречи и заметки? Являются ли они частью одного и того же агрегата, и если да, то является ли ваше назначение действующим в качестве агрегата root (и, следовательно, отвечает за «защиту» нот)? Делает ли успешное создание встречи без успешного создания заметки недействительной транзакцию?

Если заметки являются фундаментальной частью транзакции для создания новой встречи и являются частью совокупности встреч, то они отражать вещи, которые изменяются вместе и могут быть частью одной команды; CreateAppointment может содержать любые свойства, относящиеся к заметкам, как часть создания запроса, а затем AddNoteToAppointment может управлять последующими заметками существующей встречей.

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

Цитирование cqrs.nu :

Я знаю, что агрегаты являются границами транзакций, но мне действительно нужно транзакционно обновить два агрегата в одной транзакции. Что мне делать?

Вам следует переосмыслить следующее:

  • Ваши совокупные границы.
  • Обязанности каждого агрегата.
  • Что вы можете сделать с помощью чтения или в саге.
  • Фактические нефункциональные требования вашего домена.

Если вы пишете решение, где два или более агрегатов транзакционно связаны, агрегаты не понятны.

...