我有一个标准的域层实体:
- 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(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,NotLongerThan100Characters]
- public string Name { get; set; }
- // validation attributes copied from Domain entity
- [NotLessThan0]
- public decimal Price { get; set;}
- }
这显然不令人满意,因为我现在在viewmodel(DTO)层中重复了业务逻辑(属性级别验证)。
那么可以做什么呢?
假设我使用像AutoMapper这样的自动化工具将我的域实体映射到我的viewmodel DTO,那么将映射属性的验证逻辑转换为viewmodel也不是很酷吗?
问题是:
这是一个好主意吗?
2)如果是这样,可以做吗?如果没有,什么是替代品,如果有?
预先感谢您的任何投入!