天天看點

NET插件系統之一,開頭:MEF的一些疑問和相關思考

      實作可擴充的軟體系統是我一直的目标和想法。可擴充性顯然屬于動态程式設計的範疇。是以,幾個月來我在業餘時間會抽空學習插件系統。  

我參考了部落格園的幾篇插件式系統的文章。知道了實作插件系統有以下的核心流程:

      1. 定義插件接口,并在各個功能元件中實作這些接口

  2. 在主程式中,通過周遊所需目錄下的dll檔案,查詢實作該接口的type,進而通過createinstance方法實作其動态建立,并加入到主程式插件清單。下面的代碼展示了該功能。

    這個流程其實很簡單,我也比較友善的實作了自制的插件系統。 但問題随之而來:

      1. 如果該系統是一棵插件樹,那麼顯然我需要不止一次查詢所有dll檔案,并查詢所有type,這會帶來顯著的性能問題。

      2. 如果某類型不需要在啟動時就執行個體化,那麼我可以存儲該類型,在需要的時候實作調用。

    3. 最核心也是最大的問題: 插件之間的互相通路如何解決,目前我隻能采用 從插件清單中找到該引用,然後将其強制類型轉換到所需的插件樣式。但顯然,這種做法很不好,不符合插件隔離,而且必須添加該項目引用。

      4. 我希望能在不執行個體化該類的前提下獲得對象的某些屬性, 比如, 一個遊戲清單,它會提供這些遊戲的名稱,圖檔和相關資訊。但這些資料才能如何獲得?雖然有attribute,但它所提供的功能顯然有限。

      1. mef可以友善的實作插件元件,不需要手動寫死,但其中的控制權限顯然不在使用者,有些選項雖然開放,但你很難控制。雖然我知道有lazy泛型,但如哪些方法在什麼時候執行個體化還是很難保證。我并不需要在任何時候都保留所有插件的執行個體對象,而希望在需要的時候執行個體化或銷毀它,可惜mef未能提供。 

      2. 使用mef後,必須強制将實作插件的各個元件版本升到.net 4.0, 雖然不是太難的事情,但卻需要用戶端更多的部署。

  3. mef依舊沒有解決插件間通信的問題,它僅僅為你提供了插件的集合,但元件間的事件,通信方法卻隻字未提。 如果是這樣的話,它的功能豈不是太簡單?

      4.mef是否有性能問題?它的實作機制顯然是反射和attribute, 但搜尋目錄和某一程式集并執行個體化的性能如何呢?我沒有做過詳細對比....

       結合前面,使用import和export關鍵字實作的mef插件雖然很high,但帶來的問題也絕對不少。   但實際上,我們手動實作一個比mef更靈活的系統也不是一件太難的事情,而增加的代碼量實際并不多,也不用加入這個依賴庫。 于是,mef的價值又有多大呢?

       我非常崇拜vs或者eclipse這樣大型軟體所實作的插件系統,主核心完全無法知道将來會有什麼功能加入,但其可擴充性,性能,結構清晰程度都是像我這樣的菜鳥無法企及的。是不是有更複雜的機制,如 事件管道來實作這些功能呢?我不知道。

       當然有很多類型的插件系統,比如maf,我未曾做深入研究,是因為實在學習成本高昂,時間有限,但實際上特别希望能學習這些插件系統的精髓之處。

       非常希望有大牛能解決我的以下問題。

       1.  各插件之間能夠解除引用依賴的事件通知方法。 調用難道我要把所有的功能都寫入接口麼?這顯然不現實。

       2. 如何提升插件搜尋元件的速度和性能?

       3. 如何在不執行個體化該類的前提下獲得對象的某些屬性?之是以不想執行個體化,是因為該對象可能比較龐大,如果對象很多,這會帶來顯著的性能問題

       有任何問題随時歡迎交流!

繼續閱讀