Как проверить входные данные, если есть CQRS, DTO и Entity?

.Net Core 3, чистая архитектура.

Я прочитал много статей о проверке данных с помощью CQRS. Например, здесь и здесь.

Я сделал некоторые выводы:

  1. Необходимо проверить данные в DTO. Это контракт для юридических лиц.
  2. Некоторые предложения от авторов подтверждают дату в объектах (домен).
  3. В CQRS AbstractValidator мы тоже можем валидировать, но по другим правилам.

Проверка поля электронной почты будет в 1 и 2. Ограничение по возрасту будет в 3.

Но три проверки на сервере + одна на клиенте - это проблема (большой DRY). Где лучше валидация в DTO или Entities? Я думаю в DTO, потому что когда я получаю DTO из ввода, я могу проверить и вызвать ModelState.IsValid. Но я читал некоторые статьи, которые также требуют проверки входных данных в сущностях.

Итак, я в замешательстве. Можете ли вы объяснить мне:

Если необходимо проверить поле электронной почты и ограничение по возрасту (18 лет), где нужно провести проверку в чистой архитектуре с помощью CQRS?


person hdoitc    schedule 23.02.2020    source источник


Ответы (3)


Все ваши API-контракты и команды должны опираться на примитивные типы. Как только вы захотите инициализировать свою доменную модель, здесь вы не сможете этого сделать, если что-то не так. Если вы делаете DDD, он предлагает предотвратить нахождение объекта в недопустимом состоянии по сравнению с проверкой недопустимого объекта (модель предметной области или на основе Crud).

person DmitriBodiu    schedule 23.02.2020
comment
Я хочу сделать ДДД. Я должен проверять DTO (или ViewModel) для ввода данных пользователем и проверять объекты команд в домене, не так ли? Я пока не могу поймать. - person hdoitc; 23.02.2020
comment
Нет, вы не должны. Если ваша команда или dto использует примитивные типы (int, string, bool). Вам нужно будет создать другой класс (валидатор), чтобы проверить его. Это будет означать, что вы будете дублировать логику своего домена. Поскольку только домен знает, что адрес действителен только в том случае, если указана страна, поэтому var address = new Address(country, bla, bla) завершится ошибкой, если вы укажете нулевую страну. - person DmitriBodiu; 24.02.2020
comment
Иногда разработчики предварительно проверяют команды и dtos, если там есть данные. Но не против правил вашего домена. Таким образом, в вашей команде вы можете проверить, является ли страна нулевой, это недопустимая команда, но не более того - person DmitriBodiu; 24.02.2020

Чистая архитектура разделяет ответственность по уровням, каждый уровень должен иметь свою собственную логику проверки.

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

person Emmy Steven    schedule 25.09.2020

Все зависит от типа проверки. Это поверхностная или глубокая проверка?

Поверхностная проверка — это такие вещи, как надежность пароля или проверка правильности формата URL-адреса или адреса электронной почты. Принимая во внимание, что глубокая проверка — это то, что имеет значение для предметной области. Так что это может быть что-то вроде того, является ли этот груз опасным или этот человек слишком рискован, чтобы предоставлять ему кредит.

Ознакомьтесь с этим сообщением, в котором эта концепция более подробно объясняется с точки зрения CQRS: Как проверять команды в приложении CQRS

person Codescribler    schedule 24.02.2020