【问题标题】:Where should I perform a check to see if a value already exists in the database when performing validation in MVVM using IDataErrorInfo?在使用 IDataErrorInfo 在 MVVM 中执行验证时,我应该在哪里执行检查以查看数据库中是否已存在值?
【发布时间】:2011-04-15 14:24:26
【问题描述】:

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

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

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

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

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

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

一些指导?

【问题讨论】:

    标签: c# wpf validation mvvm idataerrorinfo


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-02-11
        • 2011-06-10
        • 2010-09-25
        • 1970-01-01
        • 1970-01-01
        • 2013-06-14
        • 2011-06-02
        相关资源
        最近更新 更多