重温经典之《企业应用架构模式》——.NET中的架构模式运用 (MVC模式)
MVC模式
终于开始伟大的MVC模式了。
不论你采用什么样的编程语言,什么样的编程平台,永远不可能跳过去的,就是用户界面(UI)的编写,如果UI界面只是20年前的控制台字符或者更早的打孔纸带甚至开关,那么你完全没有必要花大力气去研究如何编写页面代码。但是今天各种各样的技术让用户界面变得炫酷又复杂,用户界面的代码也极度的开始膨胀。在老板和用户都叫嚣着“电脑难用”和要求“增强用户体验”的时候,作为程序员我们必须要有强大的界面编写方法。因此,各种各样的用户界面框架应运而生,但是所有的这些界面框架大都建立在一种理论基础之上,这就是MVC(Model – View - Controller)。
应要求:这回我放上图。
其实这个图并没那么好理解。我们来举一个最简单的例子,假设有一台电脑,在屏幕上输出:今天武汉气温40度(40度为红色)。
这是一个典型的UI,我们来分析一下进行UI编程的工作流程。
系统先从某处(比如数据库,或者计算出来)得到数据,数据描述类似这样:“城市名称:武汉;气温:40度;时间:2008/9/17”。
得到数据后,系统需要对数据进行处理,比如判断日期是不是今天,判断温度高低(40度是高温吧)。
在这一系列判断完成后,系统应该在最终的界面(这里是控制台)上,输出上面的内容(在我们这个View中,“高温”被定义成红色,也许其他View中“高温”不是红色)。
非常学院派的,我们抽象的分析上面的显示过程:
找到UI显示所需的数据 -> 根据数据确定如何显示 -> 把最终的界面显示出来
于是就有了前面的那张图,我们将每个步骤分开,使用三个对象分别处理三个工作,这三个对象也就是Model, Coltroller, View。
理想情况是,我们拥有一个完美的数据对象,就像上面的数据描述那样。用户请求到来之后,Controller根据用户响应找出Model(40度),然后对View发出一个抽象的显示请求(比如显示“高温”),View得到这样的抽象请求后,根据自己的策略显示数据,比如控制台View的策略是显示一个红色的气温,HTML View策略可能显示一张图片。而显示所使用的数据,依然还是从Model中获得的。
整个过程如下:
下面我们来看看ASP.NET MVC框架,这是ASP.NET下官方的第一个MVC框架,它基本遵循着上面这些MVC的理论。关于ASP.NET MVC框架的说明这里就不多说了。这里主要分析MVC模式在这个框架中的应用。
首先是URL映射。
在ASP.NET MVC框架中,通过一个URL映射引擎,用户请求的URL被映射到相应的Controller上面。这个URL映射引擎就相当于上图中第2个步骤,将用户对View的相应转换成所需要的Controller。
当请求到达了Controller,之后是Controller的处理。
在Controller中,创建Model,获得数据,然后Controller会根据情况调用某个View,通知View进行更新。上面的例子Controller在进行了用户创建的处理之后,最终调用了”List”这个View来显示结果。
多个Controller可以控制一个View,只要有需要呈现某类数据,就可以调用相应的View。
不可避免的,Controller在选择了View之后,需要将某些数据传给View,这个对象的传递方式是MVC模式中没有提到的。在ASP.NET MVC中,可以使用ViewData对象进行数据传递。而事实上,在ASP.NET MVC中,View访问Model也是通过ViewData对象。
Controller只包含了显示无关的业务逻辑,因此,但是页面需要负责很多比如呈现数据的过程,这样页面编写往往会有一些难度。即使ASP.NET MVC框架提供了Html辅助类来解决问题,但是这种MVC模式的View代码编写依然不是那么简单的。
不过总而言之,MVC模式是一种理论基础严实,但实现颇有些麻烦的模式。在View很多,显示方式比较单一(这是View编写比较方便),控制显示的业务逻辑比较复杂的情况下,是很好用的。在MVC模式的基础上,产生了一系列的变种,这其中就包括了PageController ,(Model)ViewPresenter模式等等,这个下次再说。
P.S. 文中ASP.NET MVC的实例代码来自Mike108mvp的blog http://www.cnblogs.com/mike108mvp/archive/2008/08/31/1280689.html