本节书摘来自异步社区《精通 ASP.NET MVC 3 框架(第三版)》一书中的第1章,第2节,作者: 【美】Adam Freeman , Steven Standerson,译者: 林逸 , 李萍 , 更多章节内容可以访问云栖社区“异步社区”公众号查看。
1.2 当今的Web开发
精通 ASP.NET MVC 3 框架(第三版)
除微软之外,自Web Form首次发布以来,Web开发技术发展迅速,这表现在几个不同的方向。除了已经提及的AJAX之外,还有一些其他的主要发展。
1.2.1 Web标准与REST
近些年来,向Web标准兼容的趋势已在增强。Web网站建立在比以往更广泛的设备和浏览器之上,Web标准(HTML、CSS、JavaScript等)使人们有望能够在任何地方——甚至在可联网的冰箱上——都可以有相当好的浏览体验。现代Web平台不可忽视这种商业环境和开发者对顺应Web标准的追求。
与此同时,表现式状态传输(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。——译者注)
当今的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很好地工作。
单元测试工具让你可以规定个别类或其他孤立的小型代码单元的行为。只有将软件设计成一个个独立的模块,才能有效地运用这些工具,以使得每个测试可以独立地运行。遗憾的是,Web Form应用程序很少能够以这种方式进行测试。根据(Web Form的)框架指南,要把逻辑放到事件处理程序中,乃至使用直接查询数据库的服务器控件,开发者往往需要将应用程序逻辑与Web Form的运行时环境紧紧地耦合在一起。这是不能进行单元测试的死结。
UI自动化工具让你能够根据应用程序的一个完整的运行实例来模拟一系列用户交互。理论上,这些工具可以用于Web Form,但当你对页面布局作微小改动时,它们都可能会崩溃。稍有差错,Web Form就会生成完全不同的HTML结构和元素的ID值,导致正在使用的测试套件失效。
.NET开源和独立的软件开发商(ISV)团体已经生产了无数顶级质量的单元测试框架(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还默默无闻,只是一个无名倡导者的开源项目。然而,它突然声名鹊起,转变了 Web 开发的规则。并不是因为它包含了革命性的技术,而在于其概念利用了已有的技术,并把它们以一种有说服力且吸引人的方式融合在一起,而使现有平台相形见绌。
Ruby on Rails(或通常所说的Rails)采纳了一种“模型—视图—控制器”架构。通过运用MVC架构并遵守HTTP协议,提倡约定优于配置,并将对象—关系映射(ORM)工具集成到它的内核,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只在两个主要方面找到了潜力利基(利基,一种小范围但很有作为的环境——译者注)。首先,对于那些建立REST化的Web服务,它恰好能够快速完成工作(第14章会简单涉及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包含了异步控制器(我们将在第14章中进行介绍),这就是一种以非阻塞I/O处理HTTP请求,并提高每CPU处理更多请求的方式。正如你将要了解到的,ASP.NET MVC很好地集成了运行在浏览器端的成熟的JavaScript代码(将在第18、19、20章介绍)。
本文仅用于学习和交流目的,不代表异步社区观点。非商业转载请注明作译者、出处,并保留本文的原始链接。