标准的“模型视图控制器”模式和微软的模型/视图/视图模型模式之间有区别吗?
当前回答
从实用的角度来看,MVC(模型-视图-控制器)是一种模式。然而,当MVC作为ASP.net MVC使用时,当与实体框架(EF)和“强大的工具”相结合时,它是一种非常强大的、部分自动化的方法,用于将数据库、表和列引入web页面,用于完整的CRUD操作或仅用于R(检索或读取)操作。至少在我使用MVVM时,视图模型与依赖于业务对象的模型交互,这些业务对象是“手工制作”的,经过大量的努力,能够获得与EF提供的“开箱即用”一样好的模型是很幸运的。从实用编程的角度来看,MVC似乎是一个不错的选择,因为它提供了许多开箱即用的实用程序,但仍然有可能添加一些花哨的功能。
其他回答
我认为要理解这些首字母缩略词的意思,最简单的方法就是暂时忘掉它们。相反,想想它们源自的软件,每一个软件。这实际上可以归结为早期网络和桌面之间的区别。
在2000年代中期,随着复杂性的增长,MVC软件设计模式(在20世纪70年代首次被描述)开始应用于web应用程序。想想数据库、HTML页面和中间的代码。让我们稍微改进一下以达到MVC:对于»database«,让我们假设数据库加接口代码。对于»HTML页面«,让我们假设HTML模板加上模板处理代码。对于»code inbetween«,让我们假设代码将用户单击映射到操作,可能会影响数据库,肯定会显示另一个视图。就是这样,至少为了比较的目的是这样的。
让我们保留这个网页的一个特性,不是像今天那样,而是像十年前那样,当时JavaScript还是一个低级的、卑鄙的烦恼,真正的程序员很好地避开了:HTML页面本质上是愚蠢和被动的。浏览器是一个瘦客户机,或者可以说是一个穷客户机。浏览器中没有智能。整页重载规则。每次都会重新生成»view«。
让我们记住,尽管这种网络方式风靡一时,但与桌面相比,它是非常落后的。桌面应用程序是胖客户端,也可以说是富客户端。(甚至像Microsoft Word这样的程序也可以被视为某种客户端,文档客户端。)他们是充满智慧的客户,对自己的数据了如指掌。他们是有状态的。它们在内存中缓存正在处理的数据。没有整页重载这种废话。
这种富桌面方式可能就是第二个首字母缩写MVVM的起源。不要被字母所迷惑,也不要被c的省略所迷惑。他们必须如此。没有东西被移除。我们只增加了一件事:状态性,缓存在客户端上的数据(以及处理这些数据的智能)。该数据(本质上是客户机上的缓存)现在被称为»ViewModel«。它允许丰富的交互性。就是这样。
MVC =模型、控制器、视图=本质上的单向通信=交互性差 MVVM =模型、控制器、缓存、视图=双向通信=丰富的交互性
我们可以看到,通过Flash、Silverlight,以及最重要的JavaScript, web已经拥抱了MVVM。浏览器不能再被合法地称为瘦客户机。看看它们的可编程性。看看他们的内存消耗。看看现代网页上所有的Javascript交互。
就我个人而言,我发现这个理论和缩略语业务更容易理解,看看它在具体现实中指的是什么。抽象的概念是有用的,特别是在具体的问题上,所以理解可能会有一个完整的循环。
MVVM是表示模型模式的改进(有争议)。我说有争议,因为唯一的区别是WPF如何提供数据绑定和命令处理的能力。
在web开发中,MVC是服务器端,MVVM是客户端(浏览器)。
大多数情况下,浏览器中的MVVM使用javascript。mvc有很多服务器端技术。
在MVVM中,控制器不会被ViewModel取代,因为ViewModel的功能与控制器完全不同。你仍然需要一个控制器,因为如果没有控制器,你的模型、视图模型和视图就做不了什么…在MVVM中你也有一个控制器,MVVM这个名字是错误的。
在我看来,MVVMC是正确的名字。
正如你所看到的,ViewModel只是MVC模式的一个附加。它将转换逻辑(例如将对象转换为字符串)从控制器移动到ViewModel。
对于不太熟悉架构模式主题的人来说,其他答案可能不太容易理解。对应用程序架构不熟悉的人可能想知道它的选择在实践中如何影响她的应用程序,以及在社区中有什么大惊小怪的。
为了更好地解释上述问题,我编写了这个涉及MVVM、MVP和MVC的剧本。故事开始于一个用户点击电影搜索应用程序中的“FIND”按钮…
用户:单击…
观点:那是谁?[MVVM|MVP|MVC]
用户:我只是点击了搜索按钮……
视图:好的,稍等... .(MVVM MVP | | MVC)
(视图调用ViewModel|Presenter|Controller…)
视图:嘿,ViewModel|Presenter|Controller,一个用户刚刚点击了搜索按钮,我该怎么做?(MVVM MVP | | MVC)
ViewModel|Presenter|Controller:嘿View,这个页面上有搜索词吗?(MVVM MVP | | MVC)
查看:是的,…在这里…" piano " [MVVM|MVP|MVC]
这是MVVM和MVP|MVC之间最重要的区别
演示者|控制器:谢谢视图,…同时我正在模型上查找搜索词,请给他/她一个进度条[MVP|MVC]
(演示者|控制器正在调用模型…)
ViewModel:谢谢,我会在模型上查找搜索词,但不会直接更新你。相反,如果有任何结果,我将触发事件来searchResultsListObservable。所以你最好仔细观察一下。(MVVM)
(当在searchResultsListObservable中观察任何触发器时,视图认为它应该向用户显示一些进度条,因为ViewModel不会在那上面与它对话)
——————————————————————————————
ViewModel|演示者|控制器:嘿,模型,你有匹配这个搜索词吗?: " piano " [MVVM|MVP|MVC]
Model: Hey ViewModel|Presenter|Controller, let me check…[MVVM|MVP|MVC]
(模型正在向电影数据库查询…)[MVVM|MVP|MVC]
(过了一会儿……)
————这是MVVM, MVP和MVC————-之间的分歧点
模型:我为你找到了一个列表,ViewModel|Presenter,这里是JSON“[{" name ": "钢琴老师","年份":2001},{" name ": "钢琴","年份":1993}]" [MVVM|MVP]
模型:有一些结果可用,控制器。我已经在我的实例中创建了一个字段变量,并将其填充为结果。它的名字是searchResultsList [MVC]
(演示者|控制器感谢模型并返回视图)[MVP|MVC]
主持人:感谢您的等待,View,我为您找到了匹配结果的列表,并将它们以像样的格式排列:["钢琴老师2001″,"钢琴1993 "]。同时,现在请隐藏进度条[MVP]
控制器:感谢等待视图,我已经询问了模型关于你的搜索查询。它说它已经找到了一个匹配结果列表,并将它们存储在其实例内名为“searchResultsList”的变量中。你可以从那里得到它。同时,现在请隐藏进度条[MVC]
ViewModel: searchResultsListObservable上的任何观察者都将被通知有这样一个像样格式的新列表:[" Piano Teacher 2001″," Piano 1993 "]。
视图:非常感谢主讲人[MVP]
视图:谢谢你“控制器”[MVC](现在视图在问自己:我应该如何将我从模型得到的结果呈现给用户?电影的制作年份是先写还是后写?)
视图:哦,在searchResultsListObservable中有一个新的触发器…,很好,有一个像样的列表,现在我只需要在列表中显示它。有了结果之后,我还应该隐藏进度条。(MVVM)
如果你感兴趣,我在这里写了一系列文章,通过实现一个电影搜索android应用程序来比较MVVM、MVP和MVC。
推荐文章
- [Vue警告]:找不到元素
- 模板方法和策略模式之间的区别是什么?
- MVC中的业务逻辑
- 将WPF组合框绑定到自定义列表
- 如何在Kotlin中实现生成器模式?
- 工厂模式和策略模式之间的区别是什么?
- 如何向一个5岁的孩子解释依赖注入?
- 我怎么知道什么时候创建一个接口?
- 在PHP5中创建单例设计模式
- 什么时候我们应该使用观察者和可观察对象?
- 在哪里放置AutoMapper.CreateMaps?
- 使用Enum实现单例(Java)
- 由Jon Skeet撰写的《Singleton》澄清
- 为什么c#不提供c++风格的'friend'关键字?
- Java / Jakarta EE web开发,我从哪里开始,我需要什么技能?