一個.Net Core的開源框架
插件模式歷史悠久,各種中大型軟件基本上都會實現(xiàn)插件機制,以此支持功能擴展,從開發(fā)部署層面,插件機制也可實現(xiàn)功能解耦,對于并行開發(fā)、項目部署、功能定制等都有比較大的優(yōu)勢。
? ?在.NET Core下,一般我們基于.NET Core擴展庫進行開發(fā),通常使用依賴注入、配置、設(shè)置(Options)等機制,如果將插件模式與依賴注入、配置、設(shè)置進行結(jié)合,將可以提供非常靈活的擴展機制?;诖?,我們實現(xiàn)了一個開源的插件框架,本文將進行簡單的介紹。
一、PluginFactory插件庫
項目地址:
Gitee
Github
Nuget包:
Xfrogcn.PluginFactory 實現(xiàn)包,在主項目中引用
Xfrogcn.PluginFactory.Abstractions 抽象包,在插件項目中引用,或者你可以完全重新實現(xiàn)自己的插件機制
主要功能:
插件的自動載入
通過插件的初始化接口可讓插件控制主應(yīng)用的依賴注入
插件的啟動及停止,此機制可與.NET Core的Hosting擴展結(jié)合,在宿主啟動時自動啟動插件
抽象分離,你可以通過實現(xiàn)Xfrogcn.PluginFactory.Abstractions中的相關(guān)接口來完全實現(xiàn)自己的插件載入、啟動等機制
與.NET Core配置、設(shè)置、宿主等完美融合
支持插件依賴程序集的多版本載入
二、主要概念
插件載入器:對應(yīng)IPluginLoader接口,負責(zé)從指定位置加載插件程序集
插件工廠:對應(yīng)IPluginFactory接口,負責(zé)插件的實例化及插件的啟動和停止
插件:對應(yīng)IPlugin接口,所有插件需要實現(xiàn)此接口,實現(xiàn)插件的啟動及停止機制
可初始化插件:對應(yīng)ISupportInitPlugin接口,通過此接口可以在依賴注入Provider構(gòu)建之前向容器注入自定義的服務(wù)
可配置插件:對應(yīng)ISupportConfigPlugin接口,通過此接口可將插件配置與.NET Core的配置(Configuration)及設(shè)置(Options)機制集合
三、使用向?qū)?/p>
? ?示例項目可參考:Xfrogcn.PluginFactory.Example Gitee地址 Github地址
1)安裝
? ?在主程序項目中添加Xfrogcn.PluginFactory包

? ?在插件項目中添加Xfrogcn.PluginFactory.Abstractions包

2)在主程序中啟用
? ?可通過以下兩種方式來啟用插件庫,一是通過在Host層級的Use機制以及在依賴注入IServiceCollection層級的Add機制,以下分別說明:
1. 通過IHostBuilder的UsePluginFactory方法啟用插件庫

UsePluginFactory具有多個重載版本,詳細請查看API文檔 默認配置下,將使用程序運行目錄下的Plugins目錄作為插件程序集目錄, 使用宿主配置文件作為插件配置文件(通常為appsettings.json) 你也可以通過使用帶有 Assembly 或 IEnumerable 參數(shù)的版本直接傳入插件所在的程序集
2. 通過IServiceCollection的AddPluginFactory方法啟用插件庫

AddPluginFactory具有多個重載版本,詳細請查看API文檔 默認配置下,將使用程序運行目錄下的Plugins目錄作為插件程序集目錄
注意: AddPluginFactory方法不會使用默認的配置文件作為插件配置,你需要顯式地傳入IConfiguration, 如果是在 ASP.NET Core 環(huán)境中,你可以在Startup類中直接獲取到
3)編寫插件
插件是實現(xiàn)了IPlugin接口的類,在插件庫中也提供了PluginBase基類,一般從此類繼承即可。標(biāo)準(zhǔn)插件具有啟動和停止方法,通過IPluginFactory進行控制。
要編寫插件,一般遵循以下步驟:
創(chuàng)建插件項目(.NET Core 類庫),如TestPluginA
添加Xfrogcn.PluginFactory.Abstractions包

創(chuàng)建插件類,如Plugin,從PluginBase繼承

啟動或停止方法中可通過context中的ServiceProvider獲取注入服務(wù)
通過PluginAttribute特性設(shè)置插件的元數(shù)據(jù)

插件元數(shù)據(jù)以及插件載入的插件列表信息可以通過IPluginLoader.PluginList獲取
4)插件啟動
IPluginFactory本身實現(xiàn)了.NET Core擴展庫的IHostedService機制,故如果你是在宿主環(huán)境下使用,如(ASP.NET Core),插件的啟動及停止將自動跟隨宿主進行,如果未使用宿主,可通過獲取IPluginFactory實例調(diào)用相應(yīng)方法來完成.

5)編寫支持初始化的插件
在很多場景,我們需要在插件中控制宿主的依賴注入,如注入新的服務(wù)等,這時候我們可通過實現(xiàn)支持初始化的插件(ISupportInitPlugin)來實現(xiàn),該接口的Init方法將在依賴注入構(gòu)建之前調(diào)用,通過方法參數(shù)IPluginInitContext中ServiceCollection可以控制宿主注入容器。

6)使用插件配置
插件支持 .NET Core 擴展庫中的Options及Configuration機制,你只需要從SupportConfigPluginBase類繼承實現(xiàn)插件即可,其中TOptions泛型為插件的配置類型。插件配置自動從宿主配置或啟用插件工廠時傳入的配置中獲取,插件配置位于配置下的Plugins節(jié)點,該節(jié)點下以插件類名稱或插件別名(通過PluginAttribute特性指定)作為鍵名,此鍵之下為插件的配置,如以下配置文件:

擴展PluginA實現(xiàn)配置:
定義配置類,如PluginOptions

實現(xiàn)插件

注意:在插件初始化方法中也可使用注入的配置
跨插件配置
有些配置可能需要在多個插件中共享,此時你可通過Plugins下的_Share節(jié)點進行配置,此節(jié)點下配置將會被合并到插件配置中,可通過PluginOptions進行訪問。

7)插件化 ASP.NET Core
? ?要讓 ASP.NET Core 獲取得到插件中的控制器,你只需要在插件的初始化方法Init中,向MVC注入插件程序集:
