本书主要介绍了设计和开发基于组件的.NET应用程序所需要的技术及相关主题,说明了.NET组件程序设计的起源和它对以往技术缺陷所作的改进。本书还利用大量的代码示例、使用技巧、开发警示、设计准则和富有创意的实用工具,向读者介绍如何运用.NET框架编写可复用、可维护和健壮的组件。通过此书,读者还能了解到组件技术在.NET平台上的实现和应用,以及如何在几种设计和编程模型中选择最佳方案。全书内容翔实,示例丰富,是近年来组件程序设计方面不可多得的佳作。
前言\r\n第1章 面向组件编程简介\r\n 基本术语\r\n 面向组件和面向对象编程的比较\r\n 面向组件编程的原则\r\n .NET对于组件原則的遵循\r\n .NET组件开发\r\n第2章 .NET面向组件的编程要素\r\n 语言独立性:公共语言运行时\r\n 打包和部署:程序集\r\n 二进制兼容性\r\n第3章 基于接口编程\r\n 接口和实现分离\r\n 使用接口\r\n 接口和泛型\r\n 设计和分解接口\r\n Visual Studio 2005中的接口\r\n第4章 生命周期管理\r\n 托管堆\r\n 传统内存释放模式\r\n .NET垃圾回收\r\n 对象终结\r\n 确定性终结\r\n第5章 版本控制\r\n 程序集版本号\r\n 程序集部署模型\r\n 程序集强名称\r\n Visual Studio 2005和版本划分\r\n 自定义版本策略\r\n CLR版本划分\r\n第6章 事件\r\n 基于委托的事件\r\n 使用.NET事件\r\n第7章 异步调用\r\n 异步机制的必备条件\r\n 委托的老调重弹\r\n 异步调用编程模型\r\n 异步错误处理\r\n 异步事件\r\n 异步调用缺陷\r\n 同步和异步处理\r\n第8章 多线程和并发管理\r\n 线程和多线程\r\n 组件和线程\r\n 使用线程\r\n 同步线程\r\n 自动同步\r\n 手动同步\r\n Wor''kel—Thfead包装类\r\n 同步委托\r\n 使用.NET多线程服务\r\n第9章 序列化和持久化\r\n 自动序列化\r\n 序列化格式器\r\n 序列化事件\r\n 序列化和流\r\n 自定义序列化\r\n 序列化和类层次结构\r\n第10章 远程处理\r\n第11章 上下文与拦截\r\n第12章 安全\r\n附录A 基于接口的Web服务\r\n附录B 统一Windows Forms和ASP.NET安全\r\n际录C 反射和属性\r\n附录D 泛型\r\n附录E C#编码标准\r\n索引
迟到的经典
初识Juval Löwy,是在2004年,我正在《程序员》杂志做技术编辑。因为当时博文视点打算从O’Reilly引进一批经典书籍,Programing .NET Components正在其中。阅读完此书的第一版后,从来没有做过翻译工作的我突然有一种不可抑止的冲动——我真的非常想翻译这本书,这种冲动让我突觉惊讶。而我的良师益友孟岩先生恰恰是那批书籍的技术审校,他也答应我如果有可能,会将本书的翻译工作交给我来做。后来由于种种原因,本书的第一版没有如愿引进,可我却记住了Juval Löwy。在我有限的阅读中,这本书是我见到的在.NET领域关于组件设计水平最高的书。同样的,Juval Löwy也是我最推崇的技术专家之一,就如大多数人对于Martin Fowler在企业架构和软件工程领域的推崇那般,撇开本书不谈,作者的另外一本书COM and .NET Component Services也是经典之作。
之后,我离开了杂志社,进入一家互联网公司工作,也才意识到这本书对我带来了怎样的影响。在过去的两年时间内,不论是我主持开发的项目,还是给别人提供技术咨询的项目,Juval Löwy对于.NET架构深刻而精辟的见解已经成为了我工作中的“圣经”。我知道,这样的形容有点言过其实,见解也有些偏颇,而作为本书的译者,希望我的这些言语不会影响你对于本书的判断。
在过去的7年时间,从最早的.NET概念到.NET 1.0、.NET 1.1、.NET 2.0,再到最近发布的.NET 3.0,.NET世界发生了太大的变化。有时候开发人员会觉得很幸福,因为我们发现软件开发越来越简单。与此同时,又会觉得很痛苦,因为变化的速度甚至超过了我们学习和理解的速度。这个世界没有永恒的东西,唯有变化,就如变化的世界,变化的软件产业,当然也包括变化的.NET。
本书的第2版相对于第1版,也与时俱进,做了一些调整,加入了一些新的内容。而国内和国外的技术界存在一个时间差,大多数人的看法是两年,而本书在美国是2005年出版的,中文版也只有在2007年跚跚来迟了。我想2007年对于国内技术界来说是一个广泛采纳.NET 2.0的一年,也正因为如此,希望本书能够帮助你解决一些困扰许久的问题。
如果你是初级.NET开发人员,那么我建议你先掌握一些.NET的基础知识之后再阅读本书。
如果你是中级.NET开发人员,那么我强烈建议你用心阅读本书,你会进入一个更加宽广的世界。
如果你是高级.NET开发人员,那么我还是有足够的理由建议你阅读本书,因为其中的许多.NET内部原理和设计技巧依旧是值得我们学习的。
如果你是Java架构师,那么也不应该错过本书,因为Juval Löwy关于组件和接口编程的思想同样适用于Java世界。
感谢出版社的周筠老师引进了本书的第2版,更加感谢她给了我这个机会完成心中的梦想,翻译了此书。感谢梁晶编辑和何艳编辑,也感谢本书的审校曹严明先生。因为个人水平有限,翻译难免出错,也希望拿到本书的读者阅读完此书能够给我一个中肯的批评和建议。
最后,感谢我的母亲,是她教会了我如何感恩。
刘如鸿
2007年3月
Juval Lowy是IDesign(一家专注于.NET咨询和培训的公司)的首席软件架构师。同时作为微软开发社区的知名专家,鉴于他在.NET解决方案设计及移植过程中的杰出贡献,微软公司授予其“软件英杰(Software Legend)”的荣誉称号。
我很荣幸能够在职业生涯中经历了几代Microsoft组件技术的变迁。20世纪90年代中期我开发过DLL,提供导出函数以供使用,并通过MFC扩展DLL来公开类。我亲身体验过管理之间存在互操作的一组应用程序(由156个DLL构成,而且要作为一个单元来部署)是多么复杂,也经历过由于这些DLL使用序数而带来的版本控制和维护问题。我帮助设计了类似COM的方案来解决那些问题,并依然记得当我第一次听说COM和我使用命令行工具生成第一个GUID的情形。
在ATL远未问世之前我就学会了如何编写类工厂和IDL接口程序,我还在RPC被DCOM替代之前,就使用过RPC。我使用COM设计过基于组件的应用程序,并且体会过与不熟悉必要的COM知识的开发人员分享设计思路有多难。我使用过MTS编写程序,并且在此过程中学会了一些权宜之计。当用COM+来架构大规模企业框架时,我惊叹COM+所展现出的优雅和实用。
随着面向组件技术的不断发展与演进,我对面向组件技术的理解与认识也不断深入。我经常自问:使用组件的基本原则是什么?它们与传统面向对象编程的区别何在?我努力从以往所犯的错误中学习新的东西,提取平时遇到的和自己领悟到的各种好的想法和技术,并推而广之。我相信自己已经界定出一些面向组件设计中的核心原则,这些原则超越了今天可用的所有技术,并且从长远来看,它们能够构造出更易于复用、扩展和维护的组件。
随着.NET框架的出现,Windows开发人员终于拥有了一种卓越的技术,能够简化基于组件的应用程序的开发和部署工作。.NET是微软公司呕心沥血之作,在我看来它很好地改善了以往的相关技术尤其是COM的不足之处。它融合并加强了已经被证明了的诸多技术和方法,同时保留了这些技术中的核心优势。
对我而言,根本上讲.NET是一种组件技术,它为生成二进制组件提供了简单便捷的方法,而且符合那些我认为非常合理的设计原则。.NET是全新设计的,旨在简化组件的开发和部署,并支持各种编程语言间的互操作。.NET的应用范围广泛,其组件可以用于创建多种多样的基于组件的应用程序,既包括独立的桌面应用程序,也包括基于Web的应用程序和服务。
当然,.NET不仅仅是一种组件技术,事实上它是一整套技术的总称。
提示:本书中,“.NET”这个术语既用来泛指.NET框架,也用于具体指该框架所体现的组件技术。
.NET提供了许多专门的应用程序框架,其中包括用于富Windows客户端的Windows Forms,用于数据访问的ADO.NET,用于Web应用的ASP.NET,用于公开和使用远程服务(这些服务使用SOAP和其他基于XML的协议)的Web Services。Visual Studio 2005支持使用C#、Visual Basic、托管C++(Managed C++)和J#来开发.NET应用程序,除此之外也可以使用其他语言。你能够在Windows或SQL Server 2005中宿主.NET。微软服务器产品会在未来几年里越来越多地支持与.NET连接(.NET Connected)的应用程序,Windows的未来版本也将主要建立在.NET的基础上。
本书范围
Scope of This Book
本书涵盖了设计、开发基于组件的.NET应用程序所需要的技术及相关主题。不过为了充分理解.NET,本书还介绍了其起源以及它对以往技术缺陷作了哪些改进。除了向读者展示如何执行某些任务外,本书还会经常通过面向组件程序设计的原则阐释这些任务背后的基本原理。熟识了这些理念后,你就能在可维护性、可扩展性、可复用性以及性能方面最大限度地优化你的应用程序设计。即使没有COM的相关知识也能阅读本书,但我在解释.NET的运作原理时还是会偶尔使用COM作为参考。
通过本书你不仅可以学习.NET组件编程及相关系统的问题,还可以了解相关的设计选择、技巧、最佳操作实践以及一些陷阱。本书回避了许多.NET实现细节,而把主要篇幅集中在将.NET作为一种组件技术的可能性和实际操作上:例如怎样使用该技术,怎样在可供选择的设计和编程模型中选出最佳方案。此外,本书还包含了许多有用的实用程序、工具和自 .NET 问世5年以来我所开发出来的帮助类,所有这些都是为了提高生产效率和所开
发的.NET组件的质量。阅读完本书后,你就能够充分利用.NET开发基础架构和应用框架,立即动手开发自己的.NET组件。本书包含了设计、开发基于组件的.NET应用程序所需要的技术及相关主题。本书对.NET 1.1和.NET 2.0作了详尽的解释。
下面简要介绍一下本书的主要章节和附录。
第1章,面向组件编程简介
本章提供本书中使用的基本术语。对比了面向对象编程和面向组件编程的差异,然后列举面向组件编程的一些原则。这些原则解释了如何使用.NET背后的真正原理,理解它们是正确构建基于组件的应用程序的一个先决条件。
第2章,.NET面向组件编程基础
本章描述了.NET的基础,如公共语言运行时(CLR)、.NET编程语言、代码生成过程、程序集及其构建和组合。结尾将解释.NET如何维护客户方和组件之间的二进制兼容性,并讨论了这种编程模型方案的本质。如果你已经熟悉了 .NET 框架的基础知识(1.1版和2.0版),可只随意地浏览一下本章,甚至完全跳过它。
第3章,基于接口编程
本章阐述基于接口的工作方式。解释如何将接口与其.NET实现分离开来,如何实现接口,以及如何设计和构造接口来满足可重用性、可维护性和可扩展性。
第4章,生存周期管理
本章讨论了.NET管理对象的方法,以及这种方法对整个.NET编程模型带来的正面和负面影响。解释底层.NET垃圾回收机制,同时展示了组件开发人员如何处理被组件实例持有的资源。
第5章,版本控制
首先本章描述了.NET版本控制策略及其部署和共享组件的方式。在讨论了默认策略之后,还展示了如何提供自定义的版本绑定和解析(resolution)策略来满足应用程序特定甚至机器的特定需要。本章还讨论了如何开发那些支持.NET自身多个版本的应用程序。
第6章,事件
本章展示了如何在基于组件的程序中发布和订阅事件。在讨论了.NET提供的内置支持之后,展示了许多最佳实践和实用工具,它们都是为了充分利用基本的事件支持,并加以改进的。
第7章,异步调用
本章描述了.NET对组件异步调用的内置支持、可用的编程模型及其优劣、如何使用它们以及其中的陷阱。
第8章,多线程和并发管理
本章深入解释了如何创建多线程组件。现代应用程序几乎没有不使用多线程的,但随之而来的是代价沉重——须同步对组件的访问。本章展示了如何创建和管理线程,如何使用手动同步锁和鲜为人知的同步域同步对对象的访问。最后列举了在.NET中不同的多线程服务,例如线程池和计时器。
第9章,序列化和持久化
本章展示了如何持久化和序列化对象状态。当在远程调用和须将应用程序状态保存到文件时,序列化是非常有用的。本章还展示了自动化和自定义序列化的使用,并且展示了如何将一个类层次结构和序列化相结合。同时你也将能够看到如何通过提供使用泛型(Generic)来改进基本的序列化。
第10章,远程处理
本章揭秘.NET对远程调用的支持。首先解释了应用程序域和可用的远程对象类型及其激活模式。在讨论了远程处理构架之后,从编程和管理的角度展示了如何构建一个基于组件的分布式应用程序。本章最后解释了如何通过使用契约和赞助(sponsorship)来管理远程对象的生命周期。即使你不打算使用远程处理,本章也提供了许多.NET内部工作细节和对象激活机制,也就是可伸缩性策略。
第11章,上下文和拦截
本章描述了.NET非常强大有用(不过没有正式文档化)的一面:它能够通过上下文和调用侦听来提供定义自定义服务的途径。解释了上下文和如何利用它们来实现组件服务也就是侦听架构,同时也解释了如何扩展它。最后,简单描述了两种现实生活中面向生产效率的自定义服务。
第12章,安全
本章集中关注.NET代码访问安全这个热门话题。与Windows安全不同,.NET安全是基于组件的,而非基于用户的。如此一来,它为组件开发人员开启了新的可能性。本章展示了如何通过.NET配置工具来管理安全,及其如何通过编程提供附加的安全。与此同时,也涵盖了如何利用.NET基于角色的安全,以及如何安装一个自定义授权机制。
附录A,基于接口的Web服务
本附录展示了在服务器端和客户端使用Web服务时,如何坚持面向组件编程的核心原则——接口和实现分离。
附录B,Windows Forms和ASP.NET安全性的统一
本附录展示了一组互操作的帮助类和控件,它们能够使Windows Forms应用程序像ASP.NET应用程序一样轻松地使用ASP.NET 2.0凭证管理基础架构。它提供了ASP.NET在生产效率上的优势,我们可以不关心用户界面到底如何,因为它们可以采用统一的凭证存储。
附录C,反射和属性
本附录解释了.NET反射基本原理及如何开发和反射自定义属性。如果你不是特别熟悉反射,那么我推荐在阅读其他章节之前首先阅读本附录。
附录D,泛型
本附录简单介绍了泛型,它们是.NET 2.0最强大、最有用的功能之一。几乎本书在每一章中都使用了泛型。如果你不熟悉泛型,我推荐在阅读其他章节以前首先阅读本附录。其中涵盖了许多关于泛型的高级内容。
附录E,C#代码规范
本附录给出了一个包含所有最佳实践的详细列表,而这些内容在正文中并没有提到。规范是关于“什么”和“怎样”,而非“为什么”;其背后的基本原理可在本书的其他章节中找到痕迹。该规
无封面