1.3 ASP.NET MVC的主要优势
精通 ASP.NET MVC 3 框架(第三版)
ASP.NET已经获得了巨大的商业成功,但正如所讨论的,其他Web开发领域也在进步,即使是微软也在不断清理Web Form的垢病,因为其基本设计看上去已经相当陈旧了。
2007年10月,在得克萨斯—奥斯汀举行的第一次ALT.NET国际会议上,微软副总裁Scott.Guthrie宣布并演示了崭新的MVC Web开发平台分支,它建立在核心的ASP.NET平台之上,明确地作出对Rails等技术的进展的直接回应,以及对Web Form批评的反映。以下小节将说明这个新平台如何克服Web Form的局限性,并把ASP.NET重新带回到先进行列。
1.3.1 MVC架构
重要的是区别MVC体系结构模式与ASP.NET MVC框架。MVC模式并不新——这要回溯到1978年Xerox PARC的Smalltalk项目——但它作为一种Web应用程序的体系结构,如今已得到了广泛的普及,原因如下。
用户与MVC应用程序的交互遵循一种自然循环:用户采取一个动作,应用程序对其作出响应,修改其数据模型,并把一个更新的视图提供给该用户,然后重复这一循环。这非常适合于以一系列HTTP请求与响应进行传递的Web应用程序。
Web应用程序必须组合多种技术(如数据库、HTML、可执行代码等),这通常被分为一系列的层次。这种组合所产生的设计模式能自然地映射到了MVC的概念上。
ASP.NET MVC框架实现了这种MVC模式,而且极大地改善了关注点分离。事实上,ASP.NET MVC实现MVC的现代化变体,使它特别适用于Web开发。你将在第4章更多地了解这种体系结构的理论与实践。
通过采纳和调整MVC模式,ASP.NET MVC框架对Roby on Rails以及类似平台形成了强有力的竞争,并把MVC模式带到了.NET世界的主流。利用开发人员使用其他平台的经验和最佳实践,ASP.NET MVC在许多方面的推进甚至已经超越了Rails。
1.3.2 可扩展性
桌面电脑的内部组件是一个个独立的部件,它们只通过标准的公共文档接口进行交互。你可以很容易地拔出显卡或硬盘,并用另一制造商的产品来替换,相信它会在插槽中正常工作。MVC框架也被构建成一系列独立的组件,满足一个.NET接口,或建立在一个抽象类之上。因此,开发者可以很容易地用一个自己的不同实现来替换相应组件,如:替换路由系统、视图引擎、控制器工厂等。ASP.NET MVC设计者对每一个MVC框架组件都提供了三种选择。
使用组件现行的默认实现(它应该足以满足大多数应用程序)。
派生默认实现的一个子类,以调整其行为。
用接口或抽象基类的一个新实现来完全替换该组件。
这就像自ASP.NET 2.0开始提供器模型一样,而且还向前跨了一大步,深入到了MVC框架的核心部分。从第10章开始,你将了解所有这些各种各样的组件,以及如何和为什么要调整或替换这些组件。
1.3.3 在HTML及HTTP上的严密控制
ASP.NET MVC认识到产生整洁、与标准兼容的标记的重要性。其内建的HTML辅助器方法可以产生与标准兼容的输出,与Web Form相比,还是一种更重要的理念上的变革。MVC框架鼓励你构思简单优雅、可设置CSS样式的标记,而不是生成大片无法控制的HTML标记。
当然,如果你确实想将一些现成的部件用于复杂的UI元素,如日期选择器或级联菜单等,ASP.NET MVC的“无特殊需求”标记方法可以很容易地使用最佳品种的UI库,如jQuery库或Yahoo UI库等。微软已经把jQuery装配为默认的ASP.NET MVC项目模板的一个内建部件,ASP.NET MVC与通用jQuery库啮合得如此良好,甚至让你能够直接引用微软的内容分发网络(Content Delivery Network,CDN)服务器上的jQuery.js文件,JavaScript开发者们如果了解到这一点,定会感到非常开心。我们将在第20章讨论jQuery。
ASP.NET MVC生成的页面不含任何视图状态数据,因此,这些网页可能比典型的ASP.NET Web Form页面要小几百KB。无论今天的高速宽带如何,这种对带宽的节约仍然极大地改善了终端用户的体验。
与Ruby on Rails一样,ASP.NET MVC与HTTP工作得十分协调。你对传递于浏览器与服务器之间的请求有完全的控制,因此,只要你愿意,就可以仔细地调整用户体验。Ajax很容易使用,而且没有任何自动回发来扰乱客户端状态。任何一个专注Web的开发人员都会觉得这是极大的解放,且让人工作愉快。
1.3.4 可测试性
MVC体系结构为我们提供了很棒的起点,使你的应用程序可维护和可测试,因为你可以自然地把应用程序的不同关注分成不同的、独立的软件片段。ASP.NET MVC的设计者们还不止做了这些。为了支持单元测试,他们对该框架采取了面向组件的设计,并确保把每个独立的片段构造成满足单元测试和模仿工具的需求。
他们添加了Visual Studio向导让你创建初步的单元测试项目,该项目集成了开源的单元测试工具,如NUnit和xUnit,以及微软的MSTest。即使你以前从未写过单元测试,也会有一个很好的开始。
整本书中你都会看到,如何为ASP.NET MVC的控制器以及动作编写干净、简单的单元测试。这些单元测试使用各种测试和模仿策略,提供对框架组件的伪造或模仿实现来模拟各种情景。
可测试性并不仅仅是单元测试的事情。ASP.NET MVC应用程序也可以与UI自动操作测试工具良好协作。你可以编写模拟用户交互的脚本,而不必猜测框架会生成什么样的HTML元素结构、什么样的CSS的class,或什么样的ID等,也不必担忧结构的意外变化。
1.3.5 强大的路由系统
随着Web应用程序技术的改进,URL样式已经发生了演变。像下面这样的URL:
/App_v2/User/Page.aspx?action=show%20prop&prop_id=82742
明显已经很少见到了,取而代之的是一种更简单、更清晰的格式,如下所示:
/to-rent/chicago/2303-silver-street
采用这种URL结构有一些很好的理由。第一,搜索引擎对一个URL中找到的关键词有明显的权重。一个对“芝加哥租房”的搜索,更可能找到的是一个较简单的URL;第二,许多Web用户现在对URL有了足够的领悟,并且乐于直接在浏览器的地址栏中输入;第三,当理解了URL的结构时,人们才会更可能链接它,与朋友共享它,或在电话中报读它;第四,这种URL并不会把应用程序的技术细节、文件夹、文件名结构暴露给整个公用网,因此,你可以自由地修改底层实现而不会破坏输入链接。
整洁的URL在早期的框架中难以实现,但ASP.NET MVC默认使用System.Web.Routing工具给出整洁的URL。这使你能够完全控制URL方案及其与应用程序的关系。使你能自由地创建对用户有意义和有用的URL模式,而无需遵守预定义模式。当然,这也意味着如果你愿意,可以很容易地定义现代的REST风格的URL方案。你将在第11章了解路由的整个处理和URL的最佳实践。
1.3.6 建立在ASP.NET平台的精华之上
微软当前的ASP.NET平台为开发高效的Web应用程序提供了一系列成熟的、经充分验证的组件和工具集。
首先,也是最明显的,由于ASP.NET MVC是基于.NET平台的,因此可以灵活地使用任何.NET语言来编写代码,并访问同样的API特性——不仅仅是MVC本身的特性,而且是广泛的.NET类库和大量的第三方.NET类库体系。
其次,已形成的ASP.NET平台特性,如母版页(Master Page)、表单认证(Forms Authentication)、成员(Membership)、角色(Roles)、用户特征(Profiles),以及国际化(Internationalization)等,可以减少你开发和维护Web应用程序的代码量。而且这些特性在MVC框架中的使用同在经典的Web Form项目中的使用一样有效。你可以在ASP.NET MVC应用程序中重用Web Form内建的服务器控件,以及你早期项目中的自定义控件(只要它们不依赖于Web Form的专有概念,如视图状态)。
ASP.NET也涵盖了开发与部署。它不仅被紧密地集成到了Visual Studio之中,也是IIS Web服务器所支持的本地Web编程技术,Windows XP、Windows Vista、Windows 7以及Windows Server产品中都集成了IIS。IIS自第7版开始(IIS 7),利用对ASP.NET应用程序的特殊处理,可以把.NET托管代码作为其请求处理管道的本地部件,实现了对.NET托管代码的一流支持。由于建立在ASP.NET平台的核心之上,MVC应用程序得到了所有这些好处。第23章将讲解把ASP.NET MVC应用程序部署到Windows Server的IIS上所需了解的知识。
1.3.7 现代API
自2002年初以来,微软的.NET平台经过了不断的演变,它现在在许多方面支持甚至定义了达到最新技术发展水平的现代编程。
ASP.NET MVC 3是针对.NET 4而建立的,因此它的API可以充分利用最新语言和运行时的创新,包括扩展方法、lambda表达式、匿名及动态类型以及LINQ等。与早期平台相比,许多MVC框架的API方法和编码模式与早期平台相比,遵循了一种更清晰、更富表现力的写作方式。
1.3.8 SP.NET MVC是开源的
与之前的微软Web开发平台不同,现在我们可以自由地下载ASP.NET MVC的源代码,甚至修改和编译自己的版本。当调试跟踪深入到系统组件,并且想深入代码内部(甚至读取源程序员的注释),这种开源是无价的。如果你正在建立高级组件,并想看看有什么(可进一步)开发的可能性,或者想了解内建组件如何工作等情况时,这种开源也是很有用的。
此外,如果你不喜欢框架的某些工作方式,或发现了一个Bug,或者想访问一些不能访问的东西,这种开源简直太好了,因为,可以自己作一些简单修改。然而,你需要对这些修改保持跟踪,并且在更新到框架的新版本时,把它们重新运用起来。ASP.NET MVC开源工作在微软公共许可(Ms-PL, Microsoft Public License)之下(www.opensource.org/licenses/ms-pl.html),这是一个开放源代码倡议(OSI)核准的开源许可协议。意即,你可以修改源码,部署它,甚至把你的修改公开作为派生项目重新分发。然而,微软不接受对其官方产品的补丁。目前,微软只提供其开发团队和QA团队的产品代码。开发者可以从http://aspnet.codeplex.com/ 网站上下载MVC源代码。
本文仅用于学习和交流目的,不代表异步社区观点。非商业转载请注明作译者、出处,并保留本文的原始链接。