标准的“模型视图控制器”模式和微软的模型/视图/视图模型模式之间有区别吗?
当前回答
首先,MVVM是使用XAML处理显示的MVC模式的发展。本文概述了这两者的一些方面。
模型/视图/视图模型架构的主要目的似乎是在数据(“模型”)之上,还有另一层非可视组件(“视图模型”),它将数据的概念更紧密地映射到数据的视图(“视图”)的概念。视图绑定的是ViewModel,而不是直接绑定模型。
其他回答
一般来说,MVC用于Web开发,MVVM在WPF/Silverlight开发中最受欢迎。 然而,有时web架构可能混合使用MVC和MVVM。
例如:你可能会使用knockout.js,在这种情况下,你的客户端上会有MVVM。 你的MVC的服务器端也可以改变。在复杂的应用程序中,没有人使用纯模型。使用ViewModel作为MVC的“模型”可能有一定的意义,而你真正的模型基本上将是这个VM的一部分。这为您提供了一个额外的抽象层。
从实用的角度来看,MVC(模型-视图-控制器)是一种模式。然而,当MVC作为ASP.net MVC使用时,当与实体框架(EF)和“强大的工具”相结合时,它是一种非常强大的、部分自动化的方法,用于将数据库、表和列引入web页面,用于完整的CRUD操作或仅用于R(检索或读取)操作。至少在我使用MVVM时,视图模型与依赖于业务对象的模型交互,这些业务对象是“手工制作”的,经过大量的努力,能够获得与EF提供的“开箱即用”一样好的模型是很幸运的。从实用编程的角度来看,MVC似乎是一个不错的选择,因为它提供了许多开箱即用的实用程序,但仍然有可能添加一些花哨的功能。
mvmc,或者MVC+,对于企业和快速应用程序开发来说似乎是一种可行的方法。虽然将UI与业务和交互逻辑分开很好,但“纯”MVVM模式和大多数可用示例在单一视图上工作得最好。
对您的设计不太确定,但我的大多数应用程序都包含页面和几个(可重用的)视图,因此ViewModels确实需要在某种程度上进行交互。使用页面作为控制器将完全违背MVVM的目的,因此不为底层逻辑使用“VM-C”方法可能会导致..嗯. .随着应用程序的成熟,具有挑战性的构造。即使在VB-6中,我们中的大多数人也可能停止了对Button事件进行业务逻辑编码,并开始将命令“中继”到控制器,对吗?我最近研究了许多关于这个主题的新兴框架;我最喜欢的显然是Magellan(在codeplex)方法。编码快乐!
http://en.wikipedia.org/wiki/Model_View_ViewModel#References
MVVM将视图模型添加到混合中。这很重要,因为它允许您大量使用WPF的绑定方法,而无需将所有特定于UI的部分放在常规模型中。
我可能是错的,但是我不确定MVVM真的强迫控制器混合。我发现这个概念更符合:http://martinfowler.com/eaaDev/PresentationModel.html。我认为人们选择将其与MVC结合起来,而不是将其内置到模式中。
我曾经认为MVC和MVVM是一样的。现在,由于Flux的存在,我可以分辨出其中的区别:
在MVC中,对于你应用中的每个视图,你都有一个模型和一个控制器,我称之为视图,视图模型,视图控制器。该模式并没有告诉您一个视图如何与另一个视图通信。因此,在不同的框架中有不同的实现。例如,在某些实现中,控制器之间相互通信,而在其他实现中,有另一个组件在它们之间进行中介。甚至还有视图模型相互通信的实现,这打破了MVC模式,因为视图模型应该只由视图控制器访问。
在MVVM中,每个组件都有一个视图模型。该模式没有指定视图应该如何影响视图模型,所以通常大多数框架只在视图模型中包含控制器的功能。但是,MVVM确实告诉您,视图模型的数据应该来自模型,这是整个模型,它不知道或自定义特定的视图。
为了说明差异,让我们以Flux模式为例。Flux模式告诉我们应用中的不同视图应该如何通信。每个视图侦听一个存储,并使用分派器触发操作。分派程序依次将刚刚执行的操作告知所有存储,然后存储更新自己。Flux中的存储对应于MVVM中的(通用)模型。它不是针对任何特定视图定制的。所以通常当人们使用React和Flux时,每个React组件实际上都实现了MVVM模式。当一个动作发生时,视图模型调用分派器,最后它根据存储(即模型)中的变化得到更新。你不能说每个组件都实现了MVC,因为在MVC中只有控制器才能更新视图模型。因此MVVM可以和Flux一起工作(MVVM处理视图和视图模型之间的通信,Flux处理不同视图之间的通信),而MVC不能在不破坏关键原则的情况下与Flux一起工作。
推荐文章
- 在PHP5中创建单例设计模式
- 什么时候我们应该使用观察者和可观察对象?
- 在哪里放置AutoMapper.CreateMaps?
- 使用Enum实现单例(Java)
- 由Jon Skeet撰写的《Singleton》澄清
- 为什么c#不提供c++风格的'friend'关键字?
- Java / Jakarta EE web开发,我从哪里开始,我需要什么技能?
- 我能在视图中得到当前控制器的名称吗?
- 我应该使用什么MVVM框架?
- 什么是包装器类?
- MVC, MVP和MVVM设计模式在编码c#方面有什么不同
- MVVM:从开始到结束的教程?
- 安卓视图模型与视图模型
- 设计模式:工厂vs工厂方法vs抽象工厂
- 用MVVM处理WPF中的对话框