Правильное использование DataAnnotations в приложении ASP.NET MVC с классами домена в отдельном проекте?

У меня есть N-уровневое приложение, в котором Data, Domain и интерфейсные слои находятся в отдельных проектах. Я использую ASP.NET MVC для создания веб-сайта и пытаюсь добавить правила проверки с использованием System.ComponentModel.DataAnnotations. В настоящее время я сделал это на свойствах классов домена. Я хотел бы знать, является ли хорошей практикой применение правил проверки непосредственно к классам домена? Или лучше создать классы ViewModels в приложении ASP.NET и применить правила проверки к свойствам классов ViewModel? Надеюсь, что этот вопрос подходит здесь, я ценю любую помощь.

2 ответа

Решение

ViewModel намного лучше, потому что ViewModel должен понимать, получает ли он действительные данные от пользователя. И тогда вы можете исправить все другие исключения во время преобразования с помощью AutoMapper. Я также хотел бы создать множество пользовательских DataAnnotations, DataTypes, Editors, ModeMetaDataRules и ModelBinder для использования с приложением.

Вот части кода для ModelFilter, использующего пользовательский ModelBuilder, я собираюсь опубликовать его часть, потому что в нем много кода, но он должен помочь вам в правильном направлении.

    public interface IModelMetadataFilter
    {
        void TransformMetadata(ModelMetadata metadata,
             IEnumerable<Attribute> attributes);
    }
public class MultilineTextByNameConvention : IModelMetadataFilter
    {
        public void TransformMetadata(ModelMetadata metadata, IEnumerable<Attribute> attributes)
        {
            if ( !string.IsNullOrEmpty(metadata.PropertyName) &&
                string.IsNullOrEmpty(metadata.DataTypeName) )
            {
                if ( metadata.PropertyName.ToLower().Contains("notes")
                    || metadata.PropertyName.ToLower().Contains("description")
                    || metadata.PropertyName.ToLower().Contains("comment")
                    )
                {
                    metadata.DataTypeName = DataType.MultilineText.ToString();
                }
            }
        }
    }

Этот код ищет каждую ViewModel с именем свойства, содержащим слова 'notes', 'description' и 'comment', автоматически применяя атрибут Multitext DataType для всех этих свойств. Этот тип кода может использоваться для многих других различных ситуаций. Например, поля типа SSN могут иметь определенный формат, используя RexExpr DataAnnotation и т. Д.

Вы можете установить атрибуты для частичных классов ваших сущностей, и ваши автоматически сгенерированные классы не будут переопределены.

Например,

Допустим, у вас есть сущность TheEntity

В отдельном файле с тем же пространством имен вы можете написать:

namespace SameNamespaceAsEntities
{
internal sealed class TheEntityMetadata
{
    //AStringInTheEntity appears twice in your project
    //once in the auto gen file, and once here
    [Required(ErrorMessage = "Field is required.")]
    public string AStringInTheEntity{ get; set; }
}

//http://stackru.com/questions/14059455/adding-validation-attributes-with-an-entity-framework-data-model
[System.ComponentModel.DataAnnotations.MetadataType(typeof(TheEntityMetadata))]
public partial class TheEntity : IEntity //you can set contracts
{
Другие вопросы по тегам