上一篇博文簡單介紹了下插件化的代碼組成部分: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對象來啟動、停用、卸載插件。
今天就簡單介紹到這里,后續的文章會越來越細。