Сопоставление атрибутов проверки с сущности домена в DTO

У меня есть стандартная сущность уровня домена:

public class Product
{
    public int Id { get; set; }

    public string Name { get; set; }

    public decimal Price { get; set;}
}

который имеет какие-то атрибуты проверки:

public class Product
{
    public int Id { get; set; }

    [NotEmpty, NotShorterThan10Characters, NotLongerThan100Characters]
    public string Name { get; set; }

    [NotLessThan0]
    public decimal Price { get; set;}
}

Как видите, я составил эти атрибуты полностью. Какая структура валидации (NHibernate Validator, DataAnnotations, ValidationApplicationBlock, Castle Validator и т. Д.) Используется здесь не имеет значения.

В моем клиентском слое у меня также есть стандартная настройка, где я неt использовать сами доменные сущности, но вместо этого сопоставить их с ViewModels (он же DTO), который использует мой слой вида:

public class ProductViewModel
{
    public int Id { get; set; }

    public string Name { get; set; }

    public decimal Price { get; set;}
}

Позволять'Затем скажите, что я хочу, чтобы мой клиент / представление могли выполнять некоторые базовые проверки на уровне свойств.

Единственный способ сделать это - повторить определения валидации в объекте ViewModel:

public class ProductViewModel
{
    public int Id { get; set; }

    // validation attributes copied from Domain entity
    [NotEmpty, NotShorterThan10Characters, NotLongerThan100Characters]
    public string Name { get; set; }

    // validation attributes copied from Domain entity
    [NotLessThan0]
    public decimal Price { get; set;}
}

Это явно неудовлетворительно, так как теперь я повторил бизнес-логику (проверка на уровне свойств) в слое ViewModel (DTO).

Так что можно сделать?

Предполагая, что я использую инструмент автоматизации, такой как AutoMapper, для сопоставления сущностей моего Домена с моими DTO ViewModel, не будетТакже было бы здорово как-то перенести логику проверки для сопоставленных свойств в ViewModel?

Вопросы:

1) Это хорошая идея?

2) Если это так, можно ли это сделать? Если нет, каковы альтернативы, если таковые имеются?

Заранее благодарю за любой вклад!

Ответы на вопрос(7)

Ваш ответ на вопрос