文章版權由做者李曉暉和博客園共有,若轉載請於明顯處標明出處:http://www.cnblogs.com/naaoveGIS/java
通常的WinForm中經過C#自帶的Event機制便能很好的實現事件的註冊和分發,可是,在插件系統中卻不能這麼簡單的直接用已有的類來完成。一個插件本不包含另一個插件,它們均是獨立解耦的,實現插件和插件間的通訊還須要咱們設計出一個事件引擎來完成這個需求。微信
目前不少高級語言中基本都實現了觀察者模式,並進行了本身的包裝。好比C#中的delegate和event組合,java awt中的Event和addActionListener組合,Flex中的Event、addEventListener、dispatchEvent等。spa
不過這裏若是要實現插件系統的事件機制,須要從新本身利用觀察者模式來進行設計。並且還將涉及到泛型這個概念。插件
這裏先給出觀察者模式的UML圖:設計
能夠把觀察者模式理解爲兩個部分:3d
(1)Obesrver(觀察者):每一個觀察者均有本身的行爲方式,可是他們均繼承於同一個基類,此基類中定義了一個全部繼承觀察者均有的行爲觸發方法。orm
(2)Subject(觸發者):觸發者便是被觀察者,在Subject中必定會有一個容器來存儲與觸發者相關的觀察者,由於包含觀察者容器,因此Subject方法中提供了註冊和註銷的方法。同時Subject中必定有一個觸發方法,當調用此方法時,便會遍歷裝有觀察者的容器,Obeserver類再利用多態特性實現了每一個觀察者特有的行爲。server
泛型是具備佔位符(類型參數)的類、結構、接口和方法,這些佔位符是類、結構、接口和方法所存儲或使用的一個或多個類型的佔位符。blog
事件機制中的通訊數據由於不能肯定爲某種具體數據,在實現中,統一用泛型來代替。繼承
項目中須要在插件處理完影像後,將處理完的影像的地址、名稱以及類型通知給宿主。而後宿主根據獲得的消息和數據,將處理完後的影像展示出來。
這部分設計的UML圖以下所示:
代碼中實現了觀察者容器、注入和發佈部分。
個人項目中須要將插件處理完影像後,將處理完的影像的地址、名稱以及類型通知給宿主。因而我將這樣設計個人事件中包含的數據:
具體的要傳遞的數據是對應具體的觸發者的。咱們能夠有多種多樣的事件,而每種觸發者將對應一種事件,因此這裏須要設計多個觸發者子類。針對3.1.2中說的插件處理完影像後的觸發事件,這裏給出實現的代碼:
觸發者容器中包含了全部的觸發者,而且提供了獲取容器中具體觸發者的方法,即GetEvent方法。代碼中還給出了Export標籤,這是爲了讓其餘插件和組件加載後可以將觸發者容器注入其中。這樣須要將某個方法注入到一個具體的事件上時,則只需在觸發者容器中經過GetEvent方法獲得該觸發者,而後將方法再subscribe到這個觸發者中。
首先得到須要註冊入的ConcreteSubject,而後將Observer注入其中,這裏的Observer是繼承於Action的。
這裏一樣須要將EventAggregator注入到事件被觸發的模塊中。
首先得到須要觸發的觸發者(ConcreteSubject),而後將須要傳遞的信息實例化,最後觸發這個事件(Publish)。
到這裏,我已經把個人MEF插件系統中的事件機制解析完了。其實說到底就是一個觀察者模式的實現,只是在這個模式的基礎上作了一個包裝。在下一節中,我將主要講解MEF插件中插件注入到宿主中的過程,和插件在宿主中界面的實現。
-----歡迎轉載,但保留版權,請於明顯處標明出處:http://www.cnblogs.com/naaoveGIS/
若是您以爲本文確實幫助了您,能夠微信掃一掃,進行小額的打賞和鼓勵,謝謝 ^_^