Проверка модели в веб-API

Я должен проверить три вещи, когда потребитель моего API пытается обновить клиента.

Запретить обновление клиента, если:

  1. Имя или фамилия пусты

  2. Для определенной страны, если внутренняя коллекция X клиента пуста, создайте исключение. X трудно объяснить, так что просто предположим, что это какая-то коллекция. Для всех остальных стран X не применяется / всегда будет пустым. Но если это определенная страна, то X обязателен. Так что это почти условно обязательный атрибут. Клиент принадлежит стране, поэтому это выясняется из отправляемого JSON.

  3. Запретить обновление клиента, если выполняются некоторые условия в базе данных.

Итак, в основном я застрял со следующей проблемой, и мне нужен совет о наиболее подходящем способе ее решения:

Нужно ли создавать фильтр действий для проверки объекта клиента перед сохранением? Или было бы лучше создать собственный атрибут проверки, полученный из ValidationAttribute, и переопределить функцию-член IsValid.

В основном вопрос о том, если (имя пусто, если x, если y и т. д.) vs (!ModelState.IsValid)

А затем с помощью IsValid заставить работать настраиваемые атрибуты.

Кажется, что атрибуты проверки лучше всего подходят для «простой» проверки, т.е. обязательного поля. Но как только вы начинаете вдаваться в такие вещи, как «Мне нужно просмотреть мою базу данных или проанализировать заголовок HTTP-запроса на наличие пользовательских значений и, исходя из этого, invalid = false», тогда кажется почти неправильным делать такие вещи так близко к лицо.

Мысли?

Спасибо!


person NullHypothesis    schedule 30.07.2015    source источник


Ответы (1)


Мне очень нравится FluentValidation: https://github.com/JeremySkinner/FluentValidation

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

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

RuleFor(customer => customer.Discount).NotEqual(0).When(customer => customer.HasDiscount);

(Отрывок кода взят с вики-страницы проекта)

Она также расширяема, так что вы также можете разрабатывать свои собственные валидаторы поверх этой библиотеки.

person Volkan Paksoy    schedule 30.07.2015