Валидаторы бизнес-правил и обработчик команд в CQRS

Я новичок в CQRS, и я связываюсь, чтобы разобраться в проверке бизнес-правил на стороне записи (домене). Я знаю, что проверка на стороне клиента должна выполняться с точки зрения действительной даты (обязательное поле, длина строки, действительный адрес электронной почты и т.д.), а проверка, связанная с бизнес-правилом / бизнес-доменом, должна выполняться на стороне домена. Фактически, те же правила проверки на стороне клиента также должны применяться к команде в домене, поскольку мы не доверяем пользователям.

Итак, у нас есть действующая команда (AddEmailToCustomer), и обработчик команды вызывается для команды. Вот мой подход к валидации.

  1. Создайте экземпляры двух валидаторов команд в обработчике команд.
  2. Первый валидирует данные команды так же, как валидация на стороне клиента (обязательное поле, действительный адрес электронной почты и т. Д.)
  3. Второй валидатор проверяет данные на основе логики второго валидатора. Что-то вроде «активен ли этот клиент» или что-то еще. Я знаю, что изменение адреса электронной почты не не подходит сюда, но это не важно. Важно то, что здесь есть бизнес-проверка.
  4. Мы смотрим на ValidationResult, возвращаемый Validator.Validate (ICommand cmd), и обнаруживаем ошибки.
  5. Мы не получим клиента из репозитория, чтобы он позвонил в UpdateEmail в AR. Итак, что нам делать на этом этапе?

Могу ли я вызвать исключение в обработчике команд и добавить туда эти ошибки? Отправить команду в очередь ошибок или еще куда-нибудь? Могу ли я ответить чем-то вроде Bus.Reply и вернуть код ошибки? Если да, что мне делать с сообщениями об ошибках? Как мне сообщить об этих ошибках пользователю? Я знаю, что могу отправить их по электронной почте позже, но в веб-сценарии я могу отправить идентификатор запроса в команде (или использовать идентификатор сообщения) и запросить ответ с идентификатором запроса и отобразить сообщения об ошибках для пользователя.

Ваше руководство приветствуется.

Спасибо

32
задан sheldon_cooper 22 March 2011 в 22:33
поделиться