У меня есть стандартная сущность уровня домена:
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 и т. Д.), Используемая здесь, не имеет значения.
В моем клиентском слое у меня также есть стандартная настройка, в которой я не использую сами сущности Домена, а вместо этого сопоставляю их с 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) Если это так, можно ли это сделать? Если нет, каковы альтернативы, если таковые имеются?
Заранее спасибо за любой вклад!