<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          一個.NET Core下的開源插件框架

          共 5631字,需瀏覽 12分鐘

           ·

          2021-04-06 14:20


          轉(zhuǎn)自:xfrog
          cnblogs.com/xfrog/p/13926438.html

          前言


          插件模式歷史悠久,各種中大型軟件基本上都會實現(xiàn)插件機(jī)制,以此支持功能擴(kuò)展,從開發(fā)部署層面,插件機(jī)制也可實現(xiàn)功能解耦,對于并行開發(fā)、項目部署、功能定制等都有比較大的優(yōu)勢。


          在.NET Core下,一般我們基于.NET Core擴(kuò)展庫進(jìn)行開發(fā),通常使用依賴注入、配置、設(shè)置(Options)等機(jī)制,如果將插件模式與依賴注入、配置、設(shè)置進(jìn)行結(jié)合,將可以提供非常靈活的擴(kuò)展機(jī)制。基于此,我們實現(xiàn)了一個開源的插件框架,本文將進(jìn)行簡單的介紹。


          PluginFactory插件庫


          1、項目地址


          Gitee:https://gitee.com/WuYeCai/pluginfactory


          Github:https://github.com/xfrogcn/Xfrogcn.PluginFactory


          2、Nuget包


          Xfrogcn.PluginFactory 實現(xiàn)包,在主項目中引用


          Xfrogcn.PluginFactory.Abstractions 抽象包,在插件項目中引用,或者你可以完全重新實現(xiàn)自己的插件機(jī)制


          3、主要功能


          • 插件的自動載入


          • 通過插件的初始化接口可讓插件控制主應(yīng)用的依賴注入


          • 插件的啟動及停止,此機(jī)制可與.NET Core的Hosting擴(kuò)展結(jié)合,在宿主啟動時自動啟動插件


          • 抽象分離,你可以通過實現(xiàn)Xfrogcn.PluginFactory.Abstractions中的相關(guān)接口來完全實現(xiàn)自己的插件載入、啟動等機(jī)制


          • 與.NET Core配置、設(shè)置、宿主等完美融合


          • 支持插件依賴程序集的多版本載入


          主要概念


          • 插件載入器:對應(yīng)IPluginLoader接口,負(fù)責(zé)從指定位置加載插件程序集


          • 插件工廠:對應(yīng)IPluginFactory接口,負(fù)責(zé)插件的實例化及插件的啟動和停止


          • 插件:對應(yīng)IPlugin接口,所有插件需要實現(xiàn)此接口,實現(xiàn)插件的啟動及停止機(jī)制


          • 可初始化插件:對應(yīng)ISupportInitPlugin接口,通過此接口可以在依賴注入Provider構(gòu)建之前向容器注入自定義的服務(wù)


          • 可配置插件:對應(yīng)ISupportConfigPlugin接口,通過此接口可將插件配置與.NET Core的配置(Configuration)及設(shè)置(Options)機(jī)制集合


          使用向?qū)?/span>


          示例項目可參考:Xfrogcn.PluginFactory.Example 


          Gitee地址:https://gitee.com/WuYeCai/Xfrogcn.PluginFactory.Example


          Github地址:https://github.com/xfrogcn/Xfrogcn.PluginFactory.Example


          安裝


          在主程序項目中添加Xfrogcn.PluginFactory包


          dotnet
          dotnet add package Xfrogcn.PluginFactory


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


          dotnet
          dotnet add package Xfrogcn.PluginFactory.Abstractions


          在主程序中啟用


          可通過以下兩種方式來啟用插件庫,一是通過在Host層級的Use機(jī)制以及在依賴注入IServiceCollection層級的Add機(jī)制,以下分別說明:


          通過IHostBuilder的UsePluginFactory方法啟用插件庫


          var builder = Host.CreateDefaultBuilder(args);
          builder.UsePluginFactory();


          UsePluginFactory具有多個重載版本,詳細(xì)請查看API文檔

          默認(rèn)配置下,將使用程序運行目錄下的Plugins目錄作為插件程序集目錄, 使用宿主配置文件作為插件配置文件(通常為appsettings.json)

          你也可以通過使用帶有 Assembly 或 IEnumerable<Assembly> 參數(shù)的版本直接傳入插件所在的程序集


          通過IServiceCollection的AddPluginFactory方法啟用插件庫


          var builder = Host.CreateDefaultBuilder(args)
          .ConfigureServices((hostContext, services) =>
          {
          services.AddPluginFactory();
          });


          AddPluginFactory具有多個重載版本,詳細(xì)請查看API文檔

          默認(rèn)配置下,將使用程序運行目錄下的Plugins目錄作為插件程序集目錄


          注意:AddPluginFactory方法不會使用默認(rèn)的配置文件作為插件配置,你需要顯式地傳入IConfiguration, 如果是在 ASP.NET Core 環(huán)境中,你可以在Startup類中直接獲取到


          編寫插件


          插件是實現(xiàn)了IPlugin接口的類,在插件庫中也提供了PluginBase基類,一般從此類繼承即可。標(biāo)準(zhǔn)插件具有啟動和停止方法,通過IPluginFactory進(jìn)行控制。


          要編寫插件,一般遵循以下步驟:


          1、創(chuàng)建插件項目(.NET Core 類庫),如TestPluginA


          2、添加Xfrogcn.PluginFactory.Abstractions包


          nuget
          dotnet add package Xfrogcn.PluginFactory.Abstractions


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


          public class Plugin : PluginBase
          {
          public override Task StartAsync(IPluginContext context)
          {
          Console.WriteLine("插件A已啟動");
          return base.StartAsync(context);
          }
          public override Task StopAsync(IPluginContext context)
          {
          Console.WriteLine("插件A已停止");
          return base.StopAsync(context);
          }
          }


          啟動或停止方法中可通過context中的ServiceProvider獲取注入服務(wù)


          4、通過PluginAttribute特性設(shè)置插件的元數(shù)據(jù)


          [Plugin(Alias = "PluginA", Description = "測試插件")]
          public class Plugin : PluginBase
          {}


          插件元數(shù)據(jù)以及插件載入的插件列表信息可以通過IPluginLoader.PluginList獲取


          插件啟動


          IPluginFactory本身實現(xiàn)了.NET Core擴(kuò)展庫的IHostedService機(jī)制,故如果你是在宿主環(huán)境下使用,如(ASP.NET Core),插件的啟動及停止將自動跟隨宿主進(jìn)行

          如果未使用宿主,可通過獲取IPluginFactory實例調(diào)用相應(yīng)方法來完成


          // 手動啟動
          var pluginFactory = provider.GetRequiredService<IPluginFactory>();
          await pluginFactory.StartAsync(default);
          await pluginFactory.StopAsync(default);


          編寫支持初始化的插件


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


          [Plugin(Alias = "PluginA", Description = "測試插件")]
          public class Plugin : PluginBase, ISupportInitPlugin
          {
          public void Init(IPluginInitContext context)
          {
          // 注入服務(wù)
          //context.ServiceCollection.TryAddScoped<ICustomerService>();
          }
          }


          使用插件配置


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


          appsettings.json
          {
          "Plugins": {
          "PluginA": {
          "TestConfig": "Hello World"
          },
          }
          }


          擴(kuò)展PluginA實現(xiàn)配置:


          1、定義配置類,如PluginOptions


          public class PluginOptions
          {
          public string TestConfig { get; set; }
          }


          2、實現(xiàn)插件


          [Plugin(Alias = "PluginA", Description = "測試插件")]
          public class Plugin : SupportConfigPluginBase<PluginOptions>, ISupportInitPlugin
          {
          public Plugin(IOptionsMonitor<PluginOptions> options) : base(options)
          {
          }
          public void Init(IPluginInitContext context)
          {
          // 注入服務(wù)//context.ServiceCollection.TryAddScoped<ICustomerService>();
          Console.WriteLine($"Init 插件配置:{Options.TestConfig}");
          }
          public override Task StartAsync(IPluginContext context)
          {
          Console.WriteLine("插件A已啟動");
          Console.WriteLine($"StartAsync 插件配置:{Options.TestConfig}");
          return base.StartAsync(context);
          }
          public override Task StopAsync(IPluginContext context)
          {
          Console.WriteLine("插件A已停止");
          return base.StopAsync(context);
          }
          }


          注意:在插件初始化方法中也可使用注入的配置


          3、跨插件配置


          有些配置可能需要在多個插件中共享,此時你可通過Plugins下的_Share節(jié)點進(jìn)行配置,此節(jié)點下配置將會被合并到插件配置中,可通過PluginOptions進(jìn)行訪問。 

          appsettings.json
          {
          "Plugins": {
          "PluginA": {
          },
          "_Share": {
          "TestConfig": "Hello World"
          }
          }
          }


          插件化 ASP.NET Core


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


          context.ServiceCollection.AddMvcCore()
          .AddApplicationPart(typeof(Plugin).Assembly);


          - EOF -

          如果你也有好的開源項目,歡迎推薦!

          微信號聯(lián)系:westbrook12000(ps:加好友請備注“開源”)

          回復(fù) 【小程序】獲取15套小程序源碼【學(xué)習(xí)+實戰(zhàn)+賺錢】
          回復(fù) 【關(guān)閉】學(xué)關(guān)閉微信朋友圈廣告
          回復(fù) 【實戰(zhàn)】獲取20套實戰(zhàn)源碼
          回復(fù) 【福利】獲取最新微信支付有獎勵
          回復(fù) 【被刪】學(xué)查看你哪個好友刪除了你巧
          回復(fù) 【訪客】學(xué)微信查看朋友圈訪客記錄
          回復(fù) 【python】學(xué)微獲取全套0基礎(chǔ)Python知識手冊

          副業(yè)剛需,公眾號1萬粉絲流量主能賺多少錢?


          @程序員,這款自動搶微信紅包真快啊!


          瀏覽 34
          點贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  中文字幕久久成人 | 男女拍拍拍拍 | 欧美一级颜情免费视频 | 无码 人妻 精 | 影音先锋男人网站 |