本节书摘来自异步社区《精通 ASP.NET MVC 5》一书中的第1章,第1.2节,作者: 【美】Adam Freeman(弗瑞曼 A.),译者: 张成彬 , 徐燕萍 , 李萍 , 林逸 责编: 张涛, 更多章节内容可以访问云栖社区“异步社区”公众号查看。
1.2 当今的Web开发
自Web Form首次发布以来,Web开发技术一直在迅速发展,集中表现在几个不同的方面。
1.2.1 Web标准与REST
近年来,朝着Web标准兼容的趋势在增长。Web网站也在比以往更为广泛的设备和浏览器上使用,Web标准(HTML、CSS、JavaScript等)使人们有望在不同的设备上享受一致的浏览体验。现代Web平台不可忽视这种商业环境和开发者对Web标准兼容的追求。
HTML 5已经进入主流运用范围,并给Web开发人员提供了丰富的功能,让客户端能够执行一些以前由服务器独自负责的工作。这些新功能以及日趋成熟的JavaScript库,例如,AngularJS、jQuery、jQuery UI和jQueryMobile等,意味着标准已经变得更为重要,并已形成了富Web应用程序的重要基础。
注:
本书涉及HTML 5、jQuery和其相关技术,但并不深入,因为这些都是有其自身内涵的主题。若需要更完整了解,可以参阅笔者在Apress出版的几本书籍:Pro AngularJS、Pro jQuery 2.0、Pro JavaScript for Web Apps,以及The Definitive Guide to 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以及本地智能手机等应用程序。利用REST,这会显得很自然。REST消除了Web服务与Web应用程序之间的差异,但这需要一种对HTTP和URL进行处理的方法,而这种方法不易得到ASP.NET Web Form的支持(因为Web Form请求的都是.aspx文件,因而难以实现REST的那种资源与HTTP方法相组合的操作)。
1.2.2 敏捷与测试驱动开发
在过去的十多年中,不仅Web开发得到了发展,整个软件开发行业也朝着敏捷方法学的方向转移。这可能包含许多不同的事情,但主要是指将软件项目的实施视为一种适应性的探索过程,以消除超前规划的阻碍和限制。敏捷方法学热衷于将一组特定的开发实践与促进和辅助这些实践的工具(通常是开源的)协同推进(例如以下所描述的测试驱动开发,就是让测试驱动开发这种开发方法与测试工具共同发展)。
测试驱动开发(Test-Driven Development,TDD)及其“近亲”行为驱动开发(Behavior-Driven Development,BDD),就是两个例子。其思想是,首先描述想要得到的行为范例(或称为测试规范)来设计软件,这样,任何时候通过执行依附于这一实现的一套测试,以验证应用程序的稳定性和正确性(在TDD/BDD开发中,你的软件是根据测试规范而实现的。于是,这套测试便可以随时用来验证你的这一实现)。.NET并不缺乏支持TDD/BDD的工具,但它们几乎无法与Web Form很好地工作。
单元测试工具(Unit Testing Tools):让你可以指定个别类或其他孤立的小型代码单元的行为。只有将软件设计成一个个独立的模块,才能有效地运用这些工具,这样每个测试可以独立地运行。遗憾的是,很少有Web Form应用程序能够以这种方式进行测试。
UI自动化工具(UI Automation Tools):让你能够根据应用程序的一个完整的运行实例,模拟一系列用户交互。这些工具可以用于Web Form,但当你对页面布局做微小改动时,它们都可能会崩溃。稍有差错,Web Form就会生成完全不同的HTML结构和元素的ID值,导致测试套件失效。
.NET开源和独立的软件供应商(Independent Software Vendor,ISV)团体已经生产了无数顶级质量的单元测试框架(NUnit、xUnit)、模仿框架(Moq、Rhino Mocks)、控制反转容器(Ninject、AutoFac)、持续集成服务器(Cruise Control、TeamCity)、对象关系映射器(NHibemate、Subsonic)等。传统的ASP.NET Web Form因其单片式设计(指用户界面及其后台处理逻辑被耦合在一起的设计方式),而不适用于这些工具和技术。因此,Web Form未能从这些项目中得到太多的“尊重”(意指这些工具在其设计过程中,很少会顾及它在Web Form中的可用性)。
1.2.3 Ruby on Rails
2004年Ruby on Rails还默默无闻,只是一个无名倡导者的开源项目。突然声名鹊起,改变了Web开发的规则。并不是因为它包含了革命性的技术,而在于其概念利用了已有要素,把它们以一种有说服力且有吸引人的方式融合在一起,而使现有平台相形见绌。
Ruby on Rails(或通常所说的Rails)采纳了MVC架构(将在第3章中描述)。通过运用MVC架构,并与HTTP协同工作,提倡约定优于配置,将对象-关系映射(Object-RelationalMapping,ORM)工具集成到它的内核,几乎无需太多努力Rails应用程序就可以建成。就好像Web开发一直以来就应该是这样。Rails表明,顺应Web标准和REST化并不困难。它也表明,当框架被设计成支持敏捷开发与TDD时,它们工作起来是最好的。从那时起,整个Web开发领域都被调动起来了。
1.2.4 Node.js
Web开发的另一个明显趋势是朝着以JavaScript作为主要编程语言的方向发展。AJAX首先展示了JavaScript是重要的,jQuery展示了它功能强大而雅致,而Google的开源V8 JavaScript引擎,则展示了它可以十分快速。如今,JavaScript正在成为一种重要的服务器端编程语言。它为一些非关系型数据库(包括CouchDB和Mongo等)提供数据存储和查询语言服务,并被用作服务器端平台的一种通用语言,如Node.js。Node.js出现于2009年,并很快得到了认可。其关键创新如下。
使用JavaScript:开发者只需要使用这一种语言,即可应对从客户端代码到服务器端逻辑,甚至对CouchDB等数据库的数据查询逻辑。
完全异步:在等待输入/输出(I/O)或任何其他操作时,Node.js的API不会显露出任何形式的线程阻塞。通过启动其操作,然后在该I/O完成时接收一个回调,便实现一个完整的I/O操作。这意味着,Node.js形成了非常有效的系统资源利用,使得每CPU可能处理数以万计的并发请求(其他平台只能期望将每CPU的并发请求限制在100次左右)。
Node.js仍是一种利基(Niche,一种小范围但很有作为的环境)技术。有点奇怪的是,它对Web应用程序开发的最大贡献即为提供了一个能够编写开发工具的相容的JavaScript引擎。许多新兴的客户端JavaScript框架,比如AngularJS,都具有使用Node.js的良好工具支持。
Node.js部署Web应用程序所采用的方法很慢。在有时间限制的情况下,建立实际应用程序的大多数业务,通常都需要诸如Ruby on Rails和ASP.NET MVC等全技术堆栈框架下的底层架构。这里提到的Node.js,只是把ASP.NET MVC的某些设计放在行业趋势的大背景下讨论。例如,ASP.NET MVC包含了异步控制器(Asynchronous Controller,第19章描述),这就是一种以非阻塞I/O处理HTTP请求,并提高每CPU处理更多请求的方式。