MVC和MVVM有什么区别?
标准的“模型视图控制器”模式和Microsoft的模型/视图/视图模式模式之间是否有区别?
MVC / MVVM不是一个/或选择。
这两种模式在ASP.Net和Silverlight / WPF开发中都以不同的方式出现。
对于ASP.Net,MVVM用于在视图内双向绑定数据。 这通常是客户端实现(例如使用Knockout.js)。 另一方面,MVC是在服务器端分离问题的一种方式。
对于Silverlight和WPF,MVVM模式更具包容性,似乎可以替代MVC(或将软件组织为单独职责的其他模式)。 经常出现这种模式的一个假设是, ViewModel
简单地替换了MVC
的控制器(就像你可以用VM
替换C
中的首字母缩写词一样,所有东西都会被原谅)......
ViewModel并不一定取代单独控制器的需要。
问题是:要独立测试*,尤其是在需要时可重用,视图模型不知道视图显示的是什么,但更重要的是不知道其数据来自何处。
*注意:实际上,控制器从ViewModel中删除了大部分需要单元测试的逻辑。 虚拟机然后变成一个愚蠢的容器,只需要很少的测试。 这是一件好事,因为虚拟机只是设计师和编码人员之间的桥梁,所以应该保持简单。
即使在MVVM中,控制器通常会包含所有处理逻辑,并决定使用哪些视图模型在哪些视图中显示哪些数据。
从迄今为止我们所看到的ViewModel模式的主要优点,即从XAML代码中移除代码以使XAML编辑成为一项更加独立的任务。 当需要时,我们仍然创建控制器来控制(无双关语)应用程序的整体逻辑。
我们遵循的基本MVCVM指导原则是:
我们还注意到Sculpture代码生成框架实现了MVVM和一个类似于Prism的模式,并且它还广泛使用控制器来分离所有用例逻辑。
不要认为控制器被视图模型过时了。
我已经开始撰写关于这个主题的博客,我会尽可能地补充。 将MVCVM与常用导航系统相结合存在问题,因为大多数导航系统只是使用视图和虚拟机,但我将在后面的文章中介绍。
使用MVCVM模型的另一个好处是只有控制器对象需要在应用程序的整个生命周期内存在内存中,并且控制器主要包含代码和很少的状态数据(即微小的内存开销)。 与需要保留视图模型的解决方案相比,这使得内存密集型应用程序少得多,并且它非常适合某些类型的移动开发(例如,使用Silverlight / Prism / MEF的Windows Mobile)。 这当然取决于应用程序的类型,因为您可能仍需要保留偶尔缓存的虚拟机以实现响应。
注意:这篇文章经过多次编辑,并没有专门针对狭义问题,所以我已经更新了第一部分,现在也覆盖了这一点。 在下面的评论中,大部分讨论只涉及ASP.Net而不是更广泛的图景。 本文旨在涵盖Silverlight,WPF和ASP.Net中更广泛使用的MVVM,并尝试避免人们用ViewModel替换控制器。
我认为理解这些缩写词意味着什么的最简单方法就是暂时忘掉它们。 相反,想想他们的软件,他们每一个。 这真的归结为早期的网络和桌面之间的区别。
第一个缩写MVC起源于网络。 (是的,它之前可能已经存在,但网络是如何普及到大量Web开发人员的。)考虑数据库,HTML页面和代码之间的代码。 我们来简单介绍一下MVC:对于»数据库«,我们假设数据库加接口代码。 对于»HTML页面«,我们假设HTML模板和模板处理代码。 对于»代码介于中间«,我们假设代码映射用户点击操作,可能影响数据库,肯定会导致显示另一个视图。 就是这样,至少就此比较而言。
让我们保留这个网络资料的一个特征,而不是像现在这样,但是正如它在十年前存在的那样,当Javascript是一种卑鄙的,卑鄙的烦恼时,真正的程序员很好地避开了:HTML页面本质上是愚蠢的和被动的。 浏览器是一个瘦客户端,或者如果你愿意的话,一个穷人的客户端。 浏览器中没有智能。 整页重新加载规则。 每次都会重新生成»view«。
让我们记住,尽管风靡一时,但这种网络方式与台式机相比却非常落后。 如果您愿意,桌面应用程序是胖客户端或富客户端。 (即使像Microsoft Word这样的程序也可以被认为是客户端,也就是文档客户端。)他们是充满智能的客户,充分了解他们的数据。 他们是有状态的。 他们缓存他们在内存中处理的数据。 没有像整页重新加载这样的垃圾。
而这种丰富的桌面方式可能是第二个缩写起源MVVM的地方。 不要被这些信件所愚弄,因为C的遗漏。控制者仍然存在。 他们需要成为。 没有东西被删除。 我们只是添加一件事:有状态,在客户端缓存的数据(并且还有智能来处理这些数据)。 该数据本质上是客户端上的缓存,现在被称为»ViewModel«。 这就是丰富的交互性。 就是这样。
我们可以看到,使用Flash,Silverlight和 - 最重要的是 - Javascript,网络已经接受了MVVM。 浏览器不能再被合法地称为瘦客户机。 看看他们的可编程性。 看看他们的内存消耗。 看看现代网页上的所有Javascript交互性。
就我个人而言,通过查看它在具体实际中指的是什么,我发现这个理论和缩写业务更容易理解。 抽象的概念是有用的,特别是当在具体问题上进行展示时,所以理解可能会完整。
MVVM Model-View ViewModel与MVC, Model-View Controller类似
控制器被替换为ViewModel 。 ViewModel位于UI层下面。 ViewModel公开视图需要的数据和命令对象。 你可以把它看作是一个容器对象,这个容器对象可以从中获取数据和动作。 ViewModel从模型中提取数据。
罗素东做了一个博客更详细的讨论为什么MVVM是不同于MVC
链接地址: http://www.djcxy.com/p/5117.html