浅谈MVC框架的优点(翻译)

传统的ASP.NET Web Forms是一个非常好的主意,但现实需求非常复杂。随着时间的推移,现实世界的项目暴露出Web Forms的一些不足之处:

“沉重的”视图状态:现实中在http请求之间维持状态(术语叫视图状态)导致了服务端和客户端巨大的数据块来回传递。典型情况下这个数据块会大到数百K字节,而且这个数据块会在每次请求时来回传输,导致网站访问者访问速度下降,同时增加了服务器的带宽负担。

页面生存周期:作为页面生存周期的一部分,连接客户端事件和服务端事件处理代码的机制,有时会非常复杂和微妙。很少有开发者能够在运行时成功操纵控件的层次结构而不发生视图状态错误,有时还会发现一些事件处理代码在运行神秘的失败了。

对HTML控制有限:服务端控件在客户端将自身转化为HTML标记,但往往并不是你想要的。在ASP.NET 4.0以前版本中,它的HTML输出通常并不符合WEB标准,和层叠样式表(CSS)也没有良好的结合,而且服务端控件自动创建不可预知的、复杂的标记ID值,导致Javascript难以访问。这些问题在在ASP.NET 4.0里有所改善,但要获取你期望的HTML标记可能依然比较棘手。

有问题的抽象:Web Forms试图尽可能隐藏HTML和HTTP的实现细节。当你想要实现自定义的行为时,你必须频繁地从这种抽象里跳出来,强制你对回发事件机制实施进行逆向工程,采取一些繁琐的方法(obtuse acts)生成你想要的HTML文本。这些抽象甚至会令极富经验的WEB开发者感到令人沮丧的挫折。

低级的可测试性:ASP.NET的设计者压根没有把自动测试作为这个软件开发平台的必要工具。这并不奇怪,他们设计的紧密耦合的体系结构根本不合适进行单元测试,集成测试也是个问题。

ASP.NET在不断发展。2.0版增加了一套标准应用程序组件集,可以减少你需要自己输入的代码量。2007年发布的AJAX版本是微软对当时Web 2.0/AJAX疯狂流行的响应,它支持富客户端交互。最近发布的ASP.NET 4.0版,可以产生大部分可以预见的符合标准的HTML标记,但许多其固有的局限性依然存在。

ASP.NET MVC的主要优势

ASP.NET在商业上取得了巨大成功,但正如前所述,其它的WEB开发平台也在不断向前发展。尽管微软一直在努力把緾绕在WEB Forms上的“蜘蛛网”清除掉,但其内在的设计理念已经落伍了。

2007年10月份,在美国德克萨斯州奥斯丁市召开的第一届ALT.NET会议上,微软公司副总裁Scott Guthrie发布并演示了一个基于ASP.NET的崭新的MVC WEB开发平台,明确的被设计为针对类似Rails这样的技术的直接响应,也是对业界关于Web Forms的批评的回应。本章的余下部分描述这个新的平台如何解决Web Forms的种种不足,并令ASP.NET重返顶峰。

(一) MVC体系结构

把MVC构建模式和ASP.NET MVC框架之间的区别搞清楚是十分重要的。MVC模式并不是新生事物-这要追溯到1978年施乐公司帕洛阿尔托研究中心的Smalltalk项目-之所以在今天的WEB开发领域广受欢迎,有以下原因:

MVC应用程序的用户交互符合自然周期:用户执行一个动作,作为响应,应用程序改变它的数据模型,并向用户提供一个更新了的视图。应用程序就一直这样循环的运行。这种模式非常适合WEB应用程序传递

一连串的HTTP请求和响应。

WEB应用程序必然要涉及若干不同的技术领域(数据库,HTML,可执行代码),通常这些技术都分布在不同层面。而MVC的概念很自然的就和这些技术的组合模式对应起来了。

ASP.NET MVC框架实现了MVC模式,而且这样做,有利于更好分离关注。实际上,ASP.NET MVC实现了一个特别为WEB应用开发定制的MVC模式。在第4章你将会了解这个体系的更多的理论,并亲身体验。

通过包含和改进MVC模式,ASP.NET MVC框架相对于Ruby on Rails这样的框架具备了强大的竞争力,同时也将MVC模式引入到主流的.NET领域。通过使用其它平台的开发者提供的对ASP.NET MVC的体验评估和实际应用中反馈,ASP.NET MVC在许多方面甚至已经超越了Rails。

(二) 可扩展性

你的桌面型电脑都是由一些相互独立的部分组成,它们之间通过标准的公开的文档化的接口相互联系。你可以很轻松的把你的显卡和硬盘换成另一个制造商生产的产品,并确信它们可以插进相应的槽位并正常工作。MVC框架的原理和PC一样也是构建在一系列相互独立的组件的基础之上-如一个可信的.NET接口或继承抽象基类的用户类-这样你就可以轻而易举的用你自己的实现替换这些组件,诸如路由系统,视图引擎,控制器工厂等等。

ASP.NET MVC设计者对如何使用MVC框架的每个组件向你提供了三个选择:

使用默认组件实现(对于大部分应用来说已经足够了)

从默认实现继承实现一个子类,以对某些行为进行微调

使用新的接口或抽象基类实现替换这些组件

这些看起来有点像ASP.NET 2.0中的供给者模式(provider model),但它更进了一步-完全进入了MVC框架的核心。从第10章起,你将会了解到各种各样的组件,并且知道为什么要调整或替换它们。

(三) 对HTML代码和HTTP的严密控制力(Tight Control over HTML and HTTP)

ASP.NET MVC知道产生整洁、符合标准的标记的重要。它内置的HTML helper方法的输出完全符合标准,但同Web Forms相比较其更多的重要变化体现在其设计哲学上。以往你对Web Forms自动生成的一大堆令人作呕的封装的HTML标记只有很小的控制权,作为替代,MVC框架鼓励你使用CSS设计简洁、优雅的标记。

当然,如果你想在你的页面摆上一些现成的复合UI元素的小玩意,像日历或级联菜单,ASP.NET MVC中的“无特殊要求”的标记方法让你可以轻易的使用最好的UI库,比如JQuery或雅虎的YUI库。微软已经把JQuery内置为ASP.NET MVC默认项目模板的一部分,JavaScript程序员会对ASP.NET MVC和当前流行的JQuery库结合如此紧密感到欣慰,甚至在微软自己的内容分发网络(CDN)服务器上你都可以直接引用Jquery.js文件。我们将在第20章涉及到JQuery。

ASP.NET MVC生成的页面不包含任何视图状态数据,因此它们比典型的ASP.NET Web Forms页面会小数百K。尽管今天的宽带连接已经非常快了,但这种带宽的节约依然会给最终用户带来巨大的体验改善。

和Ruby on Rails一样,ASP.NET MVC和HTTP合作和谐。你对往返于浏览器和服务器之间请求拥有完整的控制权,这样你就按你的喜好可以微调你的用户体验。AJAX现在实现起来很简单,而且没有任何影响客户端状态的自动回发。关注Web开发领域的任何开发者几乎肯定会发现,ASP.NET MVC会极大减少工作量,在同样的时间内完成的任务会更加令人满意。

(四) 易测试性

MVC使你在应用程序的可维护和可测试方面迈出了一大步,因为你可以自然的根据程序要实现的不同功能将其分离成许多不同的、相互独立的软件块。然而,ASP.NET MVC的设计师们并不满足于到底就止步了。为了支持单元测试,他们在框架中引入了面向组件设计的概念,并确保每个分离的代码块都以满足单元测试和模拟工具的需要的形式构建。

出于为开发者考虑的角度,他们还在Visual Studio向导中增加了创建单元测试向导,它可以使用许多开源的单元测试工具,如NUnit和xUnit,甚至微软自己的MSTest。即使你以前从来没有写过单元测试代码,你也会有一个良好的开始。

本书中,你会看许多为ASP.NET MVC控制器(controller)和行为(action)编写的简洁、简单的单元测试示例,这些示例会使用各种测试和模拟策略来冒充框架组件的实现,以确定实际运行中可能出现的任何情况。

易测试性不只是体现在单元测试中,ASP.NET MVC应用程序和UI自动化测试工具之间工作也非常好。你可以模拟用户交互的情景编写测试脚本,再不用去猜测HTML元素的结构,使用的CSS类,或者框架将要生成的ID,也用不着担心页面的结构会出现莫名其妙的变化。

(五) 强大的路由系统

URL的风格伴随着Web应用技术的发展也在不断发展。像下面的URL:

/App_v2/User/Page.aspx?action=show%20prop&prop_id=82742

将会逐渐稀少,它将被一种简单的、整洁的格式所代替,就像下面的这个:

/to-rent/chicago/2303-silver-street

之所以关注URL的结构问题,有以下几个很好的原因:第一,搜索引擎给在URL中搜索关键字分配了很大的权重。搜索“芝加哥的租金”会更容易匹配上面那个简单的URL。第二,现在许多网络用户的理解能力足够搞明白一个URL的意思,而且他们很欣赏在浏览器地址栏输入地址时的智能导航选项。第三,当人们理解了一个URL的结构,他们更有可能去链接它,把它和朋友共享,甚至可以通过电话大声的读出来。第四,它不会把你的应用程序的技术细节,目录,文件名结构公开到整个互联网上,因此,你可以自由的改变底层的实现而不会影响到你已经拥有的连接。

早期的框架难以实现精准的URL,不过ASP.NET MVC默认使用System.Web.Routing命名空间很容易提供精准的URL。它可以让你控制你的URL的样式,并将其和你的应用相关联,为你提供创造一个有意义的、对用户有用的地址样式的自由,不需要遵守预定义的模式。另外,只要你愿意,你完全可以容易的定义时髦的REST风格的URL样式。你会第11章看到一个详细的路由方案和关于URL的最佳练习。

(六) 构建于ASP.NET平台最好的部分之上

微软现有的ASP.NET平台已经为开发实用和高效的web应用程序提供了一整套成熟的、久经考验的组件和工具集。

首先也是最明显的地方,因为ASP.NET MVC构建在.NET平台之上,所以用户可以灵活的使用任意.NET语言编写代码和访问相同API功能-不光是MVC里面的,也包括大量的系统.NET类库和浩瀚的第三方.NET库。

其次,现有的ASP.NET平台的一些功能-比如母版页,表单验证,成员资格,角色,profiles,还有国际化-能够减少你需要开发和维护任意应用程序的代码量,这些功能在MVC框架中同样有效,因为它本来就是一个杰出的Web Forms项目。你可以在ASP.NET MVC的项目中继续使用一部分Web Forms内置的服务器控件,以及你在早期的ASP.NET项目中创建的自定义控件。(不过不能再依赖Web Forms中的特有概念,比如视图状态)

开发和布署是交替进行的。ASP.NET不仅和Visual Studio紧密结合在一起,它也作为一种原生的web编程技术为Windows XP,Vista,7和服务器操作系统中安装的Internet信息服务(IIS)所支持。IIS7发布后,将.NET托管代码它的请求处理管道的原生部分,为其提供第一流的支持,这也是ASP.NET的特殊待遇。因为MVC应用基于ASP.NET平台核心,因此它也会同样享受这些待遇。第23章我们会详细说明如何在Windows服务器上的IIS中部署MVC应用程序。

(六) 现代化的API

自微软2002年发布 .NET平台以来,它一直在持续的发展,支持甚至是定义了现代编程技术顶级水准。

ASP.NET MVC是专为.NET 4.0打造的,所以它的API可以使用最新的编程语言和运行时创新的所有益处,包含扩展方法,lambda表达式,匿名和动态类型,语言集成查询(LINQ)。许多MVC框架的API方法和编码模式尽可能的比早期平台整洁,更富表现力。

(七) ASP.NET MVC是开源的

和微软先前的平台不同,ASP.NET MVC的原始代码你可以随意下载,甚至可以对其进行修改,重新编译为你自己的版本。当你的调试足迹深入到一个系统组件内部,想对它的代码进行步进(甚至阅读原作者的注释)时,代码开源是非常有用的。另外,如果你想构建一个更高级的组件,看看可能会发生什么,或者观察内置组件是如何工作的,这点也非常有帮助。

同时,如果你不喜欢某些工作的实现方式,或者你发现了一个错误,又或者你想访问一些其它方式无法访问的东西,开源好处是非常强大的。因为你自己就可以简单的改变它。

不过,如果将来有一天你将你的框架升级到新版本,你还要重复你所作的改变再重新应用它们。ASP.NET MVC是按照微软公共许可(Ms-PL,http://www.opensource.org/licenses/ms-pl.html)发布的,这是一个经过开源促进组织批准的开源许可。也就是说你能够修改源代码并部署它,甚至把它作为一个衍生项目向公众发布。然而,微软在其官方版本上不接受任何补丁,现阶段,微软只维护其产品开发和质量保证团队的负责的代码,你可以从http://aspnt.codeplex.com/网站上下载MVC的源代码。

(0)

相关推荐

  • ASP.NET 之 MVC框架及搭建教程(推荐)

    一.MVC简介 MVC:Model-View-Controller(模型-视图-控制器),MVC是一种软件开发架构模式. 1.模型(Model) 模型对象是实现应用程序数据域逻辑的应用程序部件. 通常,模型对象会检索模型状态并将其存储在数据库中. 例如,Product 对象可能会从数据库中检索信息,操作该信息,然后将更新的信息写回到数据库内的 Product 表中. 2.视图(View) 视图是显示应用程序用户界面 (UI) 的组件.通常,此 UI 是用模型数据创建的.Product表的编辑视图

  • 请求如何进入ASP.NET MVC框架

    一.前言 对于WebForm开发,请求通常是一个以.aspx结尾的url,对应一个物理文件,从代码的角度来说它其实是一个控件(Page).而在MVC中,一个请求对应的是一个Controller里的Action.熟悉asp.net的朋友都知道,asp.net请求实际都是交给HttpHandler处理(实现了IHttpHandler的类型).无论是.aspx,.ashx,.asmx 还是MVC里的Action,请求都会交给HttpHandler.具体是在管道事件中,会根据请求创建一个HttpHand

  • .NET Web开发之.NET MVC框架介绍

    MVC概念 MVC是一种架构设计模式,该模式主要应用于图形化用户界面(GUI)应用程序.那么什么是MVC?MVC由三部分组成:Model(模型).View(视图)及Controller(控制器). Model即应用程序的数据模型.任何应用程序都离不开数据,数据可以存储在数据库中.磁盘文件中,甚至内存中.Model就是对这些数据的抽象,不论数据采取何种存储形式,应用程序总是能够通过Model来对数据进行操作,而不必关心数据的存储形式.数据实体类就是常用的一种Model.例如,一个客户管理应用程序使

  • 浅谈MVC框架的优点(翻译)

    传统的ASP.NET Web Forms是一个非常好的主意,但现实需求非常复杂.随着时间的推移,现实世界的项目暴露出Web Forms的一些不足之处: "沉重的"视图状态:现实中在http请求之间维持状态(术语叫视图状态)导致了服务端和客户端巨大的数据块来回传递.典型情况下这个数据块会大到数百K字节,而且这个数据块会在每次请求时来回传输,导致网站访问者访问速度下降,同时增加了服务器的带宽负担. 页面生存周期:作为页面生存周期的一部分,连接客户端事件和服务端事件处理代码的机制,有时会非常

  • 浅谈SSH框架中spring的原理

    在ssh项目中,是有明确分工的,spring的作用就相当于将struts和hibernate连接起来,是将两个没有关系的框架的特性,方法,action都放在spring的配置文件中使他们建立关系.取他门各自所长.而这些做法他们自己不知道,他们是听命于spring调度的,他的的任务只是做好自己的事情. 这样做的好处就是任务结构分明,struts只管理显示与做什么,hibernate只关心怎么做,而spring就相当于领导,所以一切的类都要交给spring的工厂创建,这是一种良好的开发模式,体现了一

  • 浅谈jQuery框架Ajax常用选项

    json(JavaScript Object Notation):轻量级的数据交换(交换的数据转换成与平台无关的)格式 java对象转换成json字符串,使用ObjectMapper类的writeValueAsString(java对象); 将json字符串或者json对象组成的数组字符串转成javascript对象使用javascript内置对象JSON提供的parse函数 $.ajax()方法 $.ajax({ url:请求地址(相对), type:请求类型, data:请求参数(可以字符串

  • 浅谈MVC+EF easyui dataGrid 动态加载分页表格

    首先上javascript的代码 <script type="text/javascript"> $(function () { LoadGrid(); }) //加载表格!!! function LoadGrid() { $('#roleGrid').datagrid({ width: 900, striped: true, //交替条纹 fitColumns: true, //防止水平滚动 fit: true,//自动补全 iconCls: "icon-sav

  • 浅谈Java多线程的优点及代码示例

    尽管面临很多挑战,多线程有一些优点使得它一直被使用.这些优点是: 资源利用率更好 程序设计在某些情况下更简单 程序响应更快 资源利用率更好 想象一下,一个应用程序需要从本地文件系统中读取和处理文件的情景.比方说,从磁盘读取一个文件需要5秒,处理一个文件需要2秒.处理两个文件则需要: 5秒读取文件A 2秒处理文件A 5秒读取文件B 2秒处理文件B --------------------- 总共需要14秒 从磁盘中读取文件的时候,大部分的CPU时间用于等待磁盘去读取数据.在这段时间里,CPU非常的

  • 浅谈MUI框架中加载外部网页或服务器数据的方法

    我们很多同学在实施使用MUI框架的时候,在打开新的页面的时候常使用的方式是:mui.openwindow的方法,然而遇到网页需要从服务器或者是要嵌套外部的网页的时候,由于网速的问题会遇到加载时出现白屏,等待时间过长,导致用户体验不好. 页面加载的时候使用plus.webview.create方法就很好的解决了这个问题. 废话不多说直接贴代码 首先我们需要在创建一个父页面,以下是父页面的JS // H5 plus事件处理 function plusReady(){ var nwaiting = p

  • 浅谈layui框架自带分页和表格重载的接口解析问题

    首先要了解框架分页自带的参数有哪些,特别是注意参数名称要和后台一致! **需要注意的是layui框架的数据解析格式问题,data必须是个数组对象的形式才能正常解析否则会很麻烦(亲测过非正常解析,手写js手动动态添加表格) data 格式例如: { "count": 11, "code": 0, "msg": "", "data": [ { "id": "1", &qu

  • 浅谈laravel框架sql中groupBy之后排序的问题

    最近在用框架给公司App写接口时,碰到了一个棘手的问题: 对查询结果进行排序并进行分页(进行了简略修改),下面是最终结果代码: $example = Example::select(DB::raw('max(id) as some_id,this_id')) ->where('id', $id) ->groupBy('this_id') ->orderBy('some_id', 'desc') ->skip($offset) ->take($limit) ->get()

  • 浅谈laravel框架与thinkPHP框架的区别

    主要区别:(thinkPHP更适合国人的编码习惯) 1.渲染模版方式的不同: 在Laravel框架里,使用return view()来渲染模版; 而ThinkPHP里则使用了$this->display()的方式渲染模版; 2.在Laravel框架里,由于其考虑到了跨站请求伪造, 所以如果使用form表单以post方式进行传值时,如果不再form表单中加入{{csrf_field()}}则会报出TokenMethodnotfound的语法错误; 而TP框架则需要自己手动完成防止跨站攻击的代码;

  • 浅谈Scrapy框架普通反爬虫机制的应对策略

    简单低级的爬虫速度快,伪装度低,如果没有反爬机制,它们可以很快的抓取大量数据,甚至因为请求过多,造成服务器不能正常工作.而伪装度高的爬虫爬取速度慢,对服务器造成的负担也相对较小. 爬虫与反爬虫,这相爱相杀的一对,简直可以写出一部壮观的斗争史.而在大数据时代,数据就是金钱,很多企业都为自己的网站运用了反爬虫机制,防止网页上的数据被爬虫爬走.然而,如果反爬机制过于严格,可能会误伤到真正的用户请求;如果既要和爬虫死磕,又要保证很低的误伤率,那么又会加大研发的成本. 简单低级的爬虫速度快,伪装度低,如果

随机推荐