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