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