.net MVC3 DataAnnotation - как предотвратить дублирование проверки

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

Мы поместили наши доменные права в слой домена, и для каждой сущности домена у нас есть класс MetadataType, который содержит применимые бизнес-правила в форме аннотаций. Класс сущности домена также реализует IValidatableObject для любых проверок, которые не реализованы с использованием DataAnnotations.

На уровне веб / презентации мы используем объекты модели представления. Это могут быть данные из нескольких доменных объектов или одного доменного объекта, а пока давайте предположим, что один доменный объект. Это представление модели украшено [MetadataType(typeof(DomainEntityMetaData))]

Это сохраняет нашу бизнес-логику в области и вне моделей представления. Однако модель представления не реализует IValidatableObject, и поэтому она никогда не выполняется. Я, очевидно, не хочу повторять проверку в представлении.

Любые предложения о том, как подойти к этому?

2 ответа

Частично ваша проблема заключается в том, что вы пытаетесь перенести проверку вашего домена на ваш взгляд. Хотя это может работать в некоторых ситуациях, на самом деле это нарушение принципа разделения интересов. View и Domain - это разные проблемы, и у каждого из них свои проблемы с проверкой.

Это, в частности, проблема, потому что ваши объекты ViewModel не идентичны объектам вашей модели домена, но вы пытаетесь использовать метаданные домена в качестве средства проверки для вашей модели представления. Это всегда будет вызывать проблемы.

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

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

Разделение проблем часто воюет с СУХОЙ (не повторяйте себя). Если вы хотите предпочесть DRY, а не SOC, вам нужно объединить ваши доменные модели с вашими моделями представлений и использовать одну и ту же модель для обоих.

Это сбивает с толку, когда вы используете два разных принципа в вашем приложении. Вы используете SOC в своем домене, и вы хотите использовать DRY в вашем представлении. Это просто не работает во многих случаях. Я понятия не имею, почему вы пытаетесь украсить свои модели View атрибутами домена. Очевидно, что ваша модель представления не совпадает с моделью вашего домена, поэтому попытка использовать метаданные домена приведет к несоответствию импеданса.

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

Возможно, по следующим ссылкам есть ответ, который вы ищете.(Поскольку описание вопроса не очень понятно).

http://goneale.com/2009/03/04/using-metadatatype-attribute-with-aspnet-mvc-xval-validation-framework/

http://www.vladhorby.com/wpblog/2011/03/03/validator-validateobject-ignores-metadatatype-attributes/

Другие вопросы по тегам