上一篇博文簡單介紹了下插件化的代碼組成部分:http://www.cnblogs.com/gengzhe/p/4390932.html,源碼地址:https://github.com/luohuazhiyu/sunmvchtml
這篇博客主要講解下插件化實現的原理,先面先講解幾個概念:git
1、契約github
插件與系統必須有契約,系統才能發現插件並正確加載插件,我採用的是全部插件都實現Sun.Core裏面的IPlugin接口。mvc
2、自述ui
插件在被加載的時候,須要告訴系統,我是什麼類型的插件,個人guid,我依賴的程序集,個人狀態與權限,個人配置信息等等,這個行爲是插件的自我描述,簡稱自述。spa
3、配置插件
插件必須可以進行配置(通常在安裝的時候或者才系統啓動以前進行配置),插件配置的使用過程大體爲:系統發現插件-》加載插件-》加載插件配置文件-》把配置信息傳入插件內實現了IPlugin接口的類對插件進行初始化。htm
---------------------------------------------------------------------------------------對象
插件使用流程:插件開發(也可經過插件倉庫下載須要的插件)-》插件zip文件上傳-》配置插件-》啓用插件blog
有了流程,我順着流程一步一步分析實現原理:
1、插件開發
1.所開發的插件必須有一個類實現Sun.Core裏面的接口,這個接口裏麪包含初始化、啓動、中止、卸載幾個方法,由於只有插件本身才瞭解本身,因此這些功能須要插件本身提供,系統只負責使用。
2.插件必須提供PluginConfig.Json文件,這裏面的配置文件有固定的格式,用於向系統提供配置信息及保存用戶的設置。
2、插件上傳
step1:插件壓縮爲zip文件,上傳保存到PluginZips文件夾下面。
step2:自動解壓縮插件文件到PluginTemp(插件檢測臨時目錄)。
step3:檢測插件是否包含IPlugin的實現以及是否包含PluginConfig.Json文件,若是存在繼續往下執行,若是不存在則刪除臨時文件以及zip文件,並反饋插件錯誤信息。
step4:經過插件配置文件,拷貝到Plugins(插件存放目錄)下的相應插件類別目錄下面。
.....(加載插件)
3、插件加載
一、系統啓動加載
step1:遍歷Plugins目錄下面的全部插件文件,讀取PluginConfig對象列表並把列表信息保存到插件管理器裏面以便管理調用。
step2:篩選掉PluginConfig裏面狀態標識爲error的插件。
step3:把插件程序集及依賴的不存在系統bin目錄下的程序集加載到App_Data目錄下的Plugins目錄下(便於統一加載及不影響到原Plugins目錄下插件的修改、刪除)。
step4:加載Plugin程序集及依賴程序集(若是使用IOC,須要把程序集註冊到IOC容器)。
step5:調用程序集下IPlugin的實現類,執行初始化,若是插件狀態爲啓動,可直接啓動插件。
二、上傳插件加載(單個)
上傳插件的加載與啓動加載的不一樣之處在於前者不須要遍歷,其它步驟同樣。
備註:若是使用IOC容器,那麼這裏須要把新增的這些程序集註冊到IOC容器並重置容器。
4、插件管理
由於在插件加載的過程當中,插件的配置信息及IPlugin對象都已保存,這裏就比較簡單。經過列表能夠篩選啓動、停用、異常的插件,並能夠直接調用IPlugin對象來啓動、停用、卸載插件。
今天就簡單介紹到這裏,後續的文章會愈來愈細。