我有一个标准的域层实体:
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 这样的自动化工具将我的域实体映射到我的 ViewModel DTO,那么以某种方式将映射属性的验证逻辑也传输到 ViewModel 不是很酷吗?
问题是:
1)这是个好主意吗?
2)如果可以,可以吗?如果没有,有什么替代方案(如果有的话)?
提前感谢您的任何意见!