关于 MVP 和 MVVM 的一些混淆
在问这个问题之前,我已经阅读了很多关于 MVP 和 MVVM 的文章。 (例如:http://martinfowler.com/eaaDev/uiArchs.html)
但是当开始富客户端应用程序开发时,我对这两种模式仍然有些困惑。
- 模型在 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)?
或者只是将外部服务调用放在单独的模型层中?
非常感谢:-)
最佳答案
MVC 最初将模型定义为“digital model that exists in the computer”,而不是“人类用户的心智模型”。因此,这是一个非常模糊的概念,几乎可以涵盖您想要的任何现实,尽管此后出现的无数 MV* 实现引入了更多固执己见的定义。
思想流派中的一个传统冲突是 MVC/P 中的模型应该是领域对象还是仅仅反射(reflect)呈现给用户的内容。 MVVM 对此给出了明确的答案(参见 2. 和 3.)
不,因为 ViewModel 只是一个短暂的内存结构,代表屏幕上显示的内容。如果说 MV* 模式中有什么值得坚持的,那就是模型。
MVVM 的存在是为了尝试将业务模型 (M) 与 UI 屏幕 (VM) 的数据和行为分开,而 MVP 并未明确说明这一区别。 MVVM 中没有模型的两个副本,M 和 VM 并不冗余,因为它们并不总是具有相同的数据,并且它们从不具有相同的行为。
例如,
UserCredentials
模型对象将包含登录名和密码字段,而相应的UserCredentialsViewModel
可能包含额外的ConfirmPassword 字段和VerifyPasswordMatchesConfirm()
方法,因为这就是向用户显示的内容。另一个主要区别是基于事件的数据绑定(bind)的存在 在 MVVM 中,MVP 中不存在。结果之一就是你经常会 查看客户端使用的 MVVM 模式 允许这种绑定(bind)的技术(Javascript、WPF),而 MVP 是 主要用于服务器端(主要是 ASP.NET)。 MVP 并不比 MVVM 更好,它们只是适合不同的生态系统。
Presenter 和 ViewModel 顾名思义,就是 UI 野兽。如果您将 DTO 传递给他们,他们可能能够看到远程服务调用产生的 DTO,但他们不应该调用远程服务,因为这样做不是表示对象的责任。您应该在单独的基础设施服务中执行此操作。
关于design-patterns - 关于 MVP 和 MVVM 的一些混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31871877/