net面向組件編程技術(shù)_第1頁(yè)
net面向組件編程技術(shù)_第2頁(yè)
net面向組件編程技術(shù)_第3頁(yè)
net面向組件編程技術(shù)_第4頁(yè)
net面向組件編程技術(shù)_第5頁(yè)
已閱讀5頁(yè),還剩94頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

、,一—1—..

刖舌...XI

第1章:面向組件編程簡(jiǎn)介....1

基本術(shù)語(yǔ)...2

面向組件和面向?qū)ο缶幊痰谋容^..3

面向組件編程的原則..6

.NET對(duì)于組件原則的遵循...11

.NET組件開(kāi)發(fā)...13

第2章:.NET面向組件的編程要素....15

語(yǔ)言獨(dú)立性:公共語(yǔ)言運(yùn)行時(shí)...15

打包和部署:程序集21

二進(jìn)制兼容性.??42

第3章:基于接口編程46

接口和實(shí)現(xiàn)分離46

使用接口52

接口和泛型.64

設(shè)計(jì)和分解接口...73

VisualStudio2005中的接口...77

第4章:生命周期管理82

托管堆...82

傳統(tǒng)內(nèi)存釋放模式...83

.NET垃圾回收...84

對(duì)象終結(jié)...86

確定性終結(jié)90

第5章:版本控制....102

程序集版本號(hào)102

程序集部署模型105

程序集強(qiáng)名稱(chēng)...107

VisualStudio2005和版本劃分...117

自定義版本策略119

CLR版本劃分...125

第6章:事件....129

基于委托的事件...130

使用.NET事件...136

第7章:異步調(diào)用....155

異步機(jī)制的必備條件156

委托的老調(diào)重彈...157

異步調(diào)用編程模型159

異步錯(cuò)誤處理172

異步事件...173

異步調(diào)用缺陷...178

同步和異步處理...182

第8章:多線程和并發(fā)管理....184

線程和多線程...184

組件和線程...185

使用線程186

同步線程...201

自動(dòng)同步...202

手動(dòng)同步...212

WorkerThread包裝類(lèi)...243

同步委托249

使用.NET多線程服務(wù)...252

第9章:序列化和持久化280

自動(dòng)序列化...281

序列化格式器...285

序列化事件...291

序列化和流...301

自定義序列化...304

序列化和類(lèi)層次結(jié)構(gòu)311

第10章:遠(yuǎn)程處理319

應(yīng)用程序域...320

遠(yuǎn)程對(duì)象類(lèi)型330

引用封送激活模式334

.NETRemoting架構(gòu)...342

構(gòu)建分布式應(yīng)用程序348

租賃和贊助...382

.NET與位置透明...397

第11章:上下文與攔截399

.NET組件服務(wù)...399

.NET上下文...402

自定義組件服務(wù)...410

第12章:安全434

.NET安全架構(gòu)...435

配置權(quán)限449

編程式安全472

VisualStudio2005與安全...494

基于主體的安全...498

其他安全問(wèn)題...505

附錄A:基于接口的Web服務(wù)511

附錄B:統(tǒng)一WindowsForms和ASP.NET安全520

附錄C:反射和屬性544

附錄D:泛型557

附錄E:C#編碼標(biāo)準(zhǔn)572

索引589

我很榮幸能夠在職業(yè)生涯中經(jīng)歷了幾代Microsoft組件技術(shù)的變遷。20世紀(jì)90年代中期我開(kāi)發(fā)過(guò)DLL,提

供導(dǎo)出函數(shù)以供使用,并通過(guò)MFC擴(kuò)展DLL來(lái)公開(kāi)類(lèi)。我親身體驗(yàn)過(guò)管理之間存在互操作的一組應(yīng)用程

序(由156個(gè)DLL構(gòu)成,而且要作為一個(gè)單元來(lái)部署)是多么復(fù)雜,也經(jīng)歷過(guò)由于這些DLL使用序數(shù)而

帶來(lái)的版本控制和維護(hù)問(wèn)題。我?guī)椭O(shè)計(jì)了類(lèi)似COM的方案來(lái)解決那些問(wèn)題,并依然記得當(dāng)我第一次聽(tīng)

說(shuō)COM和我使用命令行工具生成第一個(gè)GUID的情形。

在ATL遠(yuǎn)未問(wèn)世之前我就學(xué)會(huì)了如何編寫(xiě)類(lèi)工廠和IDL接口程序,我還在RPC被DCOM替代之前,就使

用過(guò)RPC。我使用COM設(shè)計(jì)過(guò)基于組件的應(yīng)用程序,并且體會(huì)過(guò)與不熟悉必要的COM知識(shí)的開(kāi)發(fā)人員

分享設(shè)計(jì)思路有多難。我使用過(guò)MTS編寫(xiě)程序,并且在此過(guò)程中學(xué)會(huì)了一些權(quán)宜之計(jì)。當(dāng)用COM+來(lái)架

構(gòu)大規(guī)模企業(yè)框架時(shí),我驚嘆COM+所展現(xiàn)出的優(yōu)雅和實(shí)用。

隨著面向組件技術(shù)的不斷發(fā)展與演進(jìn),我對(duì)面向組件技術(shù)的理解與認(rèn)識(shí)也不斷深入。我經(jīng)常自問(wèn):使用組

件的基本原則是什么?它們與傳統(tǒng)面向?qū)ο缶幊痰膮^(qū)別何在?我努力從以往所犯的錯(cuò)誤中學(xué)習(xí)新的東西,

提取平時(shí)遇到的和自己領(lǐng)悟到的各種好的想法和技術(shù),并推而廣之。我相信自己已經(jīng)界定出一些面向組件

設(shè)計(jì)中的核心原則,這些原則超越了今天可用的所有技術(shù),并且從長(zhǎng)遠(yuǎn)來(lái)看,它們能夠構(gòu)造出更易于復(fù)用、

擴(kuò)展和維護(hù)的組件。

隨著.NET柩架的出現(xiàn),Windows開(kāi)發(fā)人員終了擁有了一種卓越的技術(shù),能夠簡(jiǎn)化基于組件的應(yīng)用程序的

開(kāi)發(fā)和部署工作。.NET是微軟公司嘔心瀝血之作,在我看來(lái)它很好地改善了以往的相關(guān)技術(shù)尤其是COM

的不足之處。它融合并加強(qiáng)了已經(jīng)被證明了的諸多技術(shù)和方法,同時(shí)保留了這些技術(shù)中的核心優(yōu)勢(shì)。

對(duì)我而言,根本上講.NET是種組件技術(shù),它為生成二進(jìn)制組件提供了簡(jiǎn)單便捷的方法,而且符合那些我

認(rèn)為非常合理的設(shè)計(jì)原則。.NET是全新設(shè)計(jì)的,旨在簡(jiǎn)化組件的開(kāi)發(fā)和部署,并支持各種編程語(yǔ)言間的互

操作。.NET的應(yīng)用范圍廣泛,其組件nJ?以用于創(chuàng)建多種多樣的基于組件的應(yīng)用程序,既包括獨(dú)立的桌面應(yīng)

用程序,也包括基于Web的應(yīng)用程序和服務(wù)。

當(dāng)然,.NET不僅僅是?種組件技術(shù),事實(shí)上它是一整套技術(shù)的總稱(chēng)。

提示:本書(shū)中,“.NET”這個(gè)術(shù)語(yǔ)既用來(lái)泛指.NET框架,也用于具體指

該框架所體現(xiàn)的組件技術(shù)。

.NET提供了許多專(zhuān)門(mén)的應(yīng)用程序框架,其中包括用于富Windows客戶端的WindowsForms,用于數(shù)據(jù)訪

問(wèn)的ADO.NET,用于Web應(yīng)用的ASP.NET,用于公開(kāi)和使用遠(yuǎn)程限務(wù)(這些服務(wù)使用SOAP和其他基

于XML的協(xié)議)的WebServices.VisualStudio2005支持使用C#、VisualBasic,托管C++(Managed

C++)和J#來(lái)開(kāi)發(fā).NET應(yīng)用程序,除此之外也可以使用其他語(yǔ)言。你能夠在Windows或SQLServer2005

中宿主.NET。微軟服務(wù)器產(chǎn)品會(huì)在未來(lái)幾年里越來(lái)越多地支持與.NET連接(.NETConnected)的應(yīng)用程

序,Windows的未來(lái)版本也將主要建立在.NET的基礎(chǔ)上。

本書(shū)范圍

ScopeofThisBook

本書(shū)涵蓋了設(shè)計(jì)、開(kāi)發(fā)基于組件的.NET應(yīng)用程序所需要的技術(shù)及相關(guān)主題。不過(guò)為了充分理解.NET,本

書(shū)還介紹了其起源以及它對(duì)以往技術(shù)缺陷作了哪些改進(jìn)。除了向讀者展示如何執(zhí)行某些任務(wù)外,本書(shū)還會(huì)

經(jīng)常通過(guò)面向組件程序設(shè)計(jì)的原則闡釋這些任務(wù)背后的基本原理。熟識(shí)了這些理念后,你就能在可維護(hù)性、

可擴(kuò)展性、可復(fù)用性以及性能方面最大限度地優(yōu)化你的應(yīng)用程序設(shè)計(jì)。即使沒(méi)有COM的相關(guān)知識(shí)也能閱

讀本書(shū),但我在解釋.NET的運(yùn)作原理時(shí)還是會(huì)偶爾使用COM作為參考。

通過(guò)本書(shū)你不僅可以學(xué)習(xí).NET組件編程及相關(guān)系統(tǒng)的問(wèn)題,還可以了解相關(guān)的設(shè)計(jì)選擇、技巧、最佳操作

實(shí)踐以及?些陷阱。本書(shū)回避了許多.NET實(shí)現(xiàn)細(xì)節(jié),而把主要篇幅集中在將.NET作為?種組件技術(shù)的可

能性和實(shí)際操作上:例如怎樣使用該技術(shù),怎樣在可供選擇的設(shè)計(jì)和編程模型中選出最佳方案。此外,本

書(shū)還包含了許多有用的實(shí)用程序、工具和自.NET問(wèn)世5年以來(lái)我所開(kāi)發(fā)出來(lái)的幫助類(lèi),所有這些都是為

了提高生產(chǎn)效率和所開(kāi)

發(fā)的.NET組件的質(zhì)量。閱讀完本書(shū)后,你就能夠充分利用.NET開(kāi)發(fā)基礎(chǔ)架構(gòu)和應(yīng)用框架,立即動(dòng)手開(kāi)發(fā)

自己的.NET組件。本書(shū)包含了設(shè)計(jì)、開(kāi)發(fā)基于組件的.NET應(yīng)用程序所需要的技術(shù)及相關(guān)主題。本書(shū)對(duì).NET

1.1和.NET2.0作了詳盡的解釋。

卜面簡(jiǎn)要介紹一下本書(shū)的主要章節(jié)和附錄。

第1章,面向組件編程簡(jiǎn)介

本章提供本書(shū)中使用的基本術(shù)語(yǔ)。對(duì)比了面向?qū)ο缶幊毯兔嫦蚪M件編程的差異,然后列舉面向組件編程的

一些原則。這些原則解釋了如何使用.NET背后的真正原理,理解它們是正確構(gòu)建基于組件的應(yīng)用程序的一

個(gè)先決條件。

第2章,.NET面向組件編程基礎(chǔ)

本章描述了.NET的基礎(chǔ),如公共語(yǔ)言運(yùn)行時(shí)(CLR)、.NET編程語(yǔ)言、代碼生成過(guò)程、程序集及其構(gòu)建

和組合。結(jié)尾將解釋.NET如何維護(hù)客戶方和組件之間的二進(jìn)制兼容性,并討論了這種編程模型方案的本質(zhì)。

如果你已經(jīng)熟悉了.NET框架的基礎(chǔ)知識(shí)(1.1版和2.0版),可只隨意地瀏覽一下本章,甚至完全跳過(guò)

它。

第3章,基于接口編程

本章闡述基于接口的工作方式。解釋如何將接口與其.NET實(shí)現(xiàn)分離開(kāi)來(lái),如何實(shí)現(xiàn)接口,以及如何設(shè)計(jì)和

構(gòu)造接口來(lái)滿足可重用性、可維護(hù)性和可獷展性。

第4章,生存周期管理

本章討論了.NET管理對(duì)象的方法,以及這種方法對(duì)整個(gè).NET編程模型帶來(lái)的正面和負(fù)面影響。解釋底

層.NET垃圾回收機(jī)制,同時(shí)展示了組件開(kāi)發(fā)人員如何處理被組件實(shí)例持有的資源。

第5章,版本控制

首先本章描述了.NET版本控制策略及其部署和共享組件的方式。在討論了默認(rèn)策略之后,還展示了如何提

供自定義的版本綁定和解析(resolution)策略來(lái)滿足應(yīng)用程序特定甚至機(jī)器的特定需要。本章還討論了如

何開(kāi)發(fā)那些支持.NET自身多個(gè)版本的應(yīng)用程序。

第6章,事件

本章展示了如何在基于組件的程序中發(fā)布和訂閱事件。在討論了.NET提供的內(nèi)置支持之后,展示了許多最

佳實(shí)踐和實(shí)用工具,它們都是為了充分利用基本的事件支持,并加以改進(jìn)的。

第7章,異步調(diào)用

本章描述了.NET對(duì)組件異步調(diào)用的內(nèi)置支持、可用的編程模型及其優(yōu)劣、如何使用它們以及其中的陷阱。

第8章,多線程和并發(fā)管理

本章深入解釋了如何創(chuàng)建多線程組件?,F(xiàn)代應(yīng)用程序幾乎沒(méi)有不使用多線程的,但隨之而來(lái)的是代價(jià)沉重

——須同步對(duì)組件的訪問(wèn)。本章展示了如何創(chuàng)建和管理線程,如何使用手動(dòng)同步鎖和鮮為人知的同步域同

步對(duì)對(duì)象的訪問(wèn)。最后列舉了在.NET中不同的多線程服務(wù),例如線程池和計(jì)時(shí)器。

第9章,序列化和持久化

本章展示了如何持久化和序列化對(duì)象狀態(tài)。當(dāng)在遠(yuǎn)程調(diào)用和須將應(yīng)用程序狀態(tài)保存到文件時(shí),序列化是非

常有用的。本章還展示了自動(dòng)化和自定義序列化的使用,并且展示了如何將一個(gè)類(lèi)層次結(jié)構(gòu)和序列化相結(jié)

合。同時(shí)你也將能夠看到如何通過(guò)提供使用泛型(Generic)來(lái)改進(jìn)基本的序列化。

第10章,遠(yuǎn)程處理

本章揭秘.NET對(duì)遠(yuǎn)程調(diào)用的支持。首先解釋了應(yīng)用程序域和可用的遠(yuǎn)程對(duì)象類(lèi)型及其激活模式。在討論了

遠(yuǎn)程處理構(gòu)架之后,從編程和管理的角度展示了如何構(gòu)建一個(gè)基于組件的分布式應(yīng)用程序。本章最后解釋

了如何通過(guò)使用契約和贊助(sponsorship)來(lái)管理遠(yuǎn)程對(duì)象的生命周期。即使你不打算使用遠(yuǎn)程處理,本

章也提供了許多.NET內(nèi)部工作細(xì)節(jié)和對(duì)象激活機(jī)制,也就是可伸縮性策略。

第11章,上下文和攔截

本章描述了.NET非常強(qiáng)大有用(不過(guò)沒(méi)有正式文檔化)的一面:它能夠通過(guò)上下文和調(diào)用偵聽(tīng)來(lái)提供定義

自定義服務(wù)的途徑。解釋了上下文和如何利用它們來(lái)實(shí)現(xiàn)組件服務(wù)也就是偵聽(tīng)架構(gòu),同時(shí)也解釋了如何擴(kuò)

展它。最后,簡(jiǎn)單描述了兩種現(xiàn)實(shí)生活中面向生產(chǎn)效率的自定義服務(wù)。

第12章,安全

本章集中關(guān)注.NET代碼訪問(wèn)安全這個(gè)熱門(mén)話題。與Windows安全不同,.NET安全是基于組件的,而非基

于用戶的。如此?來(lái),它為組件開(kāi)發(fā)人員開(kāi)后了新的可能性。本章展示了如何通過(guò).NET配置工具來(lái)管理安

全,及其如何通過(guò)編程提供附加的安全。與此同時(shí),也涵蓋了如何利用.NET基于角色的安全,以及如何安

裝一個(gè)自定義授權(quán)機(jī)制。

附錄A,基于接口的Web服務(wù)

本附錄展示了在服務(wù)器端和客戶端使用Web服務(wù)時(shí),如何堅(jiān)持面向組件編程的核心原則一接口和實(shí)現(xiàn)分

離。

附錄B,WindowsForms和ASP.NET安全性的統(tǒng)一

本附錄展示了?組互操作的幫助類(lèi)和控件,它們能夠使WindowsForms應(yīng)用程序像ASP.NET應(yīng)用程序?

樣輕松地使用ASP.NET2.0憑證管理基礎(chǔ)架構(gòu)。它提供了ASP.NET在生產(chǎn)效率上的優(yōu)勢(shì),我們可以不關(guān)

心用戶界面到底如何,因?yàn)樗鼈兛梢圆捎媒y(tǒng)一的憑證存儲(chǔ)。

附錄C,反射和屬性

本附錄解釋了.NET反射基本原理及如何開(kāi)發(fā)和反射自定義屬性。如果你不是特別熟悉反射,那么我推薦在

閱讀其他章節(jié)之前首先閱讀本附錄。

附錄D,泛型

本附錄簡(jiǎn)單介紹了泛型,它們是.NET2.0最強(qiáng)大、最有用的功能之一。幾乎本書(shū)在每一章中都使用了泛型。

如果你不熟悉泛型,我推薦在閱讀其他章節(jié)以前首先閱讀本附錄。其中涵蓋了許多關(guān)于泛型的高級(jí)內(nèi)容。

附錄E,C#代碼規(guī)范

本附錄給出了一個(gè)包含所有最佳實(shí)踐的詳細(xì)列表,而這些內(nèi)容在正文中并沒(méi)有提到。規(guī)范是關(guān)于“什么”和“怎

樣”,而非“為什么”;其背后的基本原理可在本書(shū)的其他章節(jié)中找到痕跡。該規(guī)范基于【Design代碼規(guī)范,

并已經(jīng)成為.NET開(kāi)發(fā)中事實(shí)上的業(yè)界代碼規(guī)范。IDesign標(biāo)準(zhǔn)在本書(shū)第1版中有介紹。

有關(guān)讀者的幾點(diǎn)假設(shè)

SomeAssumptionsAbouttheReader

我假設(shè)您作為讀者,是有經(jīng)驗(yàn)的開(kāi)發(fā)人員,并且對(duì)一些面向?qū)ο蟾拍钊绶庋b和繼承能夠比較自然地接受。

我也假設(shè)您對(duì)1.1和2.0兩個(gè)版本中都有的C#和VisualBasic有最基本的了解。雖然木書(shū)大部分使用C#,

但同樣適用于VisualBasic2005開(kāi)發(fā)人員。在不便將C#轉(zhuǎn)換為VisualBasic2005或者兩種語(yǔ)言差別很大

的情況下,我要么會(huì)提供相對(duì)應(yīng)的VisualBasic2005代碼范例,要么會(huì)給出明確的注釋。

如果你有使用COM的經(jīng)驗(yàn),本書(shū)會(huì)讓你從對(duì)COM的理解過(guò)渡到對(duì).NET的理解匕如果你之前從未用過(guò)

COM,你將發(fā)現(xiàn)面向組件編程涵蓋到的原則極其有用。

本書(shū)約定

ConventionsUsedinThisBook

以下是本書(shū)約定使用的印刷體表達(dá)方式。

I的體字或黑體用來(lái)表示專(zhuān)業(yè)術(shù)語(yǔ)、URLs、文件名、目錄名和路徑名。

I等寬體用來(lái)表示編碼樣本、語(yǔ)句、命名空間、類(lèi)、程序集、接口指示詞、操作符、屬性和保留字。

I等寬粗體強(qiáng)調(diào)編碼示例。

提示:這個(gè)圖標(biāo)表示附近內(nèi)容的一個(gè)重要注解。

警告:這個(gè)圖標(biāo)表示它是附近文本中的一條警告.

當(dāng)我想在代碼示例中作一個(gè)注釋時(shí),會(huì)使用Debug類(lèi)中的靜態(tài)Assert方法:

intnumber=1+2;

Debug.Assert(number==3);

Assert方法接收一個(gè)布爾型語(yǔ)句,并在該語(yǔ)句為假時(shí)拋出—個(gè)異常。

本書(shū)采用附錄E中介紹的命名指南和編碼方式,如果與標(biāo)準(zhǔn)不相符時(shí),可能是因?yàn)榭臻g不夠,需要換行造

成的。關(guān)于命名考慮,我對(duì)公共成員方法和屬性使用“Pascal命名”;也就是說(shuō)名字中每個(gè)詞的首寫(xiě)字母都

要大寫(xiě)。對(duì)于局部變量和方法參數(shù),我采用“Camel命名”,名字中第一個(gè)單詞的首寫(xiě)字母不大寫(xiě)。我在私

有成員變量前加上一個(gè)m_:

publicclassSomeClass

{

privateintm_Number;

publicintNumber

{get;set};

)

我在大括號(hào)之間使用省略號(hào)來(lái)表示中間必須使用但卻沒(méi)有明確指出的代碼。

publicclassSomeClass

{...)

為了做到既清晰明了又節(jié)省空間,所舉的代碼示例并不總是包含所有的using語(yǔ)句,雖然在標(biāo)示特定的命

名空間時(shí)要使用到它;這樣的示例中只會(huì)包含前面文本中提出的新的命名空間。

建議和問(wèn)題

CommentsandQuestions

我們已盡力核驗(yàn)本書(shū)所提供的信息,盡管如此,仍不能保證木書(shū)完全沒(méi)有瑕疵,而網(wǎng)絡(luò)世界的變化之快,

也使得本書(shū)永不過(guò)時(shí)的保證成為不可能。如果讀者發(fā)現(xiàn)本書(shū)內(nèi)容上的錯(cuò)誤,不管是贅字、錯(cuò)字、語(yǔ)意不清,

甚至是技術(shù)錯(cuò)誤,我們都竭誠(chéng)虛心接受讀者指教。如果您有任何問(wèn)題,請(qǐng)按照以下的聯(lián)系方式與我們聯(lián)系。

與本書(shū)有關(guān)的在線信息(包括勘誤、范例程序、相關(guān)鏈接)如下所示。

http://www.orei11y.com/catalog/ajaxdp/(原書(shū))

http://www.orei11y.com.cn/book.php?bn=978-7-121-03983-6(中文版)

奧萊理軟件(北京)有限公司

北京市海淀區(qū)知春路49號(hào)希格瑪公寓B座809室

郵政編碼:100080

網(wǎng)頁(yè):

E-mail:info@

博文視點(diǎn)資訊有限公司(武漢分部)

湖北省武漢市洪山區(qū)郵科院路特1號(hào)湖北信息產(chǎn)業(yè)科技大廈1406室

郵政編碼:430074

電話:(027)87690813傳真:(027)87690813轉(zhuǎn)817

讀者服務(wù)網(wǎng)頁(yè):

E-mail:

sheguang@(讀者信箱)

broadvieweditor@(投稿信箱)

Safari@Enabled

看到Safari?圖標(biāo)了嗎?您收藏的技術(shù)圖書(shū)封面上的激活圖標(biāo)表示該書(shū)(英文版)可以通

過(guò)O'ReillyNetworkSafariBookshelf購(gòu)買(mǎi)。

Safari提供了一種比電子書(shū)更好的解決方案。它是一個(gè)虛擬圖書(shū)館,可以讓你更容易地搜索數(shù)以千記的頂

級(jí)技術(shù)圖書(shū)、復(fù)制和粘貼代碼示例,下載章節(jié),以及當(dāng)你需要更最精確的信息時(shí)快速得到答案??梢栽?/p>

http://safari.oreilly.com免費(fèi)使用。

致謝

Acknowledgments

2000年夏,.NET剛問(wèn)世不久,來(lái)自O(shè)'Reilly的JohnOsborn和我就開(kāi)始討論寫(xiě)一部新書(shū),一本探索將.NET

作為一個(gè)基于組件的應(yīng)用程序開(kāi)發(fā)平臺(tái)來(lái)使用的書(shū)。本書(shū)的第1版是John幫助和支持的結(jié)果。在過(guò)去的3

年里,作為.NET2.0戰(zhàn)略設(shè)計(jì)審查過(guò)程的一份子,我和微軟走得很近,這為我了解NET2.0提供了經(jīng)驗(yàn)和

見(jiàn)識(shí)。我非常感謝卜列這些產(chǎn)品經(jīng)理和項(xiàng)目經(jīng)理:來(lái)自C#團(tuán)隊(duì)的DanFernandez和EricGunnerson,來(lái)

自VisualBasic團(tuán)隊(duì)的AmandaSilver,來(lái)自CLR團(tuán)隊(duì)的JohnRivard,來(lái)自Indigo團(tuán)隊(duì)的MattTavis和

YasserShohoudo我尤其要感謝C#的程序經(jīng)理AnsonHorton,感謝他非凡的洞察力、驚人的專(zhuān)業(yè)知識(shí),

以及給我的指導(dǎo)。

本書(shū)的第1版得到了下列朋友和同事的幫助,他們是:ChrisW.Rea、BillyHollis、JimmyNilsson,Nicholas

PaldinoJngoRammer和PradeepTapadiya。而以下這些朋友為第2版提供了很多非常寶貴的反饋意見(jiàn),

他們是:SamGentile>RichardGrimesNormanHeadlam,BenjaminMitchell和BrianNoyes。所有這

些人熱情慷慨地付出了他們的時(shí)間。我尤其要感謝NicholasPaldino,是他幫助我完成了第二版的寫(xiě)作。

Nick的框架知識(shí)無(wú)與倫比,他對(duì)細(xì)節(jié)的悉心關(guān)注確保了本書(shū)的高質(zhì)量和連貫性。

最后,我還要感謝我的家人。我要謝謝我的妻子Dana,她非常清楚寫(xiě)書(shū)會(huì)占用我與家人相處的時(shí)間,可還

是鼓勵(lì)我去寫(xiě)。我要把這本書(shū)獻(xiàn)給我5歲的女兒Abigail。她已經(jīng)有了自己的電腦,并正在電腦上熱情十足

地玩Princesses游戲。我期待有一天能夠和她談?wù)撚媒M件構(gòu)建系統(tǒng)和服務(wù)的原則。我想一切應(yīng)該從接口開(kāi)

始。

雖然現(xiàn)在畢業(yè)的軟件設(shè)計(jì)方面的人才在逐年增多,但是獨(dú)立軟件開(kāi)發(fā)商和系統(tǒng)集成商的技術(shù)主管們?nèi)栽诒?/p>

怨找不到合適的軟件工程師。原因在于我們的大學(xué)計(jì)算機(jī)教育基本上是與市場(chǎng)需求脫節(jié)的,這早已是個(gè)共

識(shí)。有一個(gè)數(shù)據(jù)可以說(shuō)明這點(diǎn),2006年的一個(gè)統(tǒng)計(jì)表明,在我們的大學(xué)計(jì)算機(jī)課程里,90%的課程使用的

是Windows操作系統(tǒng),50%的課程作業(yè)是用C/C++完成的,而從全球來(lái)看,這兩個(gè)數(shù)字分別是74%和26%.

我們的大學(xué)教育重理論而輕實(shí)踐,結(jié)果學(xué)生們?cè)谲浖O(shè)計(jì)和軟件工程方面學(xué)到的僅僅是一堆毫無(wú)感覺(jué)的原

則性的文字。隨便找一位工作了?兩年的軟件工程師進(jìn)行調(diào)杳,如果你問(wèn)他什么是面向?qū)ο缶幊?/p>

(object-orientedprogramming),10個(gè)中有8個(gè)給不出比較完整的答案。如果你再問(wèn)他什么是面向組件

編程(component-orientedprogramming),10個(gè)中有9個(gè)答不上來(lái);如果你進(jìn)一步問(wèn)他什么是面向方面

編程(aspect-orientedprogramming),或H?么是面向服務(wù)編程(service-orientedprogramming),我想

10個(gè)會(huì)有10個(gè)答不上來(lái)。

出現(xiàn)這種情況的一個(gè)重要原因就是,似乎現(xiàn)在大家都認(rèn)為軟件開(kāi)發(fā)是一件很容易的事情。有那么多工具,

那么多現(xiàn)成的組件庫(kù),網(wǎng)I:還有大把大把免費(fèi)的、開(kāi)源的系統(tǒng)軟件和應(yīng)用軟件,你拿來(lái)裝上,再在開(kāi)發(fā)工

具里用鼠標(biāo)拖拖拽拽,一個(gè)應(yīng)用不就開(kāi)發(fā)出來(lái)了嗎?哦,你以前沒(méi)有用過(guò)這種數(shù)據(jù)庫(kù)軟件?沒(méi)問(wèn)題,書(shū)店

里到處都是《21天精通XXX編程》。買(mǎi)一本來(lái)看幾天,咱中國(guó)人比美國(guó)人聰.明,人家耍21天才精通,咱

們7天就精通!

當(dāng)然,真正從事過(guò)多年軟件開(kāi)發(fā)的軟件工程師不會(huì)這么天真。軟件的復(fù)雜度是那些非軟件行業(yè)的人所無(wú)法

理解的。看看從事軟件行業(yè)的是些什么樣的人你就清楚了。你把他們的平均智商跟其他行業(yè)人的平均智商

比一比,再把他們每天的平均工作時(shí)間跟其他行業(yè)人的平均工作時(shí)間比一比,你就知道開(kāi)發(fā)一種軟件是件

多么不容易的事情。

我向軟件工程師們致敬。他們是?群孜孜不倦、追求知識(shí)、追求卓越的人。由于大學(xué)教育的失敗以及軟件

產(chǎn)業(yè)本身快速創(chuàng)新的緣故,他們必須在工作中自學(xué),不斷地更新、提高自己的能力。好的書(shū)籍對(duì)他們來(lái)說(shuō)

就非常關(guān)鍵了。?本好的技術(shù)書(shū)不是某個(gè)軟件的幫助文檔。幫助文檔會(huì)羅列出所有的接口、函數(shù)、對(duì)象以

及其他一切細(xì)節(jié),讓你一下子找不著北,“只見(jiàn)樹(shù)木不見(jiàn)森林”,看了一大堆東西仍然一頭霧水。好書(shū)會(huì)給

你一個(gè)大局觀,有哪兒大部分,各部分的關(guān)系是什么,每個(gè)部分的主要元素是什么。你抓住了主要矛盾,

弄懂了核心概念和關(guān)鍵點(diǎn),對(duì)技術(shù)的掌握就會(huì)有一種了然于心的感覺(jué)。

好的技術(shù)書(shū)卻也不是一種速成訣竅,速成訣竅只告訴你完成某件事情須做的一、二、三、四步,而你并不

明白為什么要這么做。況且在軟件工程中,大多數(shù)功能都可以用多種方案實(shí)現(xiàn)。沒(méi)有絕對(duì)最好的方案,只

有最合適的方案一基于系統(tǒng)當(dāng)前的需求,找到一種最佳的平衡,可能是性能、可維護(hù)性、可擴(kuò)展性、伸

縮性、跨平臺(tái)、安全性、界面友好性等各方面的權(quán)衡與折中。好書(shū)可以告訴你各種可能的選擇和它們的優(yōu)

缺點(diǎn)以及不同的適用場(chǎng)景。

您手中的《.NET組件程序設(shè)計(jì)》就是這樣一本優(yōu)秀的技術(shù)書(shū)。很高興看到它的中文版終于出版了,這對(duì)那

些希望真正了解和掌握.NETFramework編程的軟件工程師們是一個(gè)福音。但這不是一本.NET入門(mén),您需

要有一些.NETFramework編程經(jīng)驗(yàn)。本書(shū)最合適那些希望從一名普通的.NET編程人員走向.NET軟件架

構(gòu)師的讀者閱讀。

本書(shū)以.NETFramework2.0為主講解.NET卜的組件程序設(shè)計(jì)技術(shù),覆蓋了接口設(shè)計(jì)、遠(yuǎn)程機(jī)制、異步調(diào)

用、攔截機(jī)制、事件機(jī)制、多線程、持久化、生命周期管理、版本管理、安全機(jī)制等主題。雖然反射機(jī)制

和屬性編程被放在附錄C中,但是我認(rèn)為它們作為.NETFramework核心的組件技術(shù),應(yīng)該受到讀者的重

視。作者在此著墨不多,希望深入了解的讀者可以參照其他的技術(shù)資源進(jìn)行學(xué)習(xí)。同樣的,附錄D中的泛

型技術(shù)對(duì)組件編程中非常重要的復(fù)用原則的運(yùn)用是十分關(guān)鍵的,希望讀者能夠很好地理解。

從組件編程技術(shù)的角度來(lái)認(rèn)識(shí)和了解.NETFramework,您會(huì)發(fā)現(xiàn)它是一個(gè)非常先進(jìn)的技術(shù)平臺(tái)。不論您是

想通過(guò)讀這本書(shū)來(lái)更好地設(shè)計(jì).NET程序,還是想了解如何設(shè)計(jì)一個(gè)好的編程框架,或者您是一位軟件架構(gòu)

師,希望評(píng)估.NETFramework作為組件技術(shù)平臺(tái)的能力,這本書(shū)都會(huì)給您一個(gè)滿意的答案。

曹?chē)?yán)明

2007年1月7年前,在我申請(qǐng)?zhí)と胲浖袠I(yè)的第一個(gè)崗位時(shí),面試官問(wèn)了我一個(gè)問(wèn)題:懂COM和COM+

嗎?那時(shí)候我僅僅知道有COM+這個(gè)東西罷了,但卻從此開(kāi)始了面向組件的開(kāi)發(fā)之旅。那時(shí)還是用C++,

搭配初學(xué)者難以掌握的ATL框架來(lái)開(kāi)發(fā)COM組件。

在組件黑盒復(fù)用和單職責(zé)原則的指引下,似乎大多數(shù)事情比較清晰,開(kāi)發(fā)的時(shí)候可以齊頭并進(jìn),新員工

加入時(shí),也不至于手忙腳亂。

其實(shí),Perl/Python的“工具箱+黏合劑”工作模式,大抵也是這種思路。

在以后的歲月中,我們總是喜歡像搭積木一樣地搭建平臺(tái),并引入各種語(yǔ)言構(gòu)建的組件或進(jìn)程,但盡量減

少耦合。

后來(lái),.NET提供了個(gè)完整的、卓越的組件開(kāi)發(fā)基礎(chǔ)架構(gòu),讓原本就很清晰的開(kāi)發(fā)思路變得更容易實(shí)現(xiàn)。

看過(guò)本書(shū)的前兒章之后,就覺(jué)得它真是字字珠磯。當(dāng)然,譯者深厚的技術(shù)功底和文字功底也保證了它的品

質(zhì)。作者也繼承了微軟面向組件開(kāi)發(fā)的清晰易用的傳統(tǒng),把故事講得深入淺出。

對(duì)F面向組件,本書(shū)作者點(diǎn)評(píng)道:“面向組件和面向?qū)ο髴?yīng)用程序的另外一個(gè)重要差別是在繼承和重用模型

上的著重點(diǎn)不同……然而,你應(yīng)該保持你的類(lèi)層次關(guān)系盡量簡(jiǎn)單明了,而將精力集中在構(gòu)建接口上?!边@點(diǎn)

深合我意。

對(duì)了設(shè)計(jì)豪華、類(lèi)層次復(fù)雜的平臺(tái)架構(gòu),我看完之后,往往打心眼里佩服架構(gòu)師,超贊!但是,我們先來(lái)

講一個(gè)故事,一位優(yōu)秀的架構(gòu)師想用w3c的libwww庫(kù)做爬取頁(yè)面和分析,花了一整天的時(shí)間研究之后,

他放棄了libwww?最后他感慨道:

“這么復(fù)雜的庫(kù),就算它再好我也實(shí)在無(wú)法忍受下去了。再說(shuō),我需要的功能其實(shí)也真沒(méi)libwww那么復(fù)雜。

寫(xiě)程序其實(shí)很容易迷失,你會(huì)看到一個(gè)似乎很完美,什么都能做的東西,并一卜.子就喜歡上它,但是最后

大都無(wú)福消受。往往是那些不那么成熟,多少有點(diǎn)小毛病的庫(kù),組合在一起才是真正的解決方案?!?/p>

那么,一個(gè)龐大復(fù)雜的體系和一個(gè)像.NET自身這樣,以一種邏輯的和一致的方式被分解成不同的組件從而

構(gòu)成一個(gè)統(tǒng)一的編程模式,您選擇哪?個(gè)呢?如果選擇后者,那么請(qǐng)開(kāi)始閱讀這本書(shū)吧,并把它推薦給您

的同事們,越早越好,您會(huì)發(fā)現(xiàn)很多復(fù)雜的事情其實(shí)非常簡(jiǎn)單。

鄭均

2007年3月

遲到的經(jīng)典

初識(shí)JuvalLdwy,是在2004年,我正在《程序員》雜志做技術(shù)編輯。因?yàn)楫?dāng)時(shí)博文視點(diǎn)打算從O'Reilly

引進(jìn)?批經(jīng)典書(shū)籍,Program/ng.NETComponents正在其中。閱讀完此書(shū)的第?版后,從來(lái)沒(méi)有做過(guò)翻

譯工作的我突然有一種不可抑止的沖動(dòng)一我真的非常想翻譯這本書(shū),這種沖動(dòng)讓我突覺(jué)驚訝。而我的良

師益友孟巖先生恰恰是那批書(shū)籍的技術(shù)審校,他也答應(yīng)我如果有可能,會(huì)將本書(shū)的翻譯工作交給我來(lái)做。

后來(lái)由于種種原因,本書(shū)的第一版沒(méi)有如愿引進(jìn),可我卻記住了JuvalL6wy。在我有限的閱讀中,這本書(shū)

是我見(jiàn)到的在.NET領(lǐng)域關(guān)于組件設(shè)計(jì)水平最高的書(shū)。同樣的,JuvalLowy也是我最推崇的技術(shù)專(zhuān)家之

就如大多數(shù)人對(duì)于MartinFowler在企業(yè)架構(gòu)和軟件工程領(lǐng)域的推崇那般,撇開(kāi)本書(shū)不談,作者的另外一本

COMand.NETComponentServices也是經(jīng)典之作。

之后,我離開(kāi)了雜志社,進(jìn)入?家互聯(lián)網(wǎng)公司工作,也才意識(shí)到這本書(shū)對(duì)我?guī)?lái)了怎樣的影響。在過(guò)去的

兩年時(shí)間內(nèi),不論是我主持開(kāi)發(fā)的項(xiàng)目,還是給別人提供技術(shù)咨詢(xún)的項(xiàng)目,JuvalL6wy對(duì)于.NET架構(gòu)深

刻而精辟的見(jiàn)解已經(jīng)成為了我工作中的“圣經(jīng)”。我知道,這樣的形容有點(diǎn)言過(guò)其實(shí),見(jiàn)解也有些偏頗,而

作為本書(shū)的譯者,希望我的這些言語(yǔ)不會(huì)影響你對(duì)于本書(shū)的判斷。

在過(guò)去的7年時(shí)間,從最早的.NET概念到.NET1.0、.NET1.1、.NET2.0,再到最近發(fā)布的.NET3.0,.NET

世界發(fā)生了太大的變化。有時(shí)候開(kāi)發(fā)人員會(huì)覺(jué)得很幸福,因?yàn)槲覀儼l(fā)現(xiàn)軟件開(kāi)發(fā)越來(lái)越簡(jiǎn)單。與此同時(shí),

又會(huì)覺(jué)得很痛苦,因?yàn)樽兓乃俣壬踔脸^(guò)了我們學(xué)習(xí)和理解的速度。這個(gè)世界沒(méi)有永恒的東西,唯有變

化,就如變化的世界,變化的軟件產(chǎn)業(yè),當(dāng)然也包括變化的.NET。

本書(shū)的第2版相對(duì)于第1版,也與時(shí)俱進(jìn),做了一些調(diào)整,加入了一些新的內(nèi)容。而國(guó)內(nèi)和國(guó)外的技術(shù)界

存在個(gè)時(shí)間差,大多數(shù)人的看法是兩年,而本書(shū)在美國(guó)是2005年出版的,中文版也只有在2007年跚跚

來(lái)遲了。我想2007年對(duì)于國(guó)內(nèi)技術(shù)界來(lái)說(shuō)是一個(gè)廣泛采納.NET2.0的一年,也正因?yàn)槿绱?,希望本?shū)能

夠幫助你解決?些困擾許久的問(wèn)題。

如果你是初級(jí).NET開(kāi)發(fā)人員,那么我建議你先掌握?些.NET的基礎(chǔ)知識(shí)之后再閱讀本書(shū)。

如果你是中級(jí).NET開(kāi)發(fā)人員,那么我強(qiáng)烈建議你用心閱讀本書(shū),你會(huì)進(jìn)入一個(gè)更加寬廣的世界。

如果你是高級(jí).NET開(kāi)發(fā)人員,那么我還是有足夠的理由建議你閱讀本書(shū),因?yàn)槠渲械脑S多.NET內(nèi)部原理

和設(shè)計(jì)技巧依舊是值得我們學(xué)習(xí)的。

如果你是Java架構(gòu)師,那么也不應(yīng)該錯(cuò)過(guò)本書(shū),因?yàn)镴uvalLowy關(guān)于組件和接口編程的思想同樣適用于

Java世界。

感謝出版社的周筠老師引進(jìn)了本書(shū)的第2版,更加感謝她給了我這個(gè)機(jī)會(huì)完成心中的夢(mèng)想,翻譯了此書(shū)。

感謝梁晶編輯和何艷編輯,也感謝本書(shū)的審校曹?chē)?yán)明先生。因?yàn)閭€(gè)人水平有限,翻譯難免出錯(cuò),也希望拿

到本書(shū)的讀者閱讀完此書(shū)能夠給我?個(gè)中肯的批評(píng)和建議。

最后,感謝我的母親,是她教會(huì)了我如何感恩。

劉如鴻

2007年3月

在過(guò)去的10年里,面向組件編程無(wú)疑成為主流的軟件開(kāi)發(fā)方法論。軟件產(chǎn)業(yè)漸漸遠(yuǎn)離了大型的、單一的

(monolithic)和難以維護(hù)的代碼。先行者們發(fā)現(xiàn):將一個(gè)系統(tǒng)分解到多個(gè)二進(jìn)制組件能夠獲得更多的可復(fù)

用性、可擴(kuò)展性和可維護(hù)性。而這些益處帶來(lái)的是:更加快速地推向市場(chǎng),更加強(qiáng)健和可伸縮的應(yīng)用程序,

更低的開(kāi)發(fā)和長(zhǎng)期維護(hù)成本。因此,面向組件編程無(wú)可爭(zhēng)議地成為軟件開(kāi)發(fā)的主流。

許多組件技術(shù)諸如DCOM、CORBA和JavaBeansM為程序員提供了實(shí)現(xiàn)面向組件應(yīng)用程序的手段。盡管

如此,每種技術(shù)都有自己的缺點(diǎn),例J如,DCOM太難以掌握,Java’”虛擬機(jī)(JVM)不支持和其他語(yǔ)言的

互操作。.NET是面向組件領(lǐng)域的后起之秀,正如你將在本章隨后和本書(shū)的其他部分看到的,在某種程度上

它針對(duì)面向組件編程的實(shí)現(xiàn)是最純粹并易于使用的。這些改進(jìn)不足為奇,因?yàn)?NET架構(gòu)師能夠從之前的其

他技術(shù)借鑒到其成功和失敗的經(jīng)驗(yàn)。

在這?章里,我會(huì)對(duì)面向組件編程的基本術(shù)語(yǔ)作?個(gè)定義,并且總結(jié)其核心原則及其相對(duì)應(yīng)的益處。這些

將在本書(shū)內(nèi)融會(huì)貫通,并且在稍后的章節(jié)中描述特定的.NET設(shè)計(jì)模式的時(shí)候,我將會(huì)引用到它。

面向組件編程是不同于面向?qū)ο缶幊痰模m然兩種技術(shù)存在一些共性。你可以說(shuō)面向組件編程來(lái)源于面向

對(duì)象方法論。因此,本章也會(huì)適當(dāng)?shù)乇容^面向?qū)ο缶幊毯兔嫦蚪M件編程,然而主要還是作為一種組件技術(shù)

來(lái)討論.NET。

基本術(shù)語(yǔ)

BasicTerminology

組件或許是現(xiàn)代軟件工程中最常用因此也最容易被混淆的技術(shù)術(shù)語(yǔ)之,.NET文檔在闡述這個(gè)概念時(shí)也難

免混淆不清。這種混淆源于如何明確區(qū)分邏輯實(shí)現(xiàn)類(lèi)、包含它的物理實(shí)體(通常是動(dòng)態(tài)鏈接庫(kù),簡(jiǎn)稱(chēng)DLL),

部署和使用它的相關(guān)邏輯(包括類(lèi)型信息、安全策略及其版本信息,在.NET中稱(chēng)為程序集)。在本書(shū)中,

一個(gè)組件是一個(gè).NET類(lèi),例如,下列代碼是一個(gè).NET組件:

publicclassMyClass

publicstringGetMessage()

returnnHelloH;

}

第2章討論DLL和程序集,并同時(shí)解釋物理和邏輯包背后的緣由,同時(shí)也討論為何每個(gè).NET類(lèi)不像傳統(tǒng)

的面向?qū)ο箢?lèi),而是一個(gè)二進(jìn)制組件。

一個(gè)組件負(fù)責(zé)公開(kāi)業(yè)務(wù)邏輯給客戶端,一個(gè)客戶端是使用該組件的任何實(shí)體,雖然大多情況下它就是一個(gè)

簡(jiǎn)單的類(lèi)。客戶端代碼可以被打包在和組件相同的物理單元,或者相同的邏輯單元但不同的物理單元,或

者完全不同的物理和邏輯單元中。客戶端代碼不應(yīng)該就這些細(xì)節(jié)作任何假設(shè)。一個(gè)對(duì)象是一個(gè)組件的實(shí)例,

這定義類(lèi)似于經(jīng)典的面向?qū)ο蠖x:?個(gè)對(duì)象是一個(gè)類(lèi)的實(shí)例。對(duì)象有時(shí)候也被作為服務(wù)器被提及,因?yàn)?/p>

客戶端和對(duì)象之間的關(guān)系通常被稱(chēng)作客戶端/服務(wù)器模型。在這個(gè)模型中,客戶端創(chuàng)建一個(gè)對(duì)象并且通過(guò)公

開(kāi)可用的入口訪問(wèn)其功能,通常是一個(gè)公有方法,不過(guò)接口更加合適一點(diǎn),如圖1-1所示。請(qǐng)注意在圖中

對(duì)象是一個(gè)組件的實(shí)例,“棒子(lollipop)”表示一個(gè)接口。

圖1-1:客戶端訪問(wèn)對(duì)象

我會(huì)在第3章詳細(xì)討論.NET的基于接口編程。然而,我要重點(diǎn)強(qiáng)調(diào)的是:雖然.NET不強(qiáng)制要求基于接口

編程,但如你立馬看到的,應(yīng)該盡可能去做到這點(diǎn)。為了證明這個(gè)道理,我會(huì)描繪:在我的設(shè)計(jì)圖中出現(xiàn)

的組件的入口點(diǎn)使用接口優(yōu)F公共方法。

提示:盡管圖1-1關(guān)于對(duì)象的描述看起來(lái)很像COM對(duì)象的標(biāo)志性圖標(biāo),這個(gè)圖標(biāo)不是

僅僅用于COM的,它用來(lái)表示接口的標(biāo)準(zhǔn)的UML符號(hào),而與實(shí)現(xiàn)它的組件技術(shù)和開(kāi)發(fā)

平臺(tái)無(wú)關(guān)。

基于接口編程提倡封裝,或者說(shuō)對(duì)客戶端屏蔽信息??蛻舳藢?duì)對(duì)象的實(shí)現(xiàn)方法細(xì)節(jié)了解越少越好。

大部分的實(shí)現(xiàn)細(xì)節(jié)被屏蔽,也就意味著你在不影響客戶端代碼的情況卜.改變一個(gè)方法或者屬性的可能性越

大。接口實(shí)現(xiàn)了最大程度的封裝,因?yàn)楹涂蛻舳私换サ氖且粋€(gè)抽象的服務(wù)定義,而不是一個(gè)實(shí)際對(duì)象。封

裝是面向?qū)ο蠛兔嫦蚪M件方法論成功應(yīng)用的關(guān)鍵所在。

從面向?qū)ο缶幊桃l(fā)的另外個(gè)重要概念是多態(tài)。如果兩個(gè)對(duì)象均繼承于個(gè)公共的基類(lèi)型(比如?個(gè)接

口)并且實(shí)現(xiàn)了該基類(lèi)型定義的全部操作,那么我們稱(chēng)這兩個(gè)對(duì)象互為多態(tài)。如果一個(gè)客戶端在編寫(xiě)時(shí)調(diào)

用的是基類(lèi)型的操作,那么這個(gè)客戶端代碼就能夠調(diào)用與基類(lèi)型互為多態(tài)的任何對(duì)象。當(dāng)多態(tài)被恰當(dāng)使用

的時(shí)候,從一個(gè)對(duì)象切換到另外一個(gè)對(duì)象不會(huì)對(duì)客戶端造成任何影響,從而簡(jiǎn)化了應(yīng)用程序的維護(hù)。

面向組件和面向?qū)ο缶幊痰谋容^

Component-OrientedVersusObject-OrientedProgramming

如果任何.NET類(lèi)都是組件、而類(lèi)和組件存在如此多的共性,那么傳統(tǒng)的面向?qū)ο缶幊毯兔嫦蚪M件編程的區(qū)

別到底何在?簡(jiǎn)而言之,面向?qū)ο缶幊讨塾诒唤M合到一個(gè)大的二進(jìn)制可執(zhí)行程序的類(lèi)之間的關(guān)系,而面

向組件編程著眼于獨(dú)立工作的可替換的代碼模塊,并且無(wú)須非常熟悉其內(nèi)部工作原理。

構(gòu)建塊和單一應(yīng)用程序的比較

BuildingBlocksVersusMonolithicApplications

兩種方法論的根本區(qū)別在于對(duì)目標(biāo)應(yīng)用程序的關(guān)注點(diǎn)。在傳統(tǒng)的面向?qū)ο笫澜缋铮幢隳憧梢詫I(yè)務(wù)邏輯

分解到多個(gè)細(xì)粒度的類(lèi)中,?旦這些類(lèi)被編譯,最終結(jié)果依舊是?個(gè)不可拆分的二進(jìn)制代碼。所有的類(lèi)共

享同一物理部署單元(通常是EXE)、進(jìn)程、地址空間和安全限制等。假如多個(gè)開(kāi)發(fā)人員在同一個(gè)代碼庫(kù)

上工作,他們就不得不共享源文件。

在這樣的程序中,對(duì)?個(gè)類(lèi)的微小改動(dòng)都可能導(dǎo)致整個(gè)應(yīng)用程序的重新鏈接和必不可少的重新測(cè)試,同時(shí)

也包括所有其他類(lèi)的重新部署。

另一方面,一個(gè)面向組件的應(yīng)用程序包含的是一組相關(guān)聯(lián)的二進(jìn)制應(yīng)用程序模塊的集合,就是說(shuō),一堆組

件以及將這些組件關(guān)聯(lián)起來(lái)的一堆調(diào)用(見(jiàn)圖1-2)。

圖1-2:面向組件的應(yīng)用程序

一個(gè)特定的二進(jìn)制組件自身不會(huì)做太多的事情。有些是通用組件,諸如文件訪問(wèn)或通信包裝組件,有些是

高度定制的和專(zhuān)門(mén)為該應(yīng)用程序開(kāi)發(fā)的組件。一個(gè)應(yīng)用程序通過(guò)“粘合”一組單獨(dú)組件提供的功能,從而實(shí)

現(xiàn)并執(zhí)行要求的業(yè)務(wù)邏輯。組件實(shí)現(xiàn)技術(shù)如COM、J2EE,CORBA和.NET提供了用以無(wú)縫地連接二進(jìn)制

組件的“管道”或者叫基礎(chǔ)架構(gòu),這些技術(shù)的主要區(qū)別在于允許你連接這些組件的難易程度不同罷了。

將單一的應(yīng)用程序分解成多個(gè)二進(jìn)制組件的初衷有點(diǎn)類(lèi)似于將不同的類(lèi)放在不同的文件中。通過(guò)將一個(gè)應(yīng)

用程序的每個(gè)類(lèi)代碼放到各自的文件中,你可以降低類(lèi)和負(fù)責(zé)他們開(kāi)發(fā)的開(kāi)發(fā)人員之間的耦合程度。假如

你改變了一個(gè)類(lèi),盡管你不得不重新鏈接整個(gè)應(yīng)用程序,但是你要做的只是重新編譯那個(gè)類(lèi)的源文件而已。

但是,面向組件編程的優(yōu)勢(shì)遠(yuǎn)不限于簡(jiǎn)化軟件項(xiàng)目管理。因?yàn)橐粋€(gè)面向組件的應(yīng)用程序是一個(gè)二進(jìn)制構(gòu)建

塊集合,你可以將組件看成“樂(lè)高(LEGO)積木”,可以隨意地添加和刪除它們,直至符合你的要求。假如

你要修改一個(gè)組件的實(shí)現(xiàn),改變的只是包含在其中的組件而已,不存在組件的客戶端要重新編譯和重新部

署的問(wèn)題。只要組件不是正在被使用,你甚至可以在客戶端應(yīng)用程序運(yùn)行過(guò)程中更新組件。任何對(duì)組件的

改進(jìn)、增強(qiáng)和修復(fù)都能夠馬上提供給所有使用組件的應(yīng)用程序,不管該程序是在同一臺(tái)機(jī)器上還是在網(wǎng)絡(luò)

上。

另外,一個(gè)面向組件的應(yīng)用程序更加容易擴(kuò)展。當(dāng)你要實(shí)現(xiàn)新的需求時(shí),就可以在新的組件中實(shí)現(xiàn)它們,

而無(wú)須改動(dòng)跟新需求無(wú)關(guān)的現(xiàn)有組件。

上述這些因素使得面向組件編程能夠降低長(zhǎng)期維護(hù)成本,而這一因素對(duì)幾乎所有組織都是十分關(guān)鍵的,這

恰好解釋了組件技術(shù)能夠被廣泛采納的原因。

面向組件應(yīng)用程序通常能夠比較快速地推向市場(chǎng),因?yàn)槟隳軌驈囊欢芽捎媒M件中選擇。有些組件來(lái)自?xún)?nèi)部

團(tuán)隊(duì)的收集,有些組件來(lái)自第三方組件提供商,如此一來(lái)就避免了不必要的重復(fù)開(kāi)發(fā)。例如,許多Visual

Basic項(xiàng)目之所以能夠做到實(shí)現(xiàn)快速開(kāi)發(fā),就是因?yàn)閹缀踉趹?yīng)用程序的任何方面都可以找到相對(duì)應(yīng)的

ActiveX控件類(lèi)庫(kù)。

接口和繼承

InterfacesVersusInheritance

面向組件和面向?qū)ο髴?yīng)用程序的另外?個(gè)重要差別是在繼承和重用模型上的著重點(diǎn)不同。

在面向?qū)ο蟮姆治龊驮O(shè)計(jì)過(guò)程中,應(yīng)用程序經(jīng)常被建模成復(fù)雜層次結(jié)構(gòu)的類(lèi),并且這些類(lèi)被設(shè)計(jì)成盡可能

貼近需要實(shí)現(xiàn)的業(yè)務(wù)邏輯。你通過(guò)從?個(gè)已有的基類(lèi)繼承并且專(zhuān)屬化其行為來(lái)實(shí)現(xiàn)對(duì)已有代碼的重用。問(wèn)

題在于繼承實(shí)現(xiàn)重用是一個(gè)比較差的手段。當(dāng)你從一個(gè)基類(lèi)派生出一個(gè)子類(lèi)時(shí),必須完全了解基類(lèi)的實(shí)現(xiàn)

細(xì)節(jié)。例如,改變成員變量值會(huì)有什么邊際影響,對(duì)基類(lèi)中的代碼會(huì)造成什么影響,重載個(gè)基類(lèi)方法并

提供一個(gè)不同的行為是否會(huì)破壞那些預(yù)期基類(lèi)行為的客戶端代碼?

這種方式的重用通常被稱(chēng)著白盒重用,因?yàn)槟阋煜せ?lèi)的實(shí)現(xiàn)細(xì)節(jié)。因此,白盒重用不能形成像在大企

業(yè)的重用計(jì)劃或者對(duì)第三方框架的方便采用時(shí)所需要的規(guī)模經(jīng)濟(jì)。

相反,面向組件編程強(qiáng)調(diào)黑盒重用,也就意味著允許你使用一個(gè)現(xiàn)存的組件,而不用關(guān)心內(nèi)部實(shí)現(xiàn),只要

組件實(shí)現(xiàn)了?些預(yù)定義的操作或接口。作為組件和客戶端之間使用的契約,面向組件的開(kāi)發(fā)人員大部分時(shí)

間花在分解接口上,而不是花力氣設(shè)計(jì)復(fù)雜的類(lèi)層次結(jié)構(gòu)。

警告:.NET允許通過(guò)繼承實(shí)現(xiàn)的方式使用組件、你的確可以使用這樣的技

術(shù)開(kāi)發(fā)復(fù)雜的對(duì)象層次結(jié)構(gòu),然而,你應(yīng)該盡可能保持你的類(lèi)層次關(guān)系簡(jiǎn)單明了,而將

精力集中在構(gòu)建接口上。這樣可以提升你的組件的黑盒重用,而不是通過(guò)繼承實(shí)現(xiàn)的白

盒重用。

最后,在應(yīng)用程序的運(yùn)行方面,如多線程和并發(fā)管理、安全和分布式應(yīng)用程序、部署、以及版本控制,面

向?qū)ο缶幊烫峁┝撕苌俚墓ぞ吆驮O(shè)計(jì)模式。一旦須提供處理這些公共需求的基礎(chǔ)架構(gòu)時(shí),面向?qū)ο蟮拈_(kāi)發(fā)

人員或多或少只能自力更生了。通過(guò)本書(shū)你將會(huì)看到,.NET提供了?個(gè)卓越的組件開(kāi)發(fā)基礎(chǔ)架構(gòu)支持。使

用.NET時(shí),可以集中關(guān)注業(yè)務(wù)問(wèn)題的解決,而無(wú)須關(guān)注構(gòu)建業(yè)務(wù)方案所需的軟件基礎(chǔ)架構(gòu)。

面向組件編程的原則

PrinciplesofComponent-OrientedProgramming

面向組件編程要求具有支持那些堅(jiān)持其核心原則的開(kāi)發(fā)方法和開(kāi)發(fā)人員的系統(tǒng)。然而,大多時(shí)候很難界定

清楚一個(gè)真正的原則和組件技術(shù)的某個(gè)特點(diǎn)之間的區(qū)別。毫無(wú)疑問(wèn),隨著相關(guān)支持技術(shù)的不斷增強(qiáng),軟件

工程將對(duì)“由什么構(gòu)成了面向組件編程”有更深的理解,將包含更多新的理念,其核心的原則也會(huì)不斷演化。

下面列出了面向組件編程最重要的原則:

I接口和實(shí)現(xiàn)分離

I二進(jìn)制兼容

I語(yǔ)言獨(dú)立性

I位置透明

I并發(fā)管理

I版本控制

I基于組件的安全

這些章節(jié)將討論的是這七個(gè)重要的原則,正如在下面討論的,.NET遵循所有這些核心原則,但并不強(qiáng)制遵

循這些原則。

接口和實(shí)現(xiàn)分離

Separat

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論