1.2 外掛程式式應用程式框架
外掛程式技術是在軟體的設計和開發過程中,將整個應用程式劃分為宿主程式和外掛程式對象兩部分,宿主程式能夠調用外掛程式對象,外掛程式對象能夠在宿主程式上實現自己的邏輯,而兩者的互動基於一種公用的通訊契約。宿主程式可以獨立於外掛程式對象存在,即使沒有任何外掛程式對象,宿主程式的運行也不受影響,因此,我們可以在避免改變宿主程式的情況下通過增減外掛程式或修改外掛程式的方式增加或調整功能。由於使用了外掛程式技術的宿主程式具備了一個架構的本質特徵,因此可以將它看作是一種外掛程式式架構。外掛程式式架構能夠有效地降低功能對象與對象管理邏輯之間的耦合程度,並將耦合置於最優的程度。
對大部分電腦使用者和軟體開發人員而言,外掛程式式應用程式框架其實算不上什麼神秘的東西,事實上,幾乎每個人都曾使用過具有外掛程式式功能的軟體產品。這些軟體有大有小,從操作簡單的諸如播放器軟體到複雜桀驁的各種專業應用軟體,都或多或少採用過外掛程式機制,只是對於終端使用者而言,由於常常滿足於使用一款成熟軟體,很少有人刻意去關注這些軟體使用的是什麼樣的架構體系。
在Adobe Photoshop或WinAmp等應用軟體中,都可以看到外掛程式機制的影子。如給軟體更換“皮膚”(Skin)時,使用者只需要將新的皮膚檔案複製到一個特定的檔案夾中,啟動軟體後,就可以使用新的軟體介面而無需軟體開發商提供一個新的版本。如果讀者使用過Photoshop,可能會常常尋找些不同的濾鏡來產生各種特效,這些檔案只需要拷貝到濾鏡檔案夾中,並通過對話方塊載入到Photoshop中即可使用。這便是外掛程式式架構的一種簡單應用。
如果觀察更仔細一點,我們將會發現許多常用的大中型軟體都使用了外掛程式式機制,如MS Office System、AutoCAD、Visual Studio.NET和Eclipse等。在這些產品中,以Eclipse平台最為著名,由於它的開源特性和可擴充性,全世界成千上萬的愛好者和商業軟體公司都基於Eclipse平台開發出了多種類型的外掛程式,這些外掛程式使Eclipse的功能變得越來越豐富和強大,反過來促進了自己的發展。
一般而言,一款軟體使用外掛程式式架構機制的原因主要基於以下3點:
n 可以在無需對程式進行重新編譯和發布的條件下擴充程式的功能。
n 可以在不需要程式原始碼的環境下為程式增加新的功能。
n 在一個程式的商務邏輯不斷髮生改變、新的規則頻頻加入時能夠靈活適應。
對許多專業軟體而言,使用外掛程式式架構機制開發應用軟體是一種必然的選擇。任何一款專業軟體,無論項目研發人員在開發之前做過多麼詳細的使用者調查和需求分析,都不可能滿足使用該軟體的每個行業、每個使用者的全部需求。為了延長軟體產品的生命週期,在避免修改軟體程式主體的情況下,如果能通過一種具有良好擴充性的方式讓軟體根據使用者實際需求實現“生長”,無疑具有極大的誘惑力。以GIS行業為例,由於不同部門管理和使用的GIS資料類型千差萬別,商務程序也複雜多變,都必鬚根據實際情況開發自己專門的GIS軟體,這也是GIS二次開發大行其道的主要原因,如果每個新應用項目都必須讓開發人員從頭構建,無疑是一種智力與經驗的浪費,同時浪費的還有寶貴的開發時間。
熟悉ESRI公司產品ArcGIS Desktop的GIS開發人員對外掛程式式機制可能會有更深入的認識和瞭解。以ArcMap程式為例,它有兩種擴充方式,一是在ArcMap中編寫VBA(Visual Basic for Application)代碼實現,VBA是一種標準工業級的內建整合編程環境,使用者可以在這個內建環境中直接使用內建對象編寫擴充代碼,這些VBA代碼將儲存在一個mxd檔案中,供ArcMap調用和分發;另一種是實現ArcObjects發布的ICommand、IMenuDef等外掛程式介面,使用VC++、VB等語言編寫滿足一定要求的COM外掛程式來擴充功能。在這兩種情況中,ESRI的ArcMap軟體就好像一個應用功能的容器,而GIS程式員可以根據自己的實際需要不斷填充和增強這個容器的功能,這個容器為功能的擴充提供了無限的空間。
使用了外掛程式式機制的應用程式是一個架構,這個架構由於使用了外掛程式架構,變得穩固且具有良好的可擴充性。擴充性的優點在於它屏蔽了宿主程式與外掛程式對象之間複雜的互動和通訊聯絡,第三方外掛程式開發人員無需關注架構的宿主程式是如何啟動並執行,如何調用外掛程式對象等複雜問題。事實上,他們完全無需瞭解架構的宿主程式是如何編寫的,只須關心自己所要解決問題的處理邏輯,只要這個邏輯編寫正確,並且符合外掛程式式架構規定的格式和流程,這個外掛程式檔案就將能夠被架構的宿主程式識別並安裝。
外掛程式的實現一般有3種技術:基於動態連結程式庫DLL的外掛程式、基於元件物件模型COM的外掛程式和基於.NET反射技術的外掛程式。
動態連結程式庫是具有某種功能的一種軟體模組,它只在需要時才被系統載入調用。動態連結程式庫檔案本身並不能獨立運行,但它能夠被其他程式調用實現,基於這種特性,使用動態連結程式庫也能產生外掛程式對象。
元件物件模型COM是一種組件二進位層級的互動標準,它以COM介面作為不同組件之間通訊的通道,只要實現了COM標準,使用任何一種支援COM語言編寫的組件都能夠互相調用。元件物件模型的核心是COM介面,ArcGIS軟體就是基於COM技術進行外掛程式開發的。
在.NET Framework中,使用.NET的反射機制和介面技術,也能夠產生外掛程式。.NET平台動態載入一個外掛程式程式集(Assembly)後,可以通過反射機制,獲得程式集中的類型資訊,如果類型資訊滿足宿主程式的要求,宿主程式將使用對象動態產生技術在記憶體中根據類型定義產生一個外掛程式對象執行個體並載入到外掛程式池中。由於外掛程式對象與宿主對象通過介面進行識別,而介面攜帶了讓兩者互相通訊所必需的屬性和方法,因此,宿主程式能夠調用外掛程式對象,外掛程式對象也能夠將獲自宿主程式的必要資訊進行雙向互動。本書討論的外掛程式式GIS應用程式框架NBGIS,正是基於.NET平台和C#的一種外掛程式式應用,我們將使用這些技術為讀者建構一個完整的外掛程式式GIS應用程式框架。