design-patterns - 关于 MVP 和 MVVM 的一些混淆

标签 design-patterns mvvm architecture mvp

关于 MVP 和 MVVM 的一些混淆

在问这个问题之前,我已经阅读了很多关于 MVP 和 MVVM 的文章。 (例如:http://martinfowler.com/eaaDev/uiArchs.html)

但是当开始富客户端应用程序开发时,我对这两种模式仍然有些困惑。

  1. 模型在 MVP 和 MVVM 中的含义是什么?

例如,富客户端应用程序将同时使用本地数据库和远程服务。

在业务层,有两种对象!

从我的本地数据库读取的域对象。

Session对象,用于保持持久连接(例如:异步观看在线用户)

Domain 对象是 Model,这是正确的,但是我是否需要一个特殊的模型层来管理在线用户(或字符消息),然后映射到 ViewModel?或者直接将这些数据设置到ViewModel? (映射是多余的吗?由于一个ViewModel可以有多个 View ,所以ViewModel和Model很相似)

  • 在MVVM中,ViewModel可以持久化到数据库吗?
  • 例如,想象一个聊天应用程序,即使您在离线环境中打开该应用程序,您仍然应该能够在聊天窗口中看到最近的消息。

    但是这些最近的消息都在 ViewModel 中,我们应该将 ViewModel 持久化到数据库吗? (它们到底是 Model 还是 ViewModel?)

  • MVP 比 MVVM 更好吗?
  • 在MVP中,只有一个“模型层”,所以我可以在这个模型层中管理和存储domian对象和 session 对象。所有 View 特殊状态都在 View 中,不会被持久化。 Presenter将控制 View 状态并在模型和 View 之间同步数据。

    在MVVM中,有两个“模型层”(Model和ViewModel), View 状态和Model的副本存储在ViewModel中。那么模型的副本是多余的吗?

  • Presenter 或 ViewModel 是否应该能够查看特殊外部服务的数据传输对象 (DTO)?
  • 或者只是将外部服务调用放在单独的模型层中?

    非常感谢:-)

    最佳答案

    1. MVC 最初将模型定义为“digital model that exists in the computer”,而不是“人类用户的心智模型”。因此,这是一个非常模糊的概念,几乎可以涵盖您想要的任何现实,尽管此后出现的无数 MV* 实现引入了更多固执己见的定义。

      思想流派中的一个传统冲突是 MVC/P 中的模型应该是领域对象还是仅仅反射(reflect)呈现给用户的内容。 MVVM 对此给出了明确的答案(参见 2. 和 3.)

    2. 不,因为 ViewModel 只是一个短暂的内存结构,代表屏幕上显示的内容。如果说 MV* 模式中有什么值得坚持的,那就是模型。

    3. MVVM 的存在是为了尝试将业务模型 (M) 与 UI 屏幕 (VM) 的数据和行为分开,而 MVP 并未明确说明这一区别。 MVVM 中没有模型的两个副本,M 和 VM 并不冗余,因为它们并不总是具有相同的数据,并且它们从不具有相同的行为。

      例如,UserCredentials 模型对象将包含登录名和密码字段,而相应的 UserCredentialsViewModel 可能包含额外的ConfirmPassword 字段和VerifyPasswordMatchesConfirm() 方法,因为这就是向用户显示的内容。

      另一个主要区别是基于事件的数据绑定(bind)的存在 在 MVVM 中,MVP 中不存在。结果之一就是你经常会 查看客户端使用的 MVVM 模式 允许这种绑定(bind)的技术(Javascript、WPF),而 MVP 是 主要用于服务器端(主要是 ASP.NET)。 MVP 并不比 MVVM 更好,它们只是适合不同的生态系统。

    4. Presenter 和 ViewModel 顾名思义,就是 UI 野兽。如果您将 DTO 传递给他们,他们可能能够看到远程服务调用产生的 DTO,但他们不应该调用远程服务,因为这样做不是表示对象的责任。您应该在单独的基础设施服务中执行此操作。

    关于design-patterns - 关于 MVP 和 MVVM 的一些混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31871877/

    相关文章:

    architecture - 领域服务与应用服务

    java - 具有通用返回类型的命令模式

    objective-c - 硬件设备 Controller 的设计模式

    javascript - 如何使用 requireJS 访问模块变量?

    c# - 绑定(bind)复选框状态不会触发 OnPropertyChanged

    architecture - "Reusable Business Component"是神话吗?

    c# - 缩放单例

    c# - ViewModel 中的操作以及 xaml.cs 文件中的操作

    c# - 将 ListView 与包含 UserControls 的 DataTemplates 绑定(bind)到 MVVM 中的 ViewModels

    php - 构建一个 'multi-site' 应用程序