CQRS Путешествие не должно рассматриваться как руководство. Это всего лишь история о том, что какая-то команда пробивается к CQRS и имеет все ограничения использования только стека Microsoft. Вы не должны использовать свою модель чтения в обработчиках команд или логике домена. Но вы можете запросить свою модель чтения у клиента, чтобы получить данные, необходимые для вашей команды, и проверить эту команду.
Поскольку у меня есть некоторые понижения в этом ответе, я должен указать, что то, что я написал, - это установленная практика в рамках шаблона. Ни сторона чтения не обращается к стороне записи, ни сторона записи не получает данные со стороны чтения.
Однако определение «клиент» может быть предметом обсуждения. Например, я бы не стал доверять публичному обращению к браузерному приложению JS как надлежащий «клиент». Вместо этого я бы использовал свой слой REST API как «клиент» в CQRS, и веб-приложение было бы просто уровнем пользовательского интерфейса для этого клиента. В этом случае обработка вызова службы REST API будет законным читателем на стороне чтения, поскольку для проверки целостности любого уровня на уровне пользовательского интерфейса требуется подтверждение того, что для предотвращения подделки и проверки некоторых бизнес-правил требуется подтверждение. Когда эта работа будет выполнена, команда будет сформирована и отправлена на сторону записи. Валидации и все остальное синхронно, а обработка команд асинхронна.
ОБНОВЛЕНИЕ: В свете некоторых разногласий ниже я хотел бы указать на Udi's article from 2009, говоря о CQRS в целом, командах и валидации в частности.
Я не согласен. Если вам требуются, чтобы ваши команды содержали данные, которые обработчик должен проверить вашей командой, вы никогда не сможете изменить логику проверки в своем обработчике/домене, не затрагивая также и клиент *. Это явно предоставляет слишком большую часть подтверждения команды/знания домена клиенту и противоречит тому, что клиент хочет выразить намерение. IMHO лучшим решением является предоставление интерфейса PricingService (который является частью вездесущего языка) для ваших основных корней, а затем, при необходимости, реализации интерфейса, который может включать в себя запрос на чтение. –
Мне нужно это сделать вторым. – JoG
@AlexanderLanger Это не то, что я придумал, так устроен шаблон. Возможно, вы можете запросить сторону чтения из вашего обработчика команд, но это будет нечто иное, чем рассматриваемый шаблон. Если вы посмотрите на любую диаграмму на CQRS, вы никогда не увидите, что прочитанная модель запрашивается режимом записи. Он читается только клиентом. –