2015-08-06 2 views
2

Я только что узнал о CQRS и проанализировал свой существующий код, ища места, где я нарушаю или применяю CQRS.Могу ли я вернуть состояние из команды CQRS?

До сих пор я не нашел места, где изменяется запрос. Однако многие команды изменяют состояние и возвращают объект данных, представляющий обновленное состояние.
Например: Угловой клиент отправляет запрос HTTP на номер /api/message.post. Идентификатор пользователя прикрепляется к запросу HTTP-сервером (на основе заголовков HTTP) и передается в микросервис, который обрабатывает команды message.post. Результатом обработчика команд является {ok: false} или {ok: true, message: {_id: "xyz", text: "new" ...}}, а объект ответа проксирован с микросервиса обратно на Угловой на HTTP-сервере.

Возвращает ли государство из-за нарушения CQRS?
Должен ли я возвращать из команды только «ok: true/false», а затем сделать второй запрос, чтобы получить новое сообщение? Если да, то почему?
Стоит ли накладные расходы, если запрос/ответы происходят через http из браузера?

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

+0

Я не думаю, что обработчик ** ** возвращает это. Команда отправляется на командную шину, после чего вы можете вернуть данные, считанные из модели чтения. Если что-то пошло не так, должно быть исключение –

+0

Это не действительно CQRS, если вы используете ту же модель для чтения и записи. Просто запустите запрос сразу после запуска команды, так как изменения данных будут немедленными. CQRS работает наилучшим образом, когда задействовано сотрудничество (например, продажа билетов, комментарии к одной и той же статье и т. Д.), Или операция может быть отложена (например: разрешить пользователю отменить заказ в течение 5 минут до начала оплаты кредитной карты). Если это однопользовательская операция, которая обрабатывается немедленно и требует немедленного отображения изменений, CQRS может слишком усложнить ситуацию для этой части домена. –

ответ

2

Обработчик команд может вернуть результат (ok, error, некоторые данные), но если вы используете служебную шину, обработчик может быть выполнен в фоновом работнике, и никто не будет обрабатывать результат ,

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

Если результат содержит сами данные команды, вы можете вернуть его.

К тому же, что вы просите, это CQS, а не CQRS и в некотором смысле это принцип единой ответственности, но в более специализированной форме.