一个.NET Core下的开源插件框架Pluginfactory
插件模式歷史悠久,各種中大型軟件基本上都會實現(xiàn)插件機制,以此支持功能擴展,從開發(fā)部署層面,插件機制也可實現(xiàn)功能解耦,對于并行開發(fā)、項目部署、功能定制等都有比較大的優(yōu)勢。
????在.NET Core下,一般我們基于.NET Core擴展庫進(jìn)行開發(fā),通常使用依賴注入、配置、設(shè)置(Options)等機制,如果將插件模式與依賴注入、配置、設(shè)置進(jìn)行結(jié)合,將可以提供非常靈活的擴展機制?;诖?#xff0c;我們實現(xiàn)了一個開源的插件框架,本文將進(jìn)行簡單的介紹。
一、PluginFactory插件庫
項目地址:
Gitee:https://gitee.com/WuYeCai/pluginfactory
Github:https://github.com/xfrogcn/Xfrogcn.PluginFactory
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接口,負(fù)責(zé)從指定位置加載插件程序集
插件工廠:對應(yīng)IPluginFactory接口,負(fù)責(zé)插件的實例化及插件的啟動和停止
插件:對應(yīng)IPlugin接口,所有插件需要實現(xiàn)此接口,實現(xiàn)插件的啟動及停止機制
可初始化插件:對應(yīng)ISupportInitPlugin接口,通過此接口可以在依賴注入Provider構(gòu)建之前向容器注入自定義的服務(wù)
可配置插件:對應(yīng)ISupportConfigPlugin接口,通過此接口可將插件配置與.NET Core的配置(Configuration)及設(shè)置(Options)機制集合
三、使用向?qū)?/h2>
????示例項目可參考:Xfrogcn.PluginFactory.Example?Gitee地址?Github地址
1)安裝
?在主程序項目中添加Xfrogcn.PluginFactory包
?在插件項目中添加Xfrogcn.PluginFactory.Abstractions包
2)在主程序中啟用
????可通過以下兩種方式來啟用插件庫,一是通過在Host層級的Use機制以及在依賴注入IServiceCollection層級的Add機制,以下分別說明:
1. 通過IHostBuilder的UsePluginFactory方法啟用插件庫
????UsePluginFactory具有多個重載版本,詳細(xì)請查看API文檔
默認(rèn)配置下,將使用程序運行目錄下的Plugins目錄作為插件程序集目錄, 使用宿主配置文件作為插件配置文件(通常為appsettings.json)
你也可以通過使用帶有?Assembly?或?IEnumerable?參數(shù)的版本直接傳入插件所在的程序集
2. 通過IServiceCollection的AddPluginFactory方法啟用插件庫
????AddPluginFactory具有多個重載版本,詳細(xì)請查看API文檔
默認(rèn)配置下,將使用程序運行目錄下的Plugins目錄作為插件程序集目錄
????注意:?AddPluginFactory方法不會使用默認(rèn)的配置文件作為插件配置,你需要顯式地傳入IConfiguration, 如果是在 ASP.NET Core 環(huán)境中,你可以在Startup類中直接獲取到
3)編寫插件
插件是實現(xiàn)了IPlugin接口的類,在插件庫中也提供了PluginBase基類,一般從此類繼承即可。標(biāo)準(zhǔn)插件具有啟動和停止方法,通過IPluginFactory進(jìn)行控制。
要編寫插件,一般遵循以下步驟:
創(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),插件的啟動及停止將自動跟隨宿主進(jìn)行,如果未使用宿主,可通過獲取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é)點進(jìn)行配置,此節(jié)點下配置將會被合并到插件配置中,可通過PluginOptions進(jìn)行訪問。
7)插件化 ASP.NET Core
????要讓 ASP.NET Core 獲取得到插件中的控制器,你只需要在插件的初始化方法Init中,向MVC注入插件程序集:
總結(jié)
以上是生活随笔為你收集整理的一个.NET Core下的开源插件框架Pluginfactory的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于阿里云日志服务快速打造简版业务监控看
- 下一篇: 谈谈.NET Core IService