【发布时间】:2011-06-09 03:49:11
【问题描述】:
在查找有关在 WPF MVVM 中进行属性验证的最佳实践的教程时,我看到很多人使用接口 IDataErrorInfo 我只是想知道是否可以像在 ASP .Net MVC 中使用的那样设置自动验证使用属性?
谁能推荐 MVVM 中模型验证的最佳实践是什么?验证应该在基础模型类上吗?还是在视图模型类上?
【问题讨论】:
标签: wpf asp.net-mvc-3 mvvm .net-4.0
在查找有关在 WPF MVVM 中进行属性验证的最佳实践的教程时,我看到很多人使用接口 IDataErrorInfo 我只是想知道是否可以像在 ASP .Net MVC 中使用的那样设置自动验证使用属性?
谁能推荐 MVVM 中模型验证的最佳实践是什么?验证应该在基础模型类上吗?还是在视图模型类上?
【问题讨论】:
标签: wpf asp.net-mvc-3 mvvm .net-4.0
Silverlight 有一个名为 DataForm 的控件,它使用 DataAnnotations 属性工作,有人对port that control to WPF 非常友好。我相信这正是您正在寻找的东西。
【讨论】:
这些都是好问题!验证属于模型和视图模型。以下是我通常的处理方式:
首先,我在模型中尽可能多地进行验证 - 这些将是独立于给定演示的规则。例如,假设您的域中的员工如果没有不为 null 的 EmployeeNumber 属性且长度为六个字符,并且六个字符中的每个字符都必须是数字,则该员工无效。
其次,我有一个实现 IDataErrorInfo 的基本 ViewModel 类。在这个基类中,我基本上询问模型是否有效,如果不是则触发错误(借助 IDataErrorInfo 很容易转换为视图)。我也把 IDataError info 的实现方法做成虚拟的,因为...
最后,模型无法捕捉到给定演示文稿特有的边缘情况。对于一个(人为的)示例,假设您有一个演示文稿,其中只有输入了他的名字和姓氏的员工才有效,而另一个演示文稿也需要中间名首字母。虽然您当然可以并且应该在 Employee 中拥有一个 FullName 组件/valueObject 属性来验证该属性是否为空,但您需要为每个演示文稿创建一个子类 ViewModel 以了解 Fullame 属性的用户条目在这种情况下是否有效。
最后,您可以并且应该使用 Validator 进行模型验证 - 我喜欢 NHibernateValidator,但肯定还有其他(非常)好的可用。它们中的大多数,包括 NHibernate 的,都将支持您正在寻找的属性验证。然而,我更喜欢更简洁的属性替代方案,即我在一个单独的项目(即 MyDomainImpl)中为我的验证器设置所有验证规则。更清晰,即模型中的噪音更少,关注点分离更清晰。
如果您需要,请随时提出问题也给自己一些时间来解决这个问题,直到您找到适合您的方法 - 这不是一个微不足道的话题。
HTH,
浆果
【讨论】:
我的看法是验证应该在 ViewModel 上而不是在 Model 上,因为:
如果您为您的应用程序使用任何依赖注入工具,例如 Unity、Windsor Castle 等,您可以使用拦截器来验证 ViewModel。在调用 ViewModel 方法之前首先调用拦截器。
可以在此处找到使用 Castle 拦截器的示例 - http://www.castleproject.org/container/documentation/trunk/usersguide/interceptors.html
【讨论】:
验证逻辑放在哪里?
软件系统大多需要某种 验证以确保 业务逻辑必须处理 只有正确的数据。这些验证 规则由业务定义 模型,所以领域层是 实施它们的正确位置。只是 请记住,您不会开始 复制验证码 业务对象。
.
您可能对 WPF Application Framework (WAF) 的示例应用程序感兴趣。它们展示了如何将 .NET DataAnnotations 验证属性与 MVVM 模式一起使用。
【讨论】: