在使用IDataErrorInfo在MVVM中执行验证时,我应该在哪里执行检查以查看数据库中是否已存在值?

For*_*ter 5 c# validation wpf mvvm idataerrorinfo

开始使用所有这些MVVM的东西,我正在关注Josh Smith的这篇文章,文章讨论了使用MVVM时的验证方法.这个例子很简单,我开始想知道如何在我自己的应用程序中使用它.

在我的BLL中,我有一个BookInfo实现IDataErrorInfo 的类来报告无效值,例如"发布日期不能在将来"或"页数不能为负".然后我AddBookViewModel会检查新创建的状态BookInfo,看看是否存在错误,并且AddBookView将在相应的TextBox旁边显示一个红色blob.那些东西很简单,就像帖子中的例子一样.

现在我的BookInfo班级还有一个作者ID列表.在我的数据库中添加新的BookInfo后,我需要检查这些作者ID是否已经存在.

这个检查应该在我的BookInfo课上完成吗?如果是这样,那么我必须将我的BLL AuthorManager对象传递给BookInfo构造函数,因为前者将包含诸如的方法CheckIfExists(int authorID).

这是推荐的方法吗?如果DB中有很多记录怎么办?动态检查会影响性能吗?

另一方面,在BookInfo课堂上和其他地方执行一些检查似乎有点混乱......特别是当所有这些检查都可以分类到同一组时...即.确保新创建的BookInfo对象有效.或者也许我错了,因为我没有经验来做出正确的判断.

一些指导?

Ste*_*ven 7

我不会这样做.我会保持"内部"完成的验证IDataErrorInfo简单且无上下文.任何依赖于上下文的验证(例如跨实体验证和依赖于数据库的验证)在保存更改时都会执行该验证.

尝试这些更复杂的基于上下文的验证IDataErrorInfo将容易出错并且通常是不可能的.没有上下文,通常不可能可靠地完成这项工作.

我写了一篇关于此的博客文章.虽然它是在验证应用程序块的上下文(没有双关语)中编写的,但它讨论了基于上下文的验证的一般问题.它可能会有所帮助.在这里.


小智 5

我同意Steven的观点,即您在尝试保存数据时应执行服务器端验证.

另一个原因是网络延迟.由于WPF对IDataErrorInfo的支持使用输入事件来确定何时验证属性,并导致对VM对象的阻塞/同步调用,因此使用IDataErrorInfo会直接影响UI的响应性.您无法开始对数据库执行异步调用以执行验证,然后在网络调用完成时将验证错误分派给UI线程.您必须对数据库进行阻塞调用才能获得结果,这可能会在等待调用返回时对UI线程造成严重破坏.

我希望有一天WPF能够获得Silverlight新的INotifyDataErrorInfo接口,它允许我上面描述的异步验证方案.