文章版權由作者李曉暉和博客園共有,若轉載請於明顯處標明出處:http://www.cnblogs.com/naaoveGIS/。
1.MEF框架簡介
MEF的全稱是Managed Extensibility Framework(MEF),其是.net4.0的組成部分,在3.5上也可以使用。熟悉java中的spring框架的人,對這個框架中涉及的幾個概念應該會比較容易理解。
這里我先把我兩年多前的一個完整的利用MEF搭建的插件式系統中涉及到的MEF框架里的幾個基本概念大致描述下。
1.1 依賴注入(export、import)
MEF框架中提供 import和export功能,即注入和導出。Spring中有依賴注入這個概念,這里的這個概念也是大同小異,即將某個對象實例化后,注入到依賴這個實例的對象中,如此可以降低類之間的耦合。同樣,與spring中的注入類似,MEF也有延遲注入這個概念,普通的依賴注入在整個程序開始運行時便進行了注入,而這種延遲注入可以做到只有當對象需要被使用時才進行注入。
1.2約定(Contracts)
約定是與依賴注入相輔相成的。依賴注入最大的好處就是類與類之間解耦,但是如何知道到底是將一個類注入到另外一個類中呢,這里就需要約定這個概念了。既需要注入的類並不用直接引用對方的類,而是兩者通過一個共同的接口(也可以是類等其他),此接口即為約定,從而進行導出和注入。
1.3 目錄和組件容器(catalog、compositionContainer)
我們用spring時,針對不同的應用,我們只需要啟動applicationContext或者WebApplicationContext將配置加載到IOC容器中,根據XML配置或者注記便可以實現類的依賴注入。在MEF框架中,這種IOC容器需要代碼來進行實現,並且配置一般通過注記的方式。
這里涉及到兩個概念,分別是catalog和compositionContainer。catalog中將所有需要組裝到IOC容器中的類集中到一起,然后再將catalog放入到componentContainer中,這樣我們的IOC容器便擁有了所有的需要進行控制的類。但是僅僅放入后,也並不能讓容器進行自動的依賴注入,它還需要我們進行ComposeExportedValue和SatisfyImportsOnce這樣的操作,才能真正的完成依賴注入的全過程。
1.4 MEF框架圖
2.系統設計
我這里先把兩年前的那個項目的內容大致描述下。該項目為一個影像處理全自動化的項目,分為影像的自動化接收,利用Platform進行並行化預處理,然后再利用此平台對影像進行冰凌、干旱、洪澇的分析處理,最后生成產品后發布和入庫。當時是由幾個大學和一個單位一起合作完成的,哪幾個大學就不說了。我只是這些眾多參與人中的一個,不過我不是像他們做遙感用envi的DLL語言處理影像的,也不是他們用Platform做並行計算的,也不是那些后台做產品發布和入庫的。我做的主要是下面這個需求。
2.1需求
(1)將每天接受的原始影像展現在前台,盡量以合理的美觀的方式展現。
(2)提供影像的查詢功能,包括時間空間等查詢。
(3)提供影像的下載功能。
(4)提供日志的查詢功能。
(5)提供對服務器的監聽功能。
(6)將手動處理完的成果進行管理和展示。
(7)提供對手動處理完的數據進行元數據注冊。
(8)能將自動化中的各個模塊提煉成手動也能輔助進行的模塊,並且可以集成到系統中。
2.2需求分析
看了需求后,我第一個感覺就是這個系統得做出插件式系統,最后我選定了MEF。既然決定了要做插件式系統,那么就得把需求分一個類,及哪些是宿主程序本身有的,哪些是該做成插件。顯而易見,需求中的(1)到(6)都可以做在宿主程序中。而(7)和(8)的話,都是單獨的插件模塊,因為這(7)和(8)的功能都是提取自自動化流程中的,由各個不同的人員完成,我這里只需要提供他們統一的接口以及需要的調用方式就可以由他們自身做成插件了。而且以后可能會將更多的自動化流程提取出來,都做成插件后,方便擴展。
2.3 技術分析
這里主要講針對插件系統的技術需求。
(1)能夠將插件插入到相應的地方,比如是工具欄呢還是左側選擇欄等。
(2)點擊插件所在的按鈕后,插件能彈出。這里需要的是單例模式。
(3)插件能和宿主通訊,比如插件完成了某項功能,需要通知宿主該功能已經完成。
(4)插件和插件之間也要能通訊,比如一個插件完成了某個功能后,能將得出的參數顯示在另外一個插件上。
3.插件框架的設計圖
下一節,插件框架的通信機制的實現中,我會首先講下這個框架實現中的核心部分。在下下講中我們再講整個框架的依賴注入和界面實現。
-----歡迎轉載,但保留版權,請於明顯處標明出處:http://www.cnblogs.com/naaoveGIS/
如果您覺得本文確實幫助了您,可以微信掃一掃,進行小額的打賞和鼓勵,謝謝 ^_^