有一只企鹅首先发现地球暖化、冰山在融化,回来告诉其它企鹅,却没有任 一只企鹅愿意相信;因为企鹅们觉得现在生活过得很好,都不想费心思考如何改 变、改变何时会来临,因此仍每天做例行性的工作,不愿去研究别人的观点。「 有时人们会抗拒改变,其实只是不想改变;但是愿意接收新观念的技术人员,通 常会活得比较久」。本帖只提供 MVC Pattern 的观念和架构介绍,仅供未接触 过 MVC Framework 的 .NET 技术人员作为参考之用,以评估是否要深入学习或 在将来的项目导入。
常在网络上,看到有网友误认 MVC 和 3-Tier (三 层架构) 是类似的东西:
http://topic.csdn.net/u/20090405/21/97a137ff-2105-4117-a0c3- 39d7f0f1c952.html
http://topic.csdn.net/u/20090415/13/9ebe5011- c56b-47e6-9f89-40b70896a041.html
但二者本质上是完全不同的概念, 如下:
3-Tier 或 N-Tier 的架构,中间层可能包含 EJB, Enterprise JavaBeans (J2EE),或 .NET Enterprise Services、Remoting、WCF:
Client (WebPage) -- [ BLL (业务逻辑层) -- DAL (数据访问层) ] (Web Server) -- 数据来源或数据库
Client (WebPage) -- [ BLL (业务 逻辑层) -- DAL (数据访问层) ] (Web Server + Application Server) -- 数 据来源或数据库
MVC 则为:
● Model (模型) - 包含 BLL、DAL 。View 和 Controller 都依赖于 Model,但是 Model 既不依赖于 View,也不 依赖于 Controller,这是分离的主要优点之一
● View (视图) - 仅负 责生成输出 (UI)。以 ASP.NET MVC 来说,不再有 Code-behind 这种 .aspx.cs 文件,亦无 runat="server" 标记、form 标记、控件声明、事件处 理
● Controller (控制器) - 控制整个系统的 workflow、运作逻辑、 错误处理、身分验证和授权、用户输入数据验证、…等等
总的来 讲,微软的 ASP.NET MVC Framework 是为了让 ASP.NET 更适合中、大型的项目 ,能统一规划、控管整个网站系统的流程 (用 Controller 处理),并更有效地 分工开发、日后维护 (避免许多 WebForm 里重复出现相同功能的自定义函数)、 管控某个功能在修改后对系统整体的影响,并将不同的功能作更明确地切割,让 不同专长的技术人员各司其职,也顺便提高了代码的可读性,便于测试 (TDD, test -driven development) (减少直接绑到用户界面中的代码量) [4],并达到 「松散耦合 (loosely coupled)」,让组件易于更换和重复使用。但也因此, ASP.NET 程序员必须先改变过去,把很多业务逻辑、输入验证、页面切换 …等杂七杂八的功能,全部写在 Code-Behind (aspx.cs) 里的旧习惯。
ASP.NET MVC provides a framework that enables you to easily implement the model-view-controller (MVC) pattern for Web applications. This pattern lets you separate applications into loosely coupled, pluggable components for application design, processing logic, and display. ASP.NET MVC also greatly facilitates test -driven development (TDD).
事实上,MVC Pattern 的发明已有二十多年,其与 再衍生的观念和框架 (MVP),在 Java / J2EE / Struts 的一些 Framework 早 已行之多年。MVC 模式的结构如下 [4]:
● View (JSP) 只纯粹用来生 成输出,不涉及数据来源的访问、事件处理、各种逻辑处理和运算工作。因此更 适合大型项目的分工,把这层完全交由美工人员制作 (而非程序员兼美工和排版 )。此层如同 ASP.NET 中的 .aspx 前台页面,亦即 UI (User Interface)。
● Model (JavaBean、EJB 组件) 用来存放独立且可重复使用的组件, 包括:数据来源 (数据库) 的访问、商业逻辑的代码,并应与 View 作完整地切 割,以便保留系统日后扩充或改写时的弹性。此层如同 ASP.NET 中的 App_Code 文件夹中的自定义类、DataSet (.xsd)、TableAdapter、…等等。
● Controller (Java Servlet) 用来控制整个网站处理的「流程」,负 责协调 View 和 Model 之间的流程传递和转向,也要管理和指派由哪个文件去 接收用户所提出的「请求 (request)」,亦即由它决定要展现哪一个 aspx 文件 给用户。当用户从浏览器送出 request 时 (例若用鼠标单击页面中的控件,或 输入数据后单击 Button 的提交、输入 URL 网址、点选 hyperlink…等 等),Controller 里定义的某些 method 会判断要交由 Model 中的哪些运算逻 辑去处理,然后再判断要将处理结果传回哪一个 View 去显示出来。此外, Controller 还可包含错误处理、授权、输入验证…等功能的代码,集中 统一处理,以避免传统 WebForm 里大量重复的代码。但说穿了,Controller 事 实上只是一个自定义类,搭配一些 Attribute (特性)。而 Controller 也是目 前 ASP.NET 所欠缺的部分。
图 1 MVC (Model 2) 架构的运作方式,可与下图 2 的 ASP.NET MVC 项目 相互对应