知识卡片

MVC在Web场景下的重新诠释与"输入控制器"术语由来

结构图卡

内容

模型-视图-控制器(MVC)是一个被广泛引用却常常被误解的模式,作者认为在Web应用出现之前,几乎所有对MVC表现层的理解都是错的。误解的一大根源在于”控制器”这个词本身被用在太多不同语境里,含义并不统一——为了避免混淆,作者更愿意用”输入控制器”specifically指代MVC里那个处理HTTP请求的角色:一条请求消息进入输入控制器,输入控制器从中提取信息后,把业务逻辑转交给合适的模型对象;模型对象与数据源交互、完成处理并收集应答信息后,把控制权交还给输入控制器;输入控制器再决定用哪个视图来渲染应答——这中间通常还要经过把数据放进某个HTTP会话对象、供输入控制器与视图共享这一步,而不是输入控制器直接把数据塞给视图。使用MVC最重要的理由是保证模型与Web表现层彻底分离:这样修改表现层、或者给同一套领域逻辑加一层新的表现层都会很容易,把处理逻辑放进独立的事务脚本或领域模型对象也让测试变得容易——如果视图用的是服务器页面技术,这层分离尤其关键,能避免业务逻辑和页面结构混杂在一起。

结构图

flowchart LR
  R["请求消息"] --> IC["输入控制器<br/>提取信息"]
  IC -->|"业务逻辑转交"| M["模型<br/>与数据源交互/处理"]
  M -->|"控制权交还+应答信息"| IC
  IC -->|"决定视图<br/>经由共享的HTTP会话对象"| V["视图<br/>渲染应答"]

参考来源

- 位置:《企业应用架构模式》第一部分"表述"之"第4章 Web表现层"(源文件:_epub-src/OEBPS/Text/000027.html) - 结论依据:原文说明"事实上,在Web应用程序出现之前,几乎所有关于模型-视图-控制器的表现层都弄错了……'控制器'被用在许多不同的上下文中……正是因为这个原因,我更喜欢使用术语'输入控制器'……一条请求消息进入输入控制器……它随后把业务逻辑传递给一个合适的模型对象……再把控制权交给输入控制器,输入控制器察看结果并且决定采用什么样的视图来显示应答消息",直接支撑本卡结构图。 - 原始内容:首先也是最重要的使用模型-视图-控制器的理由是要保证模型和Web表现层的完全分离。这使得修改表现层以及加入其他的表现层都会很容易。