【发布时间】:2011-01-05 17:26:17
【问题描述】:
我有一个标准的领域层实体:
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 等)并不重要。
在我的客户端层中,我也有一个标准设置,我不使用域实体本身,而是将它们映射到我的视图层使用的 ViewModel(又名 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) 如果可以,可以吗?如果没有,有什么替代方案(如果有的话)?
提前感谢您的任何意见!
【问题讨论】:
-
编辑:我想我应该提到我正在使用 ASP.NET MVC。我最初认为这可能不相关,但后来发现 WinForms/WPF/Silverlight 世界中可能存在其他类型的解决方案(如 MVVM)可能不适用于 Web 堆栈。
-
为什么需要 DTO?为什么不直接绑定到您的实体类?
-
@Josh - 为了建立一个干净的分离级别,以及其他原因。无论如何,我认为讨论 DTO 模式是一个单独的话题。
-
看起来我不是唯一一个问这个问题的人。喜欢的人stackoverflow.com/questions/2181940/…
标签: asp.net-mvc validation domain-driven-design viewmodel dto