ViewModel 和 Controller 有啥区别?
Posted
技术标签:
【中文标题】ViewModel 和 Controller 有啥区别?【英文标题】:What's the difference between a ViewModel and Controller?ViewModel 和 Controller 有什么区别? 【发布时间】:2010-12-25 20:11:26 【问题描述】:一个人与另一个人的责任是什么? 一种与另一种应该采用什么样的逻辑? 哪一个命中服务和数据库? 我如何决定我的代码应该放在视图模型中还是控制器中?
作为记录,我使用的是 ASP MVC,但由于问题是架构问题,我认为我使用什么语言或框架并不重要。我邀请所有 MVC 响应
【问题讨论】:
【参考方案1】:模型代表您的数据及其操作方式。因此,模型触及 DB。
视图是您的用户界面。
控制器是它们之间的粘合剂。
【讨论】:
【参考方案2】:应该调用一些逻辑和模型来生成一些数据(结构化或半结构化)。从这个数据返回的页面/JSON/等。被创建,通常只有基本的大纲逻辑。
第一部分(创建数据)由控制器完成(通常通过模型)。第二部分——由视图。 ViewModel 是控制器和视图之间传递的数据结构,通常只包含访问器。
【讨论】:
【参考方案3】:模型-视图-控制器 (MVC) 是一种架构设计模式,主要用于将业务逻辑与表示分离。基本上,你不希望你的后端碰到你的前面。它通常看起来像这样:
这样做的原因是,通过分离后端和前端,您不会将用户界面直接绑定到您的数据/工作。这允许您将新接口放入您的业务逻辑而不影响所述逻辑。此外,它还提高了测试的便利性。
MVC 派上用场的一个简单示例 - 假设您有一个管理公司财务的应用程序。现在,如果您正确使用 MVC,您可以在某个金融家的办公桌上拥有一个前端,让他处理交易、管理财务等。但是,因为业务逻辑是独立的,您也可以提供一个前端发送给您的 CEO 的 Blackberry,让他了解业务的当前状态。因为两个前端不同,它们可以做不同的事情,同时仍然提供(不同类型的)数据访问。
编辑:
由于您稍微更新了您的问题,我将更新我的答案。 MVC的分离没有完美的科学。然而,有一些很好的经验法则。例如,如果您在谈论 GUI 组件,那可能是一个视图。 (您是在谈论外观和感觉、可用性等吗?)如果您在谈论数据和房屋的“业务”方面(数据库、逻辑等),您可能指的是模型。而且,任何控制两者之间交互的东西很可能是控制器。
此外,应该注意的是,虽然视图和模型通常是“物理上”分离的,但控制器可以在有意义的情况下与视图一起存在。
当您说 MVC 的框架(甚至语言)无关紧要时,您是对的。该模式本身与语言无关,并且真正描述了一种构建系统的方法。
希望有帮助!
【讨论】:
我喜欢“语言不可知论”这个短语。 谢谢,可以扩展视图模型和控制器之间的区别吗?【参考方案4】:我认为学习公认的教义是有价值的。但是,理解教义是如何形成的也很有价值。
Trygve Reenskaug 因发明 MVC 而广受赞誉。 N. Alex Rupp 的文章 Beyond MVC: A new look at the servelet architecture 包含 MVC 的历史。在 Reenskaug 1978 年在施乐帕洛阿尔托研究中心工作的部分中,有一个指向他的论文 Thing-Model-View-Editor: an Example from a planningsystem 的链接。那里的作品是这样描述的。
事物
用户感兴趣的东西。它可以是混凝土的,比如房子或集成的 电路。它可以是抽象的,例如关于论文的新想法或观点。可以是一个整体 像一台计算机,或者一个零件,像一个电路元件。
型号
模型是计算中数据形式的抽象的主动表示 系统
查看
对于任何给定的模型,都附加了一个或多个视图,每个视图都能够 在屏幕和硬拷贝上显示模型的一个或多个图形表示。一种 View 也能够对合理关联的模型执行此类操作 与那个视图。
编辑器
编辑器是用户与一个或多个视图之间的接口。它为用户提供了合适的命令系统,例如可以动态变化的菜单形式 根据目前的情况。它为视图提供了必要的协调和 命令消息。
Rupp 将 Reenskaug 的 Editor 标识为 Controller 或 Tool。
在 SmallTalk-80 中出现了 MVC 三元组。模型是现实世界概念的抽象,视图是它的视觉表示,控制器是允许用户与之交互的按钮和滑块(从而“控制”视图)。三元组中的所有部分都是相互连接的,并且可以与其他两个部分进行通信,因此不涉及分层或抽象。从那时起,Reenskaug 就“更喜欢使用工具而不是控制器这个词”。根据他的笔记,这些是他在后来的实现中使用的术语
【讨论】:
【参考方案5】:ViewModel 是一种模式,用于处理视图的表示逻辑和状态,控制器是任何 MVC 框架的基础部分之一,它响应任何 http 请求并协调所有后续操作,直到 http 响应。
ViewModel 模式:More info
在 ViewModel 模式中,UI 和 任何 UI 逻辑都封装在一个 看法。 View 观察一个 ViewModel 它封装了表示逻辑 和状态。 ViewModel 依次 与模型交互并充当 它和它之间的中介 查看。
View <-> ViewModel <-> Model
控制器(来自前端控制器模式):More Info
它“提供了一个集中的入口点 用于处理请求。”
HTTP Request -> Controller -> (Model,View)
--明显的区别:--
虽然 ViewModel 是可选的 模式控制器是必须的,如果 您将采用 MVC 方式。 ViewModel 封装 表示逻辑和状态, 控制器编排所有 申请流程。【讨论】:
【参考方案6】:MVC 代表模型、视图、控制器。
模型 = 数据(数据库表)
视图 = html、CSS、javascript 等
Controller = 主逻辑,模型和视图之间的契约。
简而言之,
MVC 允许您以分离业务数据和演示数据的方式开发应用程序。有了这个,开发人员和设计人员可以在 MVC 应用程序上独立工作,而不会发生工作冲突。 MVC 使您的应用也可以使用 OOP。
【讨论】:
【参考方案7】: ViewModel 可以在客户端也可以在服务器端。 无论在哪里,viewmodel 的唯一目的就是播放 演示数据。 在 MVC 架构中,Viewmodel 不是强制性的,但如果没有控制器,则无法处理来自客户端的请求。 控制器可以可视化为客户端和服务器之间的主要接口,以获取服务器的任何响应。它处理客户端请求,从存储库中获取数据,然后准备视图数据。 Viewmodel 可以被可视化为视图数据处理器/呈现器,从而成为更雄辩地管理视图的界面。 在 Web 应用程序的整体上下文中,我们可以说控制器是应用程序请求处理程序,而视图模型只是 UI 处理程序。【讨论】:
我提出这个问题是因为我想知道 MVC 和 MVVM 之间的区别是什么,但如果我是正确的,根据您的说明,MVVM 是 MVC 的一个子集。 @OgierSchelvis,不,它们是不同的,您也可以拥有 MVVMC(两者的混合体)。以上是关于ViewModel 和 Controller 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章
MVVM模式下,ViewModel和View,Model有啥区别
MVVM模式下,ViewModel和View,Model有啥区别
WCF/服务层/存储库层:从服务层返回 DTO?并从返回的 DTO 在 Controller 中创建 ViewModel