.net MVC3 DataAnnotation - как предотвратить дублирование проверки
У меня возникли проблемы с проверкой с использованием аннотаций данных и интересно, если кто-нибудь сделал что-то подобное.
Мы поместили наши доменные права в слой домена, и для каждой сущности домена у нас есть класс MetadataType, который содержит применимые бизнес-правила в форме аннотаций. Класс сущности домена также реализует IValidatableObject для любых проверок, которые не реализованы с использованием DataAnnotations.
На уровне веб / презентации мы используем объекты модели представления. Это могут быть данные из нескольких доменных объектов или одного доменного объекта, а пока давайте предположим, что один доменный объект. Это представление модели украшено [MetadataType(typeof(DomainEntityMetaData))]
Это сохраняет нашу бизнес-логику в области и вне моделей представления. Однако модель представления не реализует IValidatableObject, и поэтому она никогда не выполняется. Я, очевидно, не хочу повторять проверку в представлении.
Любые предложения о том, как подойти к этому?
2 ответа
Частично ваша проблема заключается в том, что вы пытаетесь перенести проверку вашего домена на ваш взгляд. Хотя это может работать в некоторых ситуациях, на самом деле это нарушение принципа разделения интересов. View и Domain - это разные проблемы, и у каждого из них свои проблемы с проверкой.
Это, в частности, проблема, потому что ваши объекты ViewModel не идентичны объектам вашей модели домена, но вы пытаетесь использовать метаданные домена в качестве средства проверки для вашей модели представления. Это всегда будет вызывать проблемы.
например, у вас может быть мастер, который шаг за шагом создает объект домена на нескольких страницах. Если вы выполните проверку домена, у вас будут проблемы с проверкой, потому что вы не заполняете необходимые данные на разных этапах.
Независимо от того, какая проверка домена у вас может быть, вы должны определить свою проверку представления. Это может означать дублирование метаданных.
Разделение проблем часто воюет с СУХОЙ (не повторяйте себя). Если вы хотите предпочесть DRY, а не SOC, вам нужно объединить ваши доменные модели с вашими моделями представлений и использовать одну и ту же модель для обоих.
Это сбивает с толку, когда вы используете два разных принципа в вашем приложении. Вы используете SOC в своем домене, и вы хотите использовать DRY в вашем представлении. Это просто не работает во многих случаях. Я понятия не имею, почему вы пытаетесь украсить свои модели View атрибутами домена. Очевидно, что ваша модель представления не совпадает с моделью вашего домена, поэтому попытка использовать метаданные домена приведет к несоответствию импеданса.
Это не значит, что вы не можете решить свою проблему. Возможно, вы могли бы, но это потребовало бы взломать базовый дизайн MVC, добавить свои собственные части расширения и т. Д. Вопрос в том, сколько работы вы хотите сделать, чтобы сэкономить себе часть работы?
Возможно, по следующим ссылкам есть ответ, который вы ищете.(Поскольку описание вопроса не очень понятно).
http://www.vladhorby.com/wpblog/2011/03/03/validator-validateobject-ignores-metadatatype-attributes/