CQS и CRUD операция
Я работаю над веб-сайтом с высокой масштабируемостью для целей обучения. Я решил использовать шаблон CQS и некоторые идеи CQRS. У меня есть отдельные слои записи и чтения, используемые обработчиками команд и обработчиками событий, которые система отправляет и получает от шин сообщений (две отдельные шины сообщений).
У меня есть проблемы с командами. Я прочитал, что команда не должна ничего возвращать. И теперь дело в том: например, у меня есть форма, с которой пользователь может создать событие или, например, изменить что-то в его профиле (фотографию или имя). После того, как пользователь нажал "Сохранить", я хочу показать ему, его профиль или добавить новое событие к его стене. Но как я могу узнать, что его профиль уже обновлен, когда команда отправляется только на шину? Как связывают идею командных и CRUD-операций? Или, может быть, это неправильная идея вообще?
2 ответа
Ну, во-первых, разделение должно быть не между командами и событиями, а скорее между доменом и моделями чтения. Как правило, вы не можете отобразить команды CQRS на операции CRUD, хотя большинство команд в вашей системе изменят состояние ваших репозиториев. Я дам вам общий обзор того, как это работает. Скажем, вы хотите добавить пользователя, вы создаете команду AddUserCommand и назначаете идентификатор этому сообщению. На заднем плане у вас есть обработчик для этой команды, и вы правы, что команда ничего не возвращает. Как только эта команда будет обработана, вы должны опубликовать и событие, отражающее изменение: UserWasAddedEvent. Идентификатор этого сообщения будет уникальным, но он может и должен иметь идентификатор, связанный с командой, которую вы создали в пользовательском интерфейсе. Ваши модели чтения должны обрабатывать событие и обновлять модель чтения в соответствии с состоянием команды (ожидание, обработка, завершено, ошибка, завершено успешно) в зависимости от опубликованного события. В пользовательском интерфейсе после того, как вы отправили команду, вы должны начать запрашивать модели чтения с идентификатором команды, которую вы создали, чтобы получить статус, а затем соответствующим образом обновить свой интерфейс.
Вы правы в том, что обработчики CQRS возвращают void, но вы должны иметь в виду, что обычно в такой архитектуре серверная часть должна возвращать результаты проверки поданных команд, а не сам обработчик, а инфраструктуру вокруг ваших обработчиков cqrs.
Просто обновите пользовательский интерфейс в предположении, что команда выполнена успешно - что в большинстве случаев будет.
Если для пользовательского ввода требуется проверка, вы можете запустить проверку, когда пользователь вводит или вводит вкладки, чтобы повысить вероятность успешного выполнения команды.