微软已经为Web开发人员献上了一份大礼。自从2001年以Beta形式第一次介绍给公众开始,.NET Framework以及它的ASP.NET子集已经改变了我们创建Web应用程序的方式。在这之前,大部分人甚至还没有考虑过“应用程序(application)”这一术语,而是仅仅把松散的脚本集中起来组成一个Web站点。
对于许多开发人员来说,促成这个转变需要严肃的信念和大量新知识的学习。ASP 3.0、ColdFusion和PHP等脚本语言可以使得那些具有很少甚至没有任何编程经验的人快速地学习整个平台并开始构建动态web站点,甚至不需要多年的开发经验或者计算机科学方面的学术背景。
虽然学术背景不是必须的,但是对于ASP.NET来说,脚本开发人员需要在他们的思想中进行一些相当激进的改变才能最有效地使用这个令人惊异的平台。本书的目的就在于帮助你完成这个转变,如果你已经相当精通面向对象设计,它会让你熟悉ASP.NET平台架构。
为什么写这本书
在浏览了Internet上大量的论坛和新闻组后,我越来越清晰地看到许多聪明的开发人员在过渡到ASP.NET过程中,在理解和运用面向对象上遇到了一些麻烦。一方面我们在赞扬微软为我们发布了这个平台,一方面又在抱怨他们把ASP.NET做得如此安全诱人,因为它并不是逼着你遵守他们所规划的“最佳实践(best practice)”,你甚至可以使用传统的脚本方式完成相同的工作。
编写一本直接介绍某项技术的书,或者是一本包含各种各样帮助的“食谱(cook book)”不是难事,但是我的真正目的是要编写一本帮助你理解平台底层概念和架构的指南,这样你也可以将同样的概念应用于自己的应用程序中。实际上,我在第2章中就指出了:“你所编写的代码与微软在成千上万个.NET基类中的代码并没有什么不同”,但是一本“食谱”或者概览(overview)无法帮你理解这一点。
本书并非面向对象技术的传教书,目的仅在于向你展示隐藏在这一概念背后的基本原理,从而鼓励你去使用它。希望能激发你的灵感,使你感叹:“哦!我明白了,原来是这样子的!”使用OOP只是因为它比另外的方法更好。
这本书适用于谁
这本书假设你已经对ASP.NET的基本知识已经有了入门性地了解,并且基本掌握相关的C#或者VB.NET语言,也假设你对使用Microsoft SQL Server具有基本的理解并知道什么是关系数据库。你可能以前是一名脚本开发人员,希望学习Asp.Net平台以及它强大的面向对象架构。你也可能是一个经验丰富的开发人员,希望能够了解一些ASP.NET平台的特定细节,使你能熟练掌握控制它,这些开发人员可以跳过部分章节。
本书都是基于上下文的,不论你以前属于哪个技术阵营。开发人员通常都是高智商人士,主要通过理解而不仅仅是通过记忆来学习。本书基于面向对象编程并将它应用于ASP.NET和Visual Studio,给读者提供更全面的技术,其中包括:应用程序设计、测试驱动的开发、代码复用、模块化以及对性能的关注。本书通过从“如何做”推进到“为什么这么做”,将整个平台放到上下文中讨论,并不只是解释概念,同时以最佳方式推广它们以解决实际的问题。如果你以前一直是写脚本语言,或者希望使你的技术更加适用于.NET编程的其他领域,那么这本书将非常适合你。
如果你是ASP.NET的新手,这本书并不适合你。你应该从那些有“初学者”或者“入门”字样标题的书开始学起。当你已经掌握了基础知识之后,再回到本书来加强你的知识。我们不希望涵盖诸如模板页、用户控件、数据库操作、窗体验证 等基本知识。
我认为前面的术语“最佳实践”有点用词不当。某些概念和方法论的确比另外一些要好,但是这个术语是在整个程序世界里的普遍真理。一些人可能认为只有死亡和纳税才是真正的普遍真理,因此每当你读到我所坚信的最佳实践时,请记住,根据你的经验以及当前的问题,可以有很多解释的余地。同样对于其他任何事情,请使用能够适合自己需求的方式工作。
约定
当有代码需要展示时,它们的形式如下所示:
C#
public class ThisIsAGreatClass
{
// lots of code here
}
.
VB.NET
Public Class ThisIsAGreatClass
' lots of code here
End Class
特别指出,旁注、重要提示以及其他不相关的内容将与本书正文分离开来,如同以下形式所示:
这是你要考虑到的。
Play-by-Play
下面是本书内容的简明大纲:
第一部分:到面向对象编程的飞跃
第1章,“对象模型”。面向对象模型已经有些年头了,但是对于写脚本语言的开发人员来说还是新概念。你将学习到,在.NET世界中,包括你自己的代码,万事万物都是对象。并通过“汽车的构造和使用”这个精典例子,认识面向对象的概念。
第2章,“类:隐藏在对象背后的代码”。当你了解了对象的定义及它如何包含一些功能性之后,我们来看一下编写类的具体细节。你将学习到关于对象、继承、保护级别、静态方法、枚举和界面的实例。
第3章,“类的设计”。在应用程序里,类可以有很多不同的作用。有时它用来执行一段代码,例如大家都比较熟悉的System.Web.UI.Page类,有时它仅仅是将数据集合起来,对于大多数更有用的类,则能处理所有这些事情。
第4章,“应用程序架构”。除了ASP.NET,再大的项目都可以用N层架构来开发应用程序,使它易于构建、配置和维护。我们将来看看这种通用的设计模式,并标注什么时候使用什么时候不使用。
第5章,“应用面向对象编程:自定义数据类”。这一章介绍了一个类设计的实例,操作数据库,并且对数据进行缓存以优化性能。这个模型展示了面向对象代码的要点,一次编写,多次使用。
第二部分:ASP.NET架构
第6章,“IIS和Web应用程序的具体细节”。不管你如何编写你的应用程序,需要正确地部署文件、文件夹和程序集才能使它们正常的工作。
第7章,“ASP.NET事件模型”。来自你应用程序访问用户的每一次请求,都有一个生命周期,通过理解和跟踪生命周期,你可以在特定的时间干预或执行一定的操作以最有效地使用你的应用程序。页面、应用程序、控件事件的执行都被包含其中。
第8章,“HttpHandlers 和 HttpModules”。ASP.NET不仅仅能生成页面,而且你能利用HttpHandlers 和 HttpModules来处理特殊请求。我将给你一个handler的例子,防止图片被盗链。
第9章,“服务器控件”。你可能发现你要频繁使用相同的复合控件,或者现有的控件无法满足你的需要。创建自定义控件的方法很简单,你所使用的很多控件就是由微软以这样的方法来创建的。
第10章,“Web服务也是一种对象”。将你现有的代码创建成Web Services是很容易的,并且易于创建代理类来调用服务。Web Services使你可以像应用程序中的一个对象一样调用远程代码。
第11章,“成员管理及安全”。ASP.NET有一套完善的类,帮助你控制站点的访问和验证你的用户。你能使用很少的代码甚至不使用来验证你的用户或者扩展系统,从而构造自己的定制方案。你将从中学到如何去开发一套定制的Membership provider来将系统连接到你自己的数据。
第12章,“用户配置、主题及皮肤”。当你不只是要保存用户的Email和密码数据时,ASP.NET开发团队还提供了一种方案,在几乎不影响你系统的前提下保存这些数据,你同样也可以直接使用自己的provider来扩展个人资料系统。丰富的皮肤系统可以满足你的用户的偏好,因此他们不必局限于你站点的默认界面。
第13章,“声明式编程”讨论到面向对象代码,那么什么是声明式编程,并且适用在哪?我们将讨论一些通用的控件和他们在ASP.NET中的使用。
第三部分:开发问题
第14章,“使用Visual Studio进行开发”。如果没有那些差异性,Visual Studio并不是像很多人宣称的那样是现有的最伟大的开发工具,它很有可能是最伟大的工具,但是你不得不像一个桌面应用程序开发人员那样思考。我们可以通过Visual Studio来查看程序事件的发生步骤,以及如何进行调试。
第15章,“性能、伸缩和测试”。你可以有很多种方法来使你的代码具有工业力度,但你只须要掌握其中几种。有很多工具和方法可以用来测量你应用程序的性能。
第16章,“测试、部署以及代码管理”。一个项目越大,它越难于维护和部署。在测试和编译你的代码的时候,可以用很多种方式来组织。我们将在此讨论测试驱动开发的基础。
第17章,“更多高级主题”。.NET Framework有相当多的类,这里简单介绍了少数实用的高级类的用法,包括流、网络和线程。
代码下载
你可以从下列站点下载到本书的所有代码。
http://www.uberasp.net/books/
为什么还要出版一本关于asp.net 的书?而且还是“最优化”?书店的IT技术专柜里有一半的书都是讲asp.net 或者面向对象程序设计的,难道还不够?
这两年,每年从计算机软件或相关专业毕业的本科生和研究生的人数大约在30万左右,很多人在他们的求职简历上写着“精通面向对象程序设计”(OO)或“熟练掌握asp.net”。等来到了微软面试之后,我和我的同事往往要在“精通”和“熟练”上划上问号。为什么?因为他们对“面向对象程序设计”的“精通”,仅仅停留在理论上;而对“asp.net”的“熟练”,也只是写一些简单的脚本,或者是在数据库中添加一个字段而已。精通OO的人,可以大谈Polymorphism, 但从来没有动手设计过实用的网站;熟悉网站开发的人,可以对如何用脚本定制网页的皮肤侃侃而谈,但是对OO 却话不投机。
网站的设计方法,大部分都强调实用、快速和简单。有了新的需求,就用脚本不断往上加东西。这样的做法,往往会导致所谓的“band-aided system”(胶布系统)。用胶布(即使是很酷的邦迪透明防水创可贴)把东西凑合着粘贴起来,快则快矣,牢则未必。从长期来看,这些系统会有以下方面的隐患:
·可维护性 —— 除了程序作者本人,别人很难读懂网站的设计。
·效能 ——一些看似无妨的小改动往往会导致网站效能的下降。
·坚固性(robustness)—— 不牢靠,不能保证(或者不知如何保证)24/7 不间断的服务。
·可扩展性 —— 网站不容易升级、迁移到其他平台和数据库上。
要从根本上解决这一问题,我们要从对象出发,设计易维护、可扩展的网络服务,这本书是一本很好的入门书。
从另一方面看,目前很多“面向对象”的程序设计书籍都是基于C++等传统计算机语言的,比较偏重于理论,对于互联网的应用着墨不多。很多刚毕业的学生都反映,课堂上所学的知识和实际应用中所需要的知识相差甚远。这本书给他们提供了另一种思路和实践的机会。
这本书的另一个特点就是,一方面介绍了非常实用的工具,如效能分析工具Perfmon;另一方面也介绍了非常有效的工作流程,如测试驱动的开发。并不是只有非常庞大和完备的工具和流程才能开发出好的软件。平常的工具,如果使用得恰到好处,也可以起到四两拨千斤的效果。
我和本书的译者刘俊民是在一年多以前的一次微软技术讲座上认识的,他的网名“宝玉”在网上知名度极高。他在asp.net 领域踏踏实实地做了不少项目,他汉化的Community Server 正在不少网站上运行着。翻译这本书又是他对自己的挑战,让人钦佩。
本书的另外一名译者陈远正在西北工业大学攻读计算机软件的硕士学位,目前正在微软亚洲研究院实习,使用asp.net开发企业人力资源管理软件,是一位勤奋好学的人才,利用业余时间写了不少文笔生动的blog。
随着网络应用的不断发展,如何能够提供高效、易维护和可扩展的网络服务是每一个软件开发人员都会思考的一个大问题。我相信这本书会帮助读者从“写脚本”的水平上升到“设计”的高度,提高自己的能力。我不敢说它一定是“最优化”的解决方案,但它的确值得一读。
邹欣
微软亚洲研究院 研发经理
2006.7.13 于 Redmond WA USA