Должны ли правила проверки всегда применяться на уровне модели? - PullRequest
3 голосов
/ 12 февраля 2010

С новыми функциями проверки ASP.NET MVC 2 мы можем украсить свойства объектов нашей доменной модели атрибутами DataAnnotations, которые описывают критерии для допустимых значений. DefaultModelBinder знает об этом и заполняет ModelState.IsValid соответственно, прежде чем будет вызвано действие контроллера. Поскольку правила валидации определены в модели предметной области, это считается валидацией на уровне модели. Скотт Гатри пишет :

Преимущество реализации правил в нашем объекте Person заключается в том, что это гарантирует, что проверка будет выполняться посредством любого сценария в нашем приложении, в котором используется объект Person [...]

Строго говоря, на мой взгляд, правила не принудительно применяются , поскольку все методы действия должны проверять свойство ModelState.IsValid и действовать по-разному в зависимости от его значения. Кроме того, хотя правила определены в модели, они применяются на уровне представления , поскольку там находятся все связующие модели. Но я предполагаю, что я просто привередлив в выборе слов (или просто ошибаюсь).

Однако как насчет применения правил проверки на уровне модели домена? Стивен Сандерсон использует этот подход в посте о платформе проверки xVal , где он пишет:

Теперь уровень модели обеспечивает собственную валидность, отказываясь размещать заказы, которые не соответствуют всем правилам валидации и бизнес-правилам.

В его примере «менеджер по бронированию» (который живет в модели) выдает специальное исключение бизнес-правила, когда потребляющий код пытается разместить недействительное бронирование. Таким образом, для потребляющего кода невозможно разместить недействительное бронирование независимо от того, проверил ли он заблаговременность проверки бронирования (с помощью ModelState.IsValid или какой-либо другой пользовательской конструкции).

Итак, мой вопрос:

Предполагая, что на уровне модели определены правила проверки, должны ли они также применяться в модели?

(Обратите внимание, что я действительно новичок в концепции доменного дизайна, поэтому, пожалуйста, потерпите меня, если я не использовал точно правильную терминологию.)

Ответы [ 3 ]

1 голос
/ 12 февраля 2010

Предполагая, что существуют правила проверки, определенные на уровне модели, должны ли они также применяться в модели?

Да. Если вы предоставите способ для короткого замыкания правил, то они будут. Возможно, не вами, а может быть, не скоро, но наверняка другими разработчиками через x недель / месяцев / лет в будущем.

Плюс всегда есть элемент человеческой ошибки - возможно, однажды, когда вы устали или кодируете поздно ночью, вы неправильно прочитали этот флаг проверки и фактически пропускаете записи, которые не проверяются. (Не издевайся, я сделал это сам!)

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

0 голосов
/ 15 февраля 2010

DataAnnotations - это полезная функция ASP.NET MVC 2, которая действительно обеспечивает хороший дешевый способ проверки как на стороне сервера, так и на стороне клиента. Тем не менее, вы правы, указывая на серьезную слабость. Но я также не думаю, что принудительное выполнение валидации с помощью модели также является верным; Я вижу две проблемы:

Проблема 1: как вы справляетесь с этим? Вы можете поставить все виды проверки на ваш конструктор, ваши установщики и т. Д., Но вы можете легко столкнуться с проблемами, когда вам нужно обойти эти правила. Хороший пример - сериализация; в то время как вы обычно можете обойти это, иногда во время десериализации объекта вам просто нужно на мгновение позволить объекту находиться в недопустимом состоянии. Другим примером может быть просто чрезвычайно сложная иерархическая модель (например, родитель требует ребенка, а этот ребенок требует родителя, очевидно, у вас есть проблема курицы и яйца, поскольку вы не можете построить их одновременно).

Проблема 2: как насчет правил проверки на более высоком уровне (например, имена пользователей должны быть уникальными)? Вы не можете иметь эти правила в Модели.

В конце дня вы должны стремиться к тому, чтобы ваш код был максимально чистым, а намерения - как можно более понятными, и чтобы все было хорошо проверено. Я еще не видел ни одной валидации на основе моделей, которая действительно полностью защищала бы целостность ваших данных в 100% случаев. Даже если пользователь не сломает вашу модель, другой разработчик в конечном итоге сделает это.

0 голосов
/ 13 февраля 2010

Я не слишком уверен насчет этих аннотаций данных. Но, похоже, они должны работать везде, независимо от того, находится модель в проекте ASP.NET MVC или нет и используется оттуда или нет. Потому что DataAnnotations являются частью System.ComponentModel.DataAnnotations. Я считаю это особенно полезным, поскольку все мои модели определены в отдельных проектах вне основного проекта MVC в моем решении VS.

...