浅谈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应⽤程序提供了⼀整套成熟的、久经考验的组件和⼯具集。
jquery是什么功能组件⾸先也是最明显的地⽅,因为ASP.NET MVC构建在.NET平台之上,所以⽤户可以灵活的使⽤任意.NET语⾔编写代码和访问相同API功能-不光是MVC⾥⾯的,也包括⼤量的系统.NET类库和浩瀚的第三⽅.NET库。
其次,现有的ASP.NET平台的⼀些功能-⽐如母版页,表单验证,成员资格,⾓⾊,profiles,还有国际化-能够减少你需要开发和维护任意应⽤程序的代码量,这些功能在MVC框架中同样有效,因为它本来就是⼀个杰出的Web Forms项⽬。你可以在ASP.NET MVC的项⽬中继续使⽤⼀部分Web Forms内置的服务器控件,以及你在早期的ASP.NET项⽬中创建的⾃定义控件。(不过不能再依赖Web For
ms中的特有概念,⽐如视图状态)
开发和布署是交替进⾏的。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的原始代码你可以随意下载,甚⾄可以对其进⾏修改,重新编译为你⾃⼰的版本。当你的调试⾜迹深⼊到⼀个系统组件内部,想对它的代码进⾏步进(甚⾄阅读原作者的注释)时,代码开源是⾮常有⽤的。另外,如果你想构建⼀个更⾼级的组件,看看可能会发⽣什么,或者观察内置组件是如何⼯作的,这点也⾮常有帮助。
同时,如果你不喜欢某些⼯作的实现⽅式,或者你发现了⼀个错误,⼜或者你想访问⼀些其它⽅式⽆法访问的东西,开源好处是⾮常强⼤的。因为你⾃⼰就可以简单的改变它。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论