С новыми функциями проверки ASP.NET MVC 2 мы можем украсить свойства объектов нашей доменной модели атрибутами DataAnnotations
, которые описывают критерии для допустимых значений. DefaultModelBinder
знает об этом и заполняет ModelState.IsValid
соответственно, прежде чем будет вызвано действие контроллера. Поскольку правила валидации определены в модели предметной области, это считается валидацией на уровне модели. Скотт Гатри пишет :
Преимущество реализации правил в нашем объекте Person заключается в том, что это гарантирует, что проверка будет выполняться посредством любого сценария в нашем приложении, в котором используется объект Person [...]
Строго говоря, на мой взгляд, правила не принудительно применяются , поскольку все методы действия должны проверять свойство ModelState.IsValid
и действовать по-разному в зависимости от его значения. Кроме того, хотя правила определены в модели, они применяются на уровне представления , поскольку там находятся все связующие модели. Но я предполагаю, что я просто привередлив в выборе слов (или просто ошибаюсь).
Однако как насчет применения правил проверки на уровне модели домена? Стивен Сандерсон использует этот подход в посте о платформе проверки xVal , где он пишет:
Теперь уровень модели обеспечивает собственную валидность, отказываясь размещать заказы, которые не соответствуют всем правилам валидации и бизнес-правилам.
В его примере «менеджер по бронированию» (который живет в модели) выдает специальное исключение бизнес-правила, когда потребляющий код пытается разместить недействительное бронирование. Таким образом, для потребляющего кода невозможно разместить недействительное бронирование независимо от того, проверил ли он заблаговременность проверки бронирования (с помощью ModelState.IsValid
или какой-либо другой пользовательской конструкции).
Итак, мой вопрос:
Предполагая, что на уровне модели определены правила проверки, должны ли они также применяться в модели?
(Обратите внимание, что я действительно новичок в концепции доменного дизайна, поэтому, пожалуйста, потерпите меня, если я не использовал точно правильную терминологию.)