.net MVC3 DataAnnotation - как предотвратить дублирование проверки - PullRequest
2 голосов
/ 25 февраля 2012

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

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

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

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

Есть предложения, как к этому подойти?

Ответы [ 2 ]

5 голосов
/ 26 февраля 2012

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

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

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

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

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

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

0 голосов
/ 25 февраля 2012

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

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/

...