【问题标题】:Following Domain Driven Design with MVVM/WPF使用 MVVM/WPF 遵循域驱动设计
【发布时间】:2010-03-20 16:57:53
【问题描述】:

我在这里有普通的 POCO,因为 INotifyPropertyChanged 是视图需要的接口,它在 ViewModel 而不是模型中实现。

现在我想在用户输入数据的每个文本框旁边的视图中显示验证错误。

我不想在我的模型中实现 IDataErrorInfo 接口,因为假设我不允许触摸它们,因为它们来自另一个服务/供应商。

我不想将我的IsCustomerFirstNameLenthValid 方法放入模型中,因为我无法访问它,或者我只是不想污染我的模型,因为接口与那里无关!

如何在 ViewModel 中验证我的裸 POCO 并通过显示验证错误将结果转发到 View ?

【问题讨论】:

    标签: design-patterns validation mvvm domain-driven-design


    【解决方案1】:

    这不是您直接寻找的答案,但为了保持关注点分离,我不会使用您的域 pocos 来组成视图模型。我会将域对象映射到完全独立的视图模型对象。这样,所有视图关注点/管道都可以保留在视图模型上。

    【讨论】:

      【解决方案2】:

      听起来您所说的裸 POCO ViewModel,并且您确实可以访问它们。

      如果是这样,请在它们上实现 IDataErrorInfo(使用您从无法控制的模型对象中获得的任何支持)。将验证放在每个属性设置器中是一个(不太有吸引力)选项,子类化 ValidationRule 也是如此。

      这是 link Paul Stovell 撰写的一篇精彩(尽管已过时)的文章,该文章很好地概述了如何为 WPF 应用程序进行架构验证。

      HTH,
      浆果

      【讨论】:

      • @Berryl 不,我不会在没有实现 IDataErrorInfo 的情况下调用我的普通 POCOs ViewModels. A POCO is a Domain objectl and a ViewModel is the Model of a View. Your link to Paul Stovell also uses IDataErrorInfo for the Domain objects what I do not want see my question. @Daniel hm do not not really understand you. Some language problem... ...to make up the viewmodel? My domain Pocos are not duplicated in the ViewModel they are delegated to quote Josh Smith but this is/was not my problem. I an just interested in validating my POCOs!我找到了一个开始 =>
      • 如果您使用带有 INotifyPropertyChanged 的​​ MVVM 类型的模式,您正在或应该尝试利用数据绑定技术。 IDataErrorInfo 是 WPF 支持的三种基本验证方案之一,我列出了另外两种,Paul Stovell 在他的文章中也列出了。
      • POCO 本身并不意味着域对象或 ViewModel;它们是如何使用的。既然您说域对象是“假设我不允许触摸它们”,这导致我问您可以触摸哪些 POCO。无论如何,Bogard 的文章看起来确实很有趣,这是一个不错的发现。干杯
      【解决方案3】:

      我建议在视图模型而不是模型中进行验证。这将允许您轻松实现 IDateErrorInfo 或其他机制来进行验证。一旦验证通过,您就可以与您的 POCO 模型对象同步。

      如果您绝对必须直接对 POCO 模型对象而不是您的视图模型进行验证,还有另一种选择。您可以使用企业库验证应用程序块 (VAB) 并通过配置而不是会污染 POCO 对象的属性来设置验证规则。您的帖子标题提到了 WPF 而不是 Silverlight,因此您很幸运,因为您可以使用 Bennedik validation control 自动为您处理 UI 中验证错误的显示。

      【讨论】:

      • quote:"...如果您绝对必须直接对 POCO 模型对象而不是您的视图模型进行验证,还有另一种选择..." 但我说我不想在我的 POCO 上进行验证。 ..澄清:POCO =域模型/ class=实体我不想在我的CustomerViewModel中调用它:_customer.IsValid(); // 这样我就必须将我不想要的验证放入我的 POCO 中!我宁愿想要一个像 bool IsCustomerValid(Customer customer) { // 做验证 } 这样的静态方法
      • 简单,然后从您的视图模型中调用 IsCustomerValid(..)。正如其他人所建议的那样,您需要在您的视图模型中向您的模型公开类似的属性,以便 WPF 验证工作。正如 Berryl 在他的回答的链接中所建议的那样,验证可以通过几种方式进行。请注意,IErrorDataInfo 接口可以在模型或视图模型上工作。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-10-06
      • 1970-01-01
      • 2015-10-18
      • 2011-04-10
      • 2013-01-02
      • 2017-11-23
      • 1970-01-01
      相关资源
      最近更新 更多