У меня есть стандартный объект Domain Layer:
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 и т.д.) Не используется здесь.
На моем клиентском уровне у меня также есть стандартная настройка, в которой я сам не использую сущности Domain, а вместо этого сопоставляю их с ViewModels (aka 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, для сопоставления объектов домена с моими объектами ViewModel, не было бы также здорово каким-то образом передать логику проверки для отображаемых свойств в ViewModel?
Вопросы:
1) Это хорошая идея?
2) Если да, можно ли это сделать? Если нет, каковы альтернативы, если они есть?
Заранее благодарю за любой ввод!