3.1 MVC简介与三层架构
3.1.1 MVC简介
MVC最早于1978年提出,是软件工程中的一种软件架构模式,这时距离微软在1985年推出Windows 1.0还有7年之久,当时的MVC即所有的输入、输出、逻辑控制,这些都要由软件开发者完全实现。
MVC模式可以有两种理解:一种是表现模式,另外一种是架构模式。这里先将其理解为表现模式。
MVC是模型(Model),视图(View)和控制(Controller)的缩写,其目的是实现Web系统的职能分工。其中,Model层实现系统中的业务逻辑;View层用于与用户的交互,通常用Razor和APSX来实现;Controller层是Model与View之间沟通的桥梁,可以分派用户的请求并选择恰当的视图以用于显示,同时还可以解释用户的输入并将它们映射为模型层可执行的操作,如图3-1所示。
图3-1
(1)控制器(Controller)
接收用户输入,并完成模型、视图的调用。Controller处理用户交互,从Model中获取数据并将数据传给指定的View。
(2)视图(View)
View是用户接口层组件,主要是将Model中的数据展示给用户。cshtml、ASPX和ASCX文件提供处理视图的职责。
(3)模型(Model)
Model主要是存储或者是处理数据的组件,实现业务逻辑层对实体类相应数据库的操作,如CRUD(C:Create/R:Read/U:Update/D:Delete),包括数据、验证规则、数据访问和业务逻辑等应用程序信息。Model具有两方面的含义:DomainModel和ViewModel。
● 领域模型DomainModel:不仅仅是一个实体类,而是整个业务处理流程的一个规则,是实现业务逻辑层对实体类的相应操作,包括逻辑操作与数据库操作,如验证规则、数据访问和业务逻辑等应用程序信息。
● 视图模型ViewModel:是与显示页面强关联的模型对象,用于实现页面强类型,如做了连接查询得到的结果要显示到前台,就没有相应的对象存在,这时就可以新建一个类来包含结果集中的行。
此外需要注意的是,Model是独立的组件,并不知道View的存在,也不知道Controller的存在。
过去MVC模式并不适合小型甚至中等规模的应用程序,因为这样会带来额外的工作量,增加应用的复杂性。现在多数软件设计框架(如ASP.NETMVC)都能直接快速提供MVC骨架,供中小型应用程序开发,此问题不再存在。对于存在大量用户界面并且逻辑复杂的大型应用程序,MVC将会使软件在健壮性、代码重用和结构方面上一个新的台阶。尽管在最初构建MVC模式框架时会花费一定的工作量,但从长远的角度来看它会大大提高后期软件开发的效率。
很多公司都在努力让自己的产品遵循MVC思想,其中微软的ASP.NETMVC就是其中一款,这是一款对输入、输出进行分离的UI层框架。
ASP.NET MVC是微软2009年对外公布的第一个开源的表示层框架,是微软的第一个开源项目。它将Web应用程序分成3个主要组件,即视图(View)、控制器(Controller)、模型(Model)。
Razor是MVC 3.0以后的视图引擎。MVC提供了Razor、ASPX两种方式。
3.1.2 三层架构
当把MVC当成一种架构模式来理解,就是所谓的三层架构,如图3-2所示。
图3-2
三层模式是软件工程中的程序设计模式,是MVC设计思想的一种实现。随着技术的发展,现在基本上已经将MVC模式等同于三层模式,包括数据访问层、业务逻辑层、表示层。再细一点可以分为UI层、业务逻辑层、数据访问层、模型层。如果要严格区分,那么UI层是指View与Controller,业务逻辑层、数据访问层、模型层都被包括在Model中。三层之间有着非常强的依赖关系:表示层←业务逻辑层←数据访问层。而且它们之间的数据传递是双向的,并且通常借助实体类传递数据。
1.各层的作用
(1)数据访问层:主要是对原始数据(数据库或者文本文件等存放数据的形式)的操作层,而不是指原始数据,也就是说,是对数据的操作,而不是数据库,具体为业务逻辑层或表示层提供数据服务。
(2)业务逻辑层:主要是针对具体问题的操作,也可以理解成对数据层的操作,对数据业务逻辑处理,如果说数据层是积木,那么逻辑层就是对这些积木的搭建。
(3)表示层:主要表示Web方式,也可以表示成WinForms方式。Web方式也可以表现成aspx,如果逻辑层相当强大和完善,那么无论表现层如何定义和更改,逻辑层都能完善地提供服务。
2.具体的区分方法
(1)数据访问层:主要看数据层里面有没有包含逻辑处理,实际上它的各个函数主要完成对数据文件的操作,而不必管其他操作。
(2)业务逻辑层:主要负责对数据层的操作,也就是说把一些数据层的操作进行组合。
(3)表示层:主要接收用户的请求以及数据的返回,为客户端提供应用程序的访问。
使用三层架构的好处是:项目结构更清楚,分工更明确,有利于后期的维护和升级。虽然它会带来一定的性能损失(因为当子程序模块未执行结束时主程序模块只能处于等待状态,说明将应用程序划分层次会带来执行速度上的一些损失),但是从团队开发效率角度上来讲却可以感受到大不相同的效果。
在本书中,接下来的内容都是把MVC当成三层架构中的表示层来理解。