Ответ 1
Важно знать, что команды могут отклоняться после их отправки в обработчик.
По крайней мере, вы можете столкнуться с нарушением concurrency, которое не может быть обнаружено до тех пор, пока не будет затронут общий корень.
Но также проверка, которая может произойти за пределами сущности, является простой проверкой. Не только длины строк, числовые диапазоны, соответствие регулярных выражений и т.д., Но также и проверка, которая может быть удовлетворительно удовлетворена через запрос или представление, например уникальность в коллекции. Важно помнить, что валидация с использованием материализованного представления скорее всего будет в конечном итоге последовательной, что является другой причиной того, что команда может быть отклонена из совокупности, внутри обработчик команд. Тем не менее, чтобы упредить ситуацию, я часто использую модели чтения для выбора UI, которые допускают действительные действия.
Валидация не может не за пределами сущности - это проверка вашей бизнес-логики. Эта проверка зависит от контекста, в котором она выполняется (см. Udi Dahan Clarified CQRS).
Бизнес-логика должна не находиться в отдельной службе проверки. Он должен быть в вашем домене.
Кроме того, я считаю, что проверка, которая возникает в пользовательском интерфейсе, должна быть повторно проверена не в обработчике команд, а в домене тоже. Эта проверка позволяет предотвратить повреждение домена - если он не выполняется за пределами домена, тогда домен по-прежнему недействителен.
Использование обработчиков команд для дублирования этой проверки является только условным. Если никакой другой интерфейс не посылает команды, то это бесполезный дубликат. Если есть несколько фронтов, это всего лишь один выбор места, где нужно сделать повторную повторную проверку, а в тех случаях я предпочитаю обрабатывать его в домене.
Наконец, вам нужно будет сбросить команды, отклоненные из обработчика. Я делаю это с исключениями насколько возможно.