聞 平,王 沖,楊林波,陳 科,謝 飛
(中國水電顧問集團昆明勘測設(shè)計研究院,云南昆明650051)
GIS軟件經(jīng)過幾十年的發(fā)展,已經(jīng)從最初的空間數(shù)據(jù)存儲和顯示的簡單應(yīng)用轉(zhuǎn)換為高級地理統(tǒng)計、空間分析和地理服務(wù)等方面的應(yīng)用。GIS應(yīng)用的領(lǐng)域已越來越廣泛,應(yīng)用的方向和工程的復(fù)雜度也不斷增大,特別是針對我院多部門之間共同開展的GIS技術(shù)應(yīng)用與研究,不同的部門有不同的需求,業(yè)務(wù)需求變化多端,如果繼續(xù)按照以往的軟件開發(fā)過程來實施,每個項目從頭做起,不同項目的復(fù)用部分也僅僅是停留在代碼的簡單復(fù)制與粘貼上面,這樣的技術(shù)與方法伸縮性較差,不僅不能滿足軟件的擴展與可復(fù)用的需求,也不能充分發(fā)揮多部門、多人之間的協(xié)作關(guān)系。為改變上述情況以適應(yīng)不斷衍生的業(yè)務(wù)需求,GIS軟件需要擁有結(jié)構(gòu)清晰簡潔、支持復(fù)用、可擴展性強和易于維護等高性能架構(gòu)。插件式GIS應(yīng)用框架是解決上述問題的比較好的技術(shù)途徑。本文基于.NET平臺設(shè)計了面向應(yīng)用型的插件式GIS應(yīng)用框架,并對其實現(xiàn)關(guān)鍵技術(shù)進行了深入研究,將研究成果應(yīng)用于實際,取得了較好的應(yīng)用效果。
插件(plugin)是按照預(yù)定接口實現(xiàn)的軟件功能構(gòu)件。應(yīng)用程序可在“運行時”動態(tài)加載插件并執(zhí)行其功能。插件技術(shù)是一種提高軟件復(fù)用性和可擴展性的有效方法。插件技術(shù)使應(yīng)用軟件功能具有很好伸縮性,在軟件領(lǐng)域已有較廣泛的應(yīng)用。
插件的實現(xiàn)一般有3種技術(shù):基于動態(tài)鏈接庫DLL的插件、基于組件對象模型COM的插件和基于.NET反射技術(shù)的插件。
1)動態(tài)鏈接庫是具有某種功能的一種軟件模塊。動態(tài)鏈接庫文件本身并不能獨立運行,但它能夠被其他程序調(diào)用實現(xiàn)。基于這種特性,使用動態(tài)鏈接庫也能產(chǎn)生插件對象。
2)組件對象模型COM是一種組件二進制級別的交互標(biāo)準(zhǔn)。它以COM接口作為不同組件之間通信的通道,只要實現(xiàn)了COM標(biāo)準(zhǔn),使用任何一種支持COM語言編寫的組件都能夠互相調(diào)用。
3)在.NET Framework中,使用.NET的反射機制和接口技術(shù),也能夠產(chǎn)生插件。.NET平臺動態(tài)加載一個插件程序集(assembly)后,可以通過反射機制,獲得程序集中的類型信息。如果類型信息滿足主程序的要求,主程序?qū)⑹褂脤ο髣討B(tài)生成技術(shù)在內(nèi)存中根據(jù)類型定義產(chǎn)生一個插件對象實例并加載到插件池中[2]。本文后面所提到的插件的開發(fā)就是基于.NET反射技術(shù)實現(xiàn)的。
本文所述的插件式GIS應(yīng)用框架主要包括了4個組成部分,如圖1所示。
1)主界面程序:該程序是以EXE可執(zhí)行文件的形式存在,主要負責(zé)生成按鈕、工具、工具條和菜單等界面UI對象,并負責(zé)將這些對象事件進行委托關(guān)聯(lián)。
2)插件引擎:提取插件程序集中包含的插件類型信息,并負責(zé)將其生成相應(yīng)的插件對象。
3)通信契約:主程序與插件之間相互認可的一種標(biāo)準(zhǔn),以接口的形式存在,即只有實現(xiàn)了規(guī)定接口的類型對象才能被插件引擎認可為插件。
4)插件:插件式框架具體功能的實現(xiàn),插件式框架模型將一個程序的功能劃分為相對獨立的模塊,每一個模塊就以一個單獨的插件形式存在。
圖1 插件式GIS應(yīng)用框架結(jié)構(gòu)圖
插件式GIS應(yīng)用框架結(jié)構(gòu)中,GIS系統(tǒng)主程序簡化為只負責(zé)激活應(yīng)用框架核心組件。這樣小而輕的主程序有利于減少系統(tǒng)啟動等待時間和方便軟件部署與更新。應(yīng)用框架支撐著整個插件式GIS應(yīng)用軟件的結(jié)構(gòu),負責(zé)動態(tài)加載插件,根據(jù)插件配置生成交互界面,協(xié)調(diào)插件間的互操作等。
插件式GIS應(yīng)用框架實現(xiàn)的關(guān)鍵技術(shù)包括接口的設(shè)計與實現(xiàn)、插件的動態(tài)加載、插件的調(diào)用等。
本文所述的插件式GIS應(yīng)用框架主要實現(xiàn)了以下7個接口:①IApplication接口;②IPlugin接口;③ICommand接口;④ITool接口;⑤IToolbarDef接口;⑥IMenuDef接口;⑦IDockableWindowDef接口,其接口關(guān)系如圖2所示。
圖2 接口關(guān)系圖
本系統(tǒng)將插件統(tǒng)一放在一個文件夾(plugin)中,在主程序啟動時即可去查找該文件夾并創(chuàng)建可用的插件對象。當(dāng)用戶需要增加新的功能時,只需要將符合接口的新的程序集放在plugin文件夾中,重新啟動主程序即可完成功能的添加。同理,當(dāng)用戶需要刪減一個功能時,只需要將實現(xiàn)該功能的程序集移除plugin文件夾,重新啟動主程序即可完成功能的刪減。
本框架中插件的動態(tài)加載使用了.NET的反射機制,它能根據(jù)一個插件類型的描述信息產(chǎn)生插件對象,插件的動態(tài)加載過程如下。
1)首先使用一個靜態(tài)方法探測啟動路徑下的plugin文件夾是否存在,如果不存在,將自動新建一個plugin文件夾避免出現(xiàn)異常
如果插件文件夾存在,將尋找該文件夾中所有的DLL文件并返回一個包含了文件路徑的字符串?dāng)?shù)組。
2)系統(tǒng)遍歷文件路徑數(shù)組,從中得到每一個程序集文件的絕對路徑,然后將其動態(tài)加載。
3)系統(tǒng)識別類型的每一個接口,如果該類型的某個接口完整名為ICommand、ITool、IToolbarDef、IMenuDef或IDockableWindowDef中的一種,系統(tǒng)將認定該類型是一個有效的插件類型并根據(jù)該類型名產(chǎn)生一個實例對象。
針對不同的插件,插件管理器獲取插件后,主程序根據(jù)插件信息生成并調(diào)用相應(yīng)的插件,且在主程序的系統(tǒng)界面上生成相應(yīng)的菜單和工具欄。如ICommand表現(xiàn)為命令按鈕;ITool表現(xiàn)為工具按鈕;IMenuDef表現(xiàn)為菜單欄;IToolbarDef表現(xiàn)為工具條。后兩者均為ICommand命令按鈕和ITool工具按鈕的??繉ο蟆?/p>
本文以.NET平臺為開發(fā)環(huán)境,通過C#,AcrGIS Engine 10.0組件和Skyline Globe組件完整的實現(xiàn)了一個插件式GIS應(yīng)用框架。系統(tǒng)中所有功能模塊都是以插件的形式實現(xiàn),通過拷貝插件到系統(tǒng)指定目錄下即可被應(yīng)用框架自動調(diào)用,系統(tǒng)主界面如圖3所示。
本文從系統(tǒng)框架、接口實現(xiàn)和加載等方面討論了插件式GIS應(yīng)用框架的實現(xiàn)過程,并結(jié)合實踐,搭建了一個完整的插件式GIS應(yīng)用框架。只要定義好了接口規(guī)范,后期便可以利用插件對系統(tǒng)的功能進行很好的擴展,減少重復(fù)工作,能在很大程度上提高工作效率,降低開發(fā)成本和后期維護成本。
圖3 系統(tǒng)主界面
[1]陳方明,陳奇.基于插件思想的可重用軟件設(shè)計與實現(xiàn)[J].計算機工程與設(shè)計,2005,26(1):172-173.
[2]蔣波濤.插件式GIS應(yīng)用框架的設(shè)計與實現(xiàn)[M].北京:電子工業(yè)出版社,2008.
[3]高慧萍,呂俊.插件式開發(fā)技術(shù)研究與實現(xiàn)[J].計算機工程與設(shè)計,2009,30(16):3805-3807.
[4]張毅,李國卿,趙軍喜,等.插件式GIS應(yīng)用框架關(guān)鍵技術(shù)研究[J].測繪科學(xué)技術(shù)學(xué)報,2010,27(4) :298-301.
[5]江麗鈞,談曉珊,孫毅中.基于插件的城市規(guī)劃信息系統(tǒng)的研究[J].現(xiàn)代測繪,2010,33(1):8-10.
[6]盧學(xué)鶴,余光輝,溫小榮,等.基于插件技術(shù)的森林資源GIS的設(shè)計與實現(xiàn)[J].南京林業(yè)大學(xué)學(xué)報:自然科學(xué)版,2009,33(1):127-130.
[7]楊世琦,徐永近,高陽華.基于插件技術(shù)的測土施肥決策系統(tǒng)設(shè)計[J].西南師范大學(xué)學(xué)報:自然科學(xué)版,2010,35(1):158-163.