1.2 当今的Web开发
精通 ASP.NET MVC 4
除微软之外,自Web Form首次发布以来,Web开发技术发展迅速,这表现在几个不同的方向。除了Ajax之外,还有一些其他的主要发展。
1.2.1 Web标准与REST
近年来,向Web标准兼容的趋势已在增强。Web网站建立在比以往更广泛的设备和浏览器之上,Web标准(HTML、CSS、JavaScript等)使人们有望在任何地方——甚至在可联网的冰箱上——都可以有相当好的浏览体验。现代Web平台不能忽视这种商业环境和开发者对遵从Web标准的追求。
HTML5正在进入主流运用,它给Web开发人员提供了丰富的功能,这让客户端能够执行一些以前要由服务器独自负责的工作。这些新功能以及日趋成熟的JavaScript库,例如jQuery、jQuery UI和jQueryMobile等,意味着标准已经变得更为重要,并且是更为丰富的Web应用程序的重要基础。
注:本书简要讨论HTML5、jQuery及其相关技术,并不打算深入,因为它们都是有自身内含的主题。如果要完整了解,可以看看Apress出版的几本Adam的书:Pro jQuery(《精通jQuery》)、Pro JavaScript for Web Apps(《精通用于Web应用程序的JavaScript》),以及The Definitive Guide to HTML5(《HTML 5权威指南》)。
与此同时,表现式状态传输(Representational State Transfer,REST)已经成为应用程序在HTTP上互操作的主要体系架构,完全使SOAP(ASP.NET原先进行Web服务的支撑技术)黯然失色。REST根据表示真实世界实体的资源(URI)和表示在这些资源上可用的标准操作(HTTP方法)来描述一个应用程序。例如,用户可能会PUT(传递)一个新的http://www.example.com/Products/Lawnmower (含义为更新一台除草机——译者注),或DELETE(删除)http://www.example.com/Customers/Arnold-Smith (删除某客户)。(这两个例子的含义为,通过HTTP方法与资源地址的组合就可以对资源执行相应的操作,而这种HTTP方法与资源地址的组合就是REST,执行这种操作的请求也称为REST化的请求——译者注)
当今的Web应用程序不只服务于HTML,通常也必须把JSON或XML数据提供给各种客户端技术,包括AJAX、Silverlight以及本地智能手机等应用程序。利用REST,做这些事情会很自然。REST消除了之前Web服务与Web应用程序之间的差异,但这需要一种对HTTP和URL进行处理的办法,而这种办法却难以得到ASP.NET Web Form的支持。
1.2.2 敏捷与测试驱动开发
在过去的十多年中,不只Web开发得到了发展,整个软件开发行业也朝着敏捷方法学的方向转移。这可能包含许多不同的事情,但主要是指将软件项目的实施视为一种适应性的探索过程,以消除超前规划的阻碍和限制。敏捷方法学热衷于将一组特定的开发实践与促进和辅助这些实践的工具(通常是开源的)协同推进。
测试驱动开发(TDD,Test-Driven Development)及其最新的化身——行为驱动开发(BDD,Behavior-Driven Development),是两个突出的例子。其思想是,通过描述想要得到的行为范例(称为测试或规范)来设计软件,因此,任何时候都可以执行依附于这一实现的一套规范来验证应用程序的稳定性和正确性(在TDD/BDD开发中,软件是根据测试规范而实现的。于是,这套测试便可以随时用来验证软件这一实现——译者注)。.NET支持TDD/BDD的工具并不缺乏,但它们几乎都不能与Web Form很好地工作。
单元测试工具(Unit Testing Tools):可以规定个别类或其他孤立的小型代码单元的行为。只有将软件设计成一个个独立的模块,才能有效地运用这些工具,以使得每个测试可以独立地运行。遗憾的是,Web Form应用程序很少能够以这种方式进行测试。根据(Web Form的)框架指南,要把逻辑放到事件处理程序中,乃至使用直接查询数据库的服务器控件,开发者往往需要将应用程序逻辑与Web Form的运行时环境紧紧地耦合在一起。这是不能进行单元测试的死结。
UI自动化工具(UI Automation Tools):能够根据应用程序的一个完整的运行实例来模拟一系列用户交互。理论上,这些工具可以用于Web Form,但当页面布局被微小改动时,它们都可能会崩溃。稍有差错,Web Form就会生成完全不同的HTML结构和元素的ID值,导致正在使用的测试套件失效。
.NET开源和独立的软件供应商(ISV,Independent Software Vendor)团体已经生产了无数顶级质量的单元测试框架(NUnit、xUnit)、模仿框架(Moq、Rhino Mocks)、控制反转容器(Ninject、AutoFac)、持续集成服务器(Cruise Control、TeamCity)、对象关系映射工具(NHibemate、Subsonic)等。这些工具和技术的支持者们都已达成一致意见,在共享品牌ALT.NET下发布并组织会议。传统的ASP.NET Web Form因其单片式设计(指用户界面及其后台处理逻辑被耦合在一起的设计方式——译者注),而不适用于这些工具和技术。因此,Web Form未能得到专家组和行业思想领导者们起码的尊重。
1.2.3 Ruby on Rails
2004年,默默无闻的Ruby on Rails只是一个无名倡导者的开源项目。突然有一天,Ruby on Rails声名鹊起,开始转变Web 开发的规则。并不是因为它包含了革命性的技术,而在于其概念利用了已有要素,并把它们以一种有说服力且吸引人的方式融合在一起,而使现有平台相形见绌。
Ruby on Rails(或通常所说的Rails)采纳了MVC架构(马上对此进行描述),通过运用MVC架构并遵循(而不是违背)HTTP协议,提倡约定优于配置,并将“对象—关系”映射(ORM,Object-Relational Mapping)工具集成到它的内核,Rails应用程序几乎无需太多努力就可以建成。就好像Web开发一直以来就应该是这样,好像人们突然意识到,这些年来一直在进行工具奋战(在努力制作一些其实不需要的工具——译者注),而现在,这一切都结束了。
Rails表明,顺应Web标准和REST化并不困难。它也表明,当框架支持敏捷开发与TDD时,它们工作起来是最好的。从那时起,整个Web开发世界都被调动起来了。
1.2.4 Sinatra
感谢Rails,很快有很多Web开发者以Ruby作为他们的主要编程语言。但在当今这样一个有强烈创新意识的社会中,出现Rails的替代品只是时间问题。2007年,最著名的Sinatra问世了。
Sinatra摒弃了几乎所有标准的Rails风格的底层架构(路由、控制器、视图等),而仅仅把URL模式映射到Ruby代码块。访问者请求一个URL,这会引起执行一个Ruby代码块,并把数据回送给浏览器——这就够了。这是Web开发的一种难以置信的简单形式,但Sinatra只在两个主要领域找到了利基(利基,Niche,一种小范围但很有作为的环境——译者注)。首先,对于那些建立REST化的Web服务,它恰好能够快速完成工作(第25章会简单涉及REST)。其次,由于Sinatra可以连接广泛的开源HTML模板和ORM技术,通常以此为基础来装配一个自定义的Web框架,以适应手头各种项目的体系架构需求。
Sinatra尚未在Rails(或ASP.NET MVC)等全堆栈MVC平台中占据重要的市场份额。这里简单地提到它,只是想说明Web开发行业正在朝着简化的方向发展,也因为Sinatra起到对抗其他框架(甚至聚集了更核心的特性)的作用。
1.2.5 Node.js
Web开发另一个明显的趋势是朝着以JavaScript作为主要编程语言的方向发展。AJAX首先展示了JavaScript是重要的,jQuery展示了它的功能强大而雅致,而Google的开源V8 JavaScript引擎则展示了它难以置信的快速。如今,JavaScript正在成为一种重要的服务器端编程语言。它为一些非关系型数据库,包括CouchDB和Mongo等,提供数据存储和查询语言服务,并被用作服务器端平台的一种多用途语言,如Node.js。
Node.js于2009年出现,并很快得到了广泛认可。从体系结构上看,它类似于Sinatra,因为它不采用MVC模式,而是以更低级的方式把HTTP请求连接到代码。其关键创新如下所示。
使用JavaScript:开发者于是只需要使用一种语言,从客户端代码到服务器端逻辑,甚至对CouchDB或之类的数据查询逻辑。
完全异步:在等待输入/输出(I/O)或任何其他操作时,Node.js的API根本不会显露出任何形式的线程阻塞。通过启动其操作,然后在该I/O完成时接收一个回调便实现一个完整的I/O操作。这意味着,Node.js形成了非常有效的系统资源利用,使得每CPU可能处理数以万计的并发请求(其他平台只能期望把每CPU的并发请求限制在100左右)。
同Sinatra一样,Node.js是一种利基技术。在有时间限制的情况下,建立实际应用程序的大多数事务,一般都需要用到诸如Ruby on Rails、ASP.NET MVC等全技术堆栈框架下的所有底层架构。这里提到的Node.js,只是把ASP.NET MVC的某些设计放在行业趋势的大背景下讨论。例如,ASP.NET MVC包含了异步控制器(将在第17章进行介绍),这就是一种以非阻塞I/O处理HTTP请求,并提高CPU处理更多请求的方式。正如读者将要了解到的,ASP.NET MVC很好地集成了运行在浏览器端的成熟的JavaScript代码。
本文仅用于学习和交流目的,不代表异步社区观点。非商业转载请注明作译者、出处,并保留本文的原始链接。