【问题标题】:Is the Model in MVVM a Domain model or POCO?MVVM 中的模型是域模型还是 POCO?
【发布时间】:2016-12-28 13:46:04
【问题描述】:

在 WPF 应用程序的上下文中,可以将我的域模型用作 MVVM 模式中的模型吗?还是模型(在 MVVM 中)应该是一些 POCO?我个人认为没有任何理由反对将域模型用作 MVVM WPF 模式的模型。

但是 XAML 元素会绑定到什么?虚拟机中的属性,下面映射到域模型,对吧?

【问题讨论】:

    标签: wpf mvvm


    【解决方案1】:

    回答标题中提出的问题:两者都不是。

    在 MVVM 中,“模型”通常是视图模型另一侧的所有内容(即视图模型和存储库之间)。模型可以(并且通常是)由几种不同的附加架构和模式组成,在“模型”中包含服务、微服务、DAL 和 DIL、域模型、POCO/数据实体等是很正常的。

    您所说的域对象和 POCO 不是 模型,它们是模型的一部分。您所说的模型的观点是从其他模式(如 MVC)中引入的,其中数据实体或域对象确实是模型。该模型比 MVVM 中的模型要复杂一些。

    您可以直接绑定到 MVVM 中的 POCO,但这通常不是一个好主意,除非它是一个非常简单且不会更改的(例如来自存储库的查找列表)。绑定到域对象通常是一个非常糟糕的主意,因为这些对象将包含与存储和检索相关的额外功能或信息,但对于 UI 中显示的任何内容来说都是多余的。域对象的另一个问题是它们通常不能很好地序列化(如果有的话 - 通常会生成域对象),因此除非您有一个非常简单的模型,否则最好尽快将域对象转换为 POCO。

    因此,正如answer from Owen 中所述,您应该使用视图模型类包装您的 POCO,然后再将它们提供给 UI。唯一不应该的情况是您不需要任何属性更改通知并且您也不想利用对象的任何其他功能(例如,您不需要显示项目上的上下文菜单)。

    【讨论】:

      【解决方案2】:

      但是 XAML 元素会绑定到什么?虚拟机中的属性,下面映射到域模型,对吧?

      是的,您可以在 WPF 应用程序中引用您的 POCO 模型实体类,并将它们包装在实现 INotifyPropertyChanged 接口的视图模型类中,以支持动态更改通知。这很好。

      有关此问题的更多信息,请参阅我对以下问题的回答。

      Correct way to update property in ViewModel from Model

      【讨论】:

        【解决方案3】:

        您可能希望用视图模型包装您的域模型对象。视图模型的目的是以对视图有用的方式从模型中公开数据。对于非常简单的应用程序,为更改通知添加额外的层似乎很麻烦,但随着应用程序变得越来越复杂,绑定一个视图模型层可以帮助保持模型干净。如果您正在做一些快速而肮脏的事情,那么没有什么可以阻止您直接绑定到您的域模型对象。

        【讨论】:

          【解决方案4】:

          是的,只要您的域模型实现 inotifypropertychanged,您就可以使用 xaml 并将其与 VM 属性绑定

          【讨论】:

          • 但这就是问题 - DM 永远不会实现 inotifypropertychanged。所以说VM 包装(域)模型更正确,是吗?
          • 如果你使用实体框架,它为DM创建的Poco实现inotify。甚至 VM 封装了 DM,DM 的底层属性也应该实现 inotify
          猜你喜欢
          • 2014-12-21
          • 2021-02-27
          • 2011-02-22
          • 2010-12-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多