您的位置:首页 > 编程语言 > ASP

MVC 之 架构的基本原理及Asp.Net实现MVC

2016-08-12 20:43 441 查看

一、引言

  许多Web应用都是从数据存储中检索数据并将其显示给用户。在用户更改数据之后,系统再将更新内容存储到数据存储中。因为关键的信息流发生在数据存储和用户界面之间,所以很多应用将数据和用户界面这两部分绑在一起,以减少编码量并提高应用程序性能。但是,这种看起来自然而然的方法有一些大问题。一是,用户界面的更改往往比数据存储系统的更改频繁得多。二是,这种耦合往往会合并其他业务逻辑。那么如何让 Web 应用程序的用户界面功能实现模块化,以便可以轻松地单独修改各个部分呢?面向对象的设计模式是经验的总结,MVC架构可以很好地解决上述问题。

  .NET是当今设计和开发各种Web应用的主流平台,MVC架构在J2EE平台上已有成熟的设计方案,而在.NET平台上却少有应用。所以讨论其在Asp.net环境下的应用和实现,仍很有意义。

  本文首先论述了MVC架构的原理、优缺点以及它所能为Web应用带来的好处。并结合作者在“成都微软技术中心”实习期间,研发项目的经验。介绍了一种在Asp.net环境下的实现方式。旨在帮助Web设计开发者更好的了解和掌握MVC,合理利用MVC构建优秀的Web应用。虽然本文是在.net环境下的实现,但这并不妨碍你对MVC架构的理解。学习MVC架构,重在学习其思想。

二、MVC介绍

  MVC是一种软件开发架构,它包含了很多的设计模式,最为密切是以下三种:Observer (观察者模式), Composite(组合模式)和Strategy(策略模式)。MVC最初是在Smalltalk-80中被用来构建用户界面的。

  MVC架构把数据处理,程序输入输出控制及数据显示分离开来,并且描述了不同部件的对象间的通信方式,使得软件可维护性,可扩展性,灵活性以及封装性大大提高。

  MVC(Model-View-Controller)把系统的组成分解为M(模型)、V(视图)、C(控制器)三种部件。V(视图)表示数据在屏幕上的显示;C(控制器)提供处理过程控制,它在模型和视图之间起连接作用。控制器本身不输出任何信息和做任何处理,它只负责把用户的请求转成针对Model的操作,和调用相应的视图来显示Model处理后的数据。

  三者之间关系如下图2.1:

[align=center]//得到数据,并存放在对应的Model中,供View使用

//用Model中的数据填充编辑或显示界面

//重新填写编辑框页面的部件内容, 对部分用户可能重复填写的部件内容不进行赋默 认值操作

//检查用户输入正确性

//保存用户输入,把用户输入更新到数据库

所有的列表View一般也只用实现基类(GridViewUIBase)提供的如下几个虚方法.

//返回子类中使用的GridView,子类必须继承

// 返回子类中的GridView中复选框列模板中复选框的名称,子类根据有无该模板列进 行选择继承

通常无需处理的继承方法

//绑定DataGrid部件事件,

protected override void BindGridEvent()

//绑定除通过GetDataGrid()传入的DataGrid部件以外的部件的客户端事件

protected override void BindControlEvent()

// 返回GridViewList使用的数据源, 子类必须继承

protected override object GetDataSource()

// 多条记录删除,在删除按钮事件中调用

protected override void DelRecords(object keyValuesString)

// 返回以CommandName为key以GridEventPageParam类型参数为内容的hashtable

[/align]

从以上代码中可以很容易发现,无论是列表页面还是编辑页面,都没有和流程相关的东西,这正是MVC所要做的,View中只包含数据的显示,流程完全由基类控制。好处是显而易见的。不同的人写出来的View也具有相同的风格。

3.2 Controller(控制器)

3.2.1原理

Controller控制器是Model与View之间沟通的桥梁,它可以分派用户的请求并选择恰当的视图以用于显示,同时它也可以解释用户的输入并将它们映射为模型层可执行的操作。在.NET中每个aspx对应了一个后端代码aspx.cs,可以通过aspx.cs方便地实现Controller的功能。每个Asp.net页面都有一种机制,将页面中的部件所要调用的方法在一个与其分离的类中实现。这些aspx和ascx文件后端代码继承了System.Ul.Web.Page的类执行控制器功能,它包括了各种初始化和控制函数。当加载aspx页面时将调用Page_ Load事件,当aspx页面从内存中被卸载时将调用Page_UnLoad事件。如果某个部件触发页面以使其被重新加载则将调用Control Event事件。

3.2.2实现

对应所有编辑页面的控制类为DialogUIBase.cs ,该类完成所有编辑页面的流程控制、请求控制 ;对应所有列表页面的控制类为GridViewUIBase.cs ,该类完成所有列表页面的流程控制和请求控制 ;这两个类都位于App_Code文件夹下。

编辑页面基类(DialogUIBase)和列表页面基类(GridViewUIBase)都继承自System.Web.UI.Page,都包含两部分,一是供View子类继承的虚方法,一是对View子类流程控制的方法。

本例中GridViewUIBase中主要包含的方法有:

供外部调用的主要方法如下:

public void Clear() //清除Model

EntityBase类,只需实现基类(Entity)的四个虚CRUD方法,和定义Model自身相关的属性。由于Model又继承于EntityBase类,所以如果某个Model需要进行额外的操作,可添加到该Model对应的AfterLoad()或BeforeSave()方法中。

3.4 MVC架构的扩展设计

通过在Asp.net中使用MVC模式,可以构建,具有良好扩展性的Web应用。MVC构架可以轻松实现以下功能:

①实现一个模型的多个视图;

②采用多个控制器;

③当模型改变时,所有视图将自动刷新;

④所有的控制器将相互独立工作。

这就是MVC模式的好处,只需在以前的程序上稍作修改或增加新的类,即可轻松增加许多程序功能。以前开发的许多类可以重用,而程序结构根本不再需要改 变,各类之间相互独立,便于团体开发,提高开发效率。下面讨论如何实现一个模型、两个视图和一个控制器的程序。其中模型类及视图类根本不需要改变,与前面的完全一样,这就是面向对象编程的好处。对于控制器中的类,只需要增加另一个视图,并与模型发生关联即可。该模式下视图、控制器、模型三者之间的示意图如图3.5所示。



同样也可以实现其它形式的MVC例如:一个模型、两个视图和两个控制器。从上面可以看出,通过MVC模式实现的应用程序具有极其良好的可扩展性,是Asp.net面向对象编程的未来方向。

4 MVC架构的优点及不足

4.1 MVC的优点

MVC的优点体现在以下几个方面:

(1) 有利于团队开发分工协作和质量控制,降低开发成本。

(2) 可以为一个模型在运行时同时建立和使用多个视图。变化-传播机制可以确保所有相关的视图及时得到模型数据变化,从而使所有关联的视图和控制器做到行为同步。

(3) 视图与控制器的可接插性,允许更换视图和控制器对象,而且可以根据需求动态的打开或关闭、甚至在运行期间进行对象替换。

(4) 模型的可移植性。因为模型是独立于视图的,所以可以把一个模型独立地移植到新的平台工作。需要做的只是在新平台上对视图和控制器进行新的修改。

(5) 潜在的框架结构。可以基于此模型建立应用程序框架,不仅仅是用在设计界面的设计中。

4.2 MVC的缺点

MVC的不足体现在以下几个方面:

(1)增加了系统结构和实现的复杂性。对于简单的界面,严格遵循MVC,使模型、视图与控制器分离,会增加结构的复杂性,并可能产生过多的更新操作,降低运行效率。

(2)视图对模型数据的访问效率低。视图可能需要多次调用Model才能获得足够的显示数据。

(3)完全理解MVC并不是很容易。使用MVC需要精心的计划,由于它的内部原理比较复杂,所以需要花费一些时间去思考。 同时由于模型和视图要严格的分离,这样也给调试应用程序到来了一定的困难。

结束语

与软件所处理问题的内在模型相比较,用户界面是需要经常发生变化的,采用MVC设计模式可以在满足对界面要求的同时,使软件的计算模型独立于界面的构成。也可以基于此模型建立大型分布式应用程序框架。

MVC并不适合小型甚至中等规模的应用程序,花费大量时间将MVC应用到规模并不是很大的应用程序通常会得不偿失。

MVC是一种软件开发架构。和其它设计模式一样,它不是万能的,也不是一成不变的。要根据具体情况灵活运用。在上面的示例项目中,为了提高运行和开发效率。在Model设计上就提供了两种访问方式。

示例中的MVC采用了集中控制的方式。一个列表控制器GridViewUIBase,对应多个列表视图。一个编辑控制器DialogUIBase对应对个编辑、查看详情视图。对每个模型而言,仅有两种视图,且几乎是固定不变的。所以没有增加Observer(观察者)模式。这样减少了系统的复杂性。本示例最精彩的部分,就是控制器的设计。各视图执行流程完全封装在控制器中。由于视图中不含有任何控制信息,流程信息。所以视图编码人员完全不用了解Http的无状态特性等。对他们而言,开发WebForm和WinForm是一样的。当然这种设计也有它的不足,如果修改某个视图的显示,有可能还要修改相关的控制器。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: