Mar*_*nek 32 validation asp.net-mvc domain-driven-design dto viewmodel
我有一个标准的Domain Layer实体:
public class Product
{
public int Id { get; set; }
public string Name { get; set; }
public decimal Price { get; set;}
}
Run Code Online (Sandbox Code Playgroud)
它具有某种验证属性:
public class Product
{
public int Id { get; set; }
[NotEmpty, NotShorterThan10Characters, NotLongerThan100Characters]
public string Name { get; set; }
[NotLessThan0]
public decimal Price { get; set;}
}
Run Code Online (Sandbox Code Playgroud)
如您所见,我已经完全弥补了这些属性.这里使用的验证框架(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;}
}
Run Code Online (Sandbox Code Playgroud)
然后我们说我希望我的客户端/视图能够执行一些基本的属性级验证.
我看到我能做到这一点的唯一方法是重复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;}
}
Run Code Online (Sandbox Code Playgroud)
这显然不令人满意,因为我现在在ViewModel(DTO)层中重复了业务逻辑(属性级验证).
那可以做些什么呢?
假设我使用AutoMapper之类的自动化工具将我的Domain实体映射到我的ViewModel DTO,那么以某种方式将映射属性的验证逻辑转移到ViewModel也不是很酷吗?
问题是:
1)这是个好主意吗?
2)如果是这样,可以吗?如果没有,有什么替代方案,如果有的话?
提前感谢您的任何输入!
Sam*_*Sam 11
如果您正在使用支持DataAnnotations的东西,您应该能够使用元数据类来包含验证属性:
public class ProductMetadata
{
[NotEmpty, NotShorterThan10Characters, NotLongerThan100Characters]
public string Name { get; set; }
[NotLessThan0]
public decimal Price { get; set;}
}
Run Code Online (Sandbox Code Playgroud)
并将其添加到域实体和DTO上的MetadataTypeAttribute中:
[MetadataType(typeof(ProductMetadata))]
public class Product
Run Code Online (Sandbox Code Playgroud)
和
[MetadataType(typeof(ProductMetadata))]
public class ProductViewModel
Run Code Online (Sandbox Code Playgroud)
这不会与所有验证器一起开箱即用 - 您可能需要扩展您选择的验证框架以实现类似的方法.
验证的目的是确保进入您的应用程序的数据符合某些标准,考虑到这一点,验证属性约束唯一有意义的地方,例如您在此处确定的那些,就是您接受来自不可信的来源(即用户).
您可以使用"money pattern"之类的东西将验证提升到您的域类型系统,并在视图模型中使用这些域类型.如果您有更复杂的验证(即您表达的业务规则需要比单个属性中表达的知识更多的知识),则这些属于应用更改的域模型上的方法.
简而言之,将数据验证属性放在视图模型上,并将它们从域模型中删除.
| 归档时间: |
|
| 查看次数: |
8384 次 |
| 最近记录: |