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 标识为 ControllerTool

在 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有啥区别

mvvm框架和mvc有啥不同

WPF程序中用户界面和业务逻辑相分离有啥好处?

WCF/服务层/存储库层:从服务层返回 DTO?并从返回的 DTO 在 Controller 中创建 ViewModel

MVC与MVVM区别