5

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

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

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

是否应该在我的BookInfo课堂上进行这项检查?如果是这样,那么我必须将 BLL 的AuthorManager对象传递给BookInfo' 的构造函数,因为前者将包含诸如CheckIfExists(int authorID).

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

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

一些指导?

4

2 回答 2

7

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

尝试这些更复杂的基于上下文的验证IDataErrorInfo将容易出错并且通常是不可能的。如果没有上下文,通常不可能可靠地做到这一点。

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

于 2011-04-15T14:35:15.743 回答
5

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

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

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

于 2011-04-15T15:00:40.237 回答