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