探討外掛程式式GIS架構的設計

來源:互聯網
上載者:User

標籤:winform   blog   http   使用   io   檔案   資料   for   

三年前,聽當時的師兄推薦,買了蔣波濤的一本關於GIS外掛程式架構的書。當時一邊看書一邊將其中的例子完整的實現了一遍,收益匪淺。後來由於項目需要,也做過一個外掛程式的C/S系統,用的是微軟提供的MEF架構。在這個系統中,把蔣波濤在他的書中沒有涉及到的外掛程式和外掛程式的通訊完成了。不過,蔣波濤的那本書,涉及到了外掛程式系統的很多底層內容,其中關於外掛程式引擎的設計尤其值得學習。近來,我將自己當年實現的那個例子進行了一個總結,和大家一起分享。

1.外掛程式式架構的組成

(1).架構分為宿主程式和外掛程式對象兩部分

(2).兩部分互動基於一種公用的通訊契約

(3).宿主程式可以獨立存在

2.使用外掛程式的原因

(1).可以在無需對程式進行重新編譯和發布的條件下擴充程式的功能

(2).可以在不需要程式原始碼的環境下為程式增加新的功能

(3).在一個程式的商務邏輯不斷髮生改變、新的規則頻頻加入時能夠靈活適應

3.外掛程式的一般實現技術

(1).基於動態連結程式庫DLL的外掛程式

(2).基於COM的外掛程式

(3).基於反射技術的外掛程式

4.細談本架構的實現4.1.設計全部並實現部分介面

介面分為:

宿主介面:IApplicaiton

外掛程式介面:IPlugin(ICommand,Itool, IMenuDef,IToolBarDef,IDockableWindowDef)和不是繼承於Ipluging的IItemDef

本章中,對繼承於IApplication的Application和繼承於ItemDef的ItemDef類進行了實現。類圖如下:

 

 

 

 

 

4.2製作外掛程式容器

在執行個體化的外掛程式還沒有被添加到宿主中時,需要一個寄存這些執行個體化的外掛程式的宿主。

於是,我們在設計完外掛程式介面後,還得做一個設計外掛程式容器的工作。此容器只能存放繼承於Iplugin的類。

4.2.1設計PluginCollection

首先:

繼承CollectionBase抽象類別。

因為CollectionBase已經實現了Ilist,Icolloction和Ienumerable等三個介面,為我們解決了大部分問題。

(其中主要重點是要覆蓋一個新的GetEnumerator()方法,且此方法返回的是一個實現了IEnumerator介面的類.如果在重寫這個方法時已經利用yield實現了迭代功能,則第二步可以跳過)。

然後:

寫那個繼承並實現了IEnumerator介面的類。(主要是重寫Current,MoveNext,,Reset三個函數)

4.3設計PluginEngine中的反射機制

以上我們設計了通訊介面和介面容器,為什麼說外掛程式只有實現了這些介面中的一個才能被識別呢?

因為我們的介面引擎(PluginEngine)只能對這些介面進行識別。

那麼何為介面引擎呢?

簡單點說,在本系統中,就是利用反射後得到的每個TYPE的InterFace必須是我們以上規定的幾個介面才能被識別和做出反應。

 

4.3.1細解動態載入和對象產生

反射機制是我們這個外掛程式系統的核心技術。

它使得這些類都可以被動態載入和調用。

(1).本系統首先利用Directory.GetFiles()函數得到目標檔案夾裡的所有DLL檔案。

(2).利用反射函數Assemly.LoadFrom負載檔案(得到若干程式集)。再利用程式集的GetTypes()得到Type[]數組。

(3).最後利用Type類的GetInterfaces()得到每一個類所繼承的介面。利用switch檢查這個類是否繼承過自訂的那些介面。若實現過,則利用Activator.CreateInstance(Type _type)這個方法來執行個體化這個類。最後將其加入到外掛程式容器PluginCollection中。

 

4.4外掛程式的分類

設定五個介面字典容器,分別是裝ICommand,ITool,IToolBarDef,IMenuDef,IDockableWindowDef的五個容器和一個命令類型容器(其中將存放實現了ICommand和或者ITool的不重複的Category)。

註:這些容器中的Key值都是在實現這些介面的外掛程式的名字。

 

4.5建立宿主架構

利用第三方控制項Janus WinForms Controls V3.5來設計介面。

此三方控制項中有兩個控制項,一個是UICommandManager,一個是UIPanelManager,這兩個控制項對外掛程式的插入顯示有很大的協助

 

此宿主執行個體化時,首先執行個體化一個Apllication類,然後再給此執行個體中的MapControl,PageControl,MainPlantform的重要屬性賦值。

所以通過這個被複製了的執行個體,宿主和外掛程式的互動就不難實現了。

4.6外掛程式擷取

這是一個比較大的方面,也是核心之一了。也便是,怎麼樣能讓宿主得到還保留在外掛程式容器中的外掛程式,並能顯示在宿主中?

1.因為Command和Tool在UI上是同一類型,所以合在一起擷取。

擷取中,有兩個地方要注意:一個是要使執行個體Create(hook ),即把宿主的相關資訊類Application傳遞過去。第二個是,註冊系統定義事件。例如UICommand+=new CommandEventHandler(UICommand_Click);

2.同理分別對繼承了IMenuDef,IToolBarDef以及IDockableWindowDef的對象進行擷取。

註:浮動表單是由UIPanelManager進行託管的。也就是將懸浮框中的ChildHWND(Control類)加入到新panel中的panelContainer.Controls中。

4.7外掛程式對象的事件處理

上一個步驟中,我們把一個未定義的事件處理方法通過內建委託註冊到了Click事件中了。

那麼這一節我們將具體來寫這個事件處理方法。Command是互動的,Tool是不互動的。所以編寫起來有很大差別。

這兩個處理函數中,有兩個共同的關鍵點:一個是利用e(CommandEventArgs類)的e.Command.Key得到在相關外掛程式字典容器中放置的對象。第二個是都要觸發對象的Click函數。

4.8架構外掛程式設計

 

這節是系統以後也可以繼續擴充的地方。

此處重點抓住cAddData這個外掛程式的實現。

此類首先繼承Icommand這個介面。在宿主表單載入擷取各外掛程式而觸發的create(Iapplication hook)方法中,調用Engine內建的ControlsAddDataCommandClass()類,並將其hook到傳遞過來的宿主的MapControl上去即可。

 

4.9宿主程式的進階設計

可以對宿主程式本身進行一些進階設計。比如使得mapControl和PageControl聯動顯示。比如制定TocControl的浮動菜單或者開發要素資料的查詢顯示等。

注意:此些設計都是對宿主本身而設計的,跟外掛程式沒關係。是最大程度上的利用宿主表單本身。

4.10架構輔助組件架構庫設計

此節完全是為了更方便的開發架構或其外掛程式本身而設計的。

在此部分,可以把很多以後可能會用到的方法進行編寫以及封裝,以後開發便可以直接調用。

可以稱本部分為系統開發包(SDK),但是此部分並非系統必備。

4.11系統發布

系統發布時首先要確定一個空機器上需要運行此系統起碼需要哪些基本的平台。

此系統運行時對方機器上起碼該裝有:.NET 3.0 Framework可再分發組件包,Janus System UI V3.5 和ArcGIS Engine10 Runtime

然後利用InstallShield Express X來打包。

5結果展示

 

6.本架構的優劣及展望6.1優勢

本架構為純底層開發,移植性和通用性比較好。具有一般的外掛程式所具有的其他特點,例如易擴充,有一定的解耦性。符合面向介面和依賴倒轉的編程思想,在本架構中,還整合了命令模式、觀察者模式、遍曆模式以及面板模式,單例模式。

6.2劣勢

本架構劃分的粒度太細,這樣容易使類爆炸式增長。

本架構只實現了外掛程式與宿主之間的通訊,而沒有實現外掛程式與外掛程式之間的通訊。

6.3展望

解決外掛程式與外掛程式之間的通訊,可單獨做一個複雜通訊的外掛程式,然後其他外掛程式均引用此外掛程式。利用觀察者模式,在宿主中載入外掛程式後,便能實現事件註冊,進而實現外掛程式之間的通訊。

同時,很多架構都實現了外掛程式的編程思想。比利用Spring的依賴注入和微軟提供的MEF所有的依賴注入,均能實現外掛程式系統。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.