基於.NET MVC的高性能IOC插件化架構(二)之插件加載原理


上一篇博文簡單介紹了下插件化的代碼組成部分:http://www.cnblogs.com/gengzhe/p/4390932.html,源碼地址:https://github.com/luohuazhiyu/sunmvc

這篇博客主要講解下插件化實現的原理,先面先講解幾個概念:

一、契約

  插件與系統必須有契約,系統才能發現插件並正確加載插件,我采用的是所有插件都實現Sun.Core里面的IPlugin接口。

二、自述

  插件在被加載的時候,需要告訴系統,我是什么類型的插件,我的guid,我依賴的程序集,我的狀態與權限,我的配置信息等等,這個行為是插件的自我描述,簡稱自述。

三、配置

  插件必須能夠進行配置(一般在安裝的時候或者才系統啟動之前進行配置),插件配置的使用過程大致為:系統發現插件-》加載插件-》加載插件配置文件-》把配置信息傳入插件內實現了IPlugin接口的類對插件進行初始化。

---------------------------------------------------------------------------------------

插件使用流程:插件開發(也可通過插件倉庫下載需要的插件)-》插件zip文件上傳-》配置插件-》啟用插件

有了流程,我順着流程一步一步分析實現原理:

一、插件開發

  1.所開發的插件必須有一個類實現Sun.Core里面的接口,這個接口里面包含初始化、啟動、停止、卸載幾個方法,因為只有插件自己才了解自己,所以這些功能需要插件自己提供,系統只負責使用。

  2.插件必須提供PluginConfig.Json文件,這里面的配置文件有固定的格式,用於向系統提供配置信息及保存用戶的設置。

二、插件上傳

  step1:插件壓縮為zip文件,上傳保存到PluginZips文件夾下面。

  step2:自動解壓縮插件文件到PluginTemp(插件檢測臨時目錄)。

  step3:檢測插件是否包含IPlugin的實現以及是否包含PluginConfig.Json文件,如果存在繼續往下執行,如果不存在則刪除臨時文件以及zip文件,並反饋插件錯誤信息。

  step4:通過插件配置文件,拷貝到Plugins(插件存放目錄)下的相應插件類別目錄下面。

  .....(加載插件)

三、插件加載

  1、系統啟動加載

  step1:遍歷Plugins目錄下面的所有插件文件,讀取PluginConfig對象列表並把列表信息保存到插件管理器里面以便管理調用。

  step2:篩選掉PluginConfig里面狀態標識為error的插件。

    step3:把插件程序集及依賴的不存在系統bin目錄下的程序集加載到App_Data目錄下的Plugins目錄下(便於統一加載及不影響到原Plugins目錄下插件的修改、刪除)。

  step4:加載Plugin程序集及依賴程序集(如果使用IOC,需要把程序集注冊到IOC容器)。

  step5:調用程序集下IPlugin的實現類,執行初始化,如果插件狀態為啟動,可直接啟動插件。

  2、上傳插件加載(單個)

  上傳插件的加載與啟動加載的不同之處在於前者不需要遍歷,其它步驟一樣。

  備注:如果使用IOC容器,那么這里需要把新增的這些程序集注冊到IOC容器並重置容器。

四、插件管理

  因為在插件加載的過程中,插件的配置信息及IPlugin對象都已保存,這里就比較簡單。通過列表可以篩選啟動、停用、異常的插件,並可以直接調用IPlugin對象來啟動、停用、卸載插件。

今天就簡單介紹到這里,后續的文章會越來越細。

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM