我們希望將一個(gè)項(xiàng)目(dll)看做一個(gè)模塊/插件,一個(gè)模塊往往需要在應(yīng)用啟動(dòng)時(shí)做一些初始化工作,比如向IOC容器添加一些服務(wù),為應(yīng)用配置對(duì)象添加自己的數(shù)據(jù)源;也希望在應(yīng)用關(guān)閉時(shí)做一些收尾工作,asp.net
          core為我們提供了這種機(jī)制,先來(lái)看看如何使用,再講講原理。

          如何使用?

          1、創(chuàng)建asp.net core 3.1的web應(yīng)用程序,WebApplication6

          2、創(chuàng)建我們的模塊/插件項(xiàng)目,一個(gè)Standard2.1項(xiàng)目叫ClassLibrary2



          3、在插件項(xiàng)目ClassLibrary2中定義實(shí)現(xiàn)IHostingStartup的類(lèi)
          1 public class HostingStartup : IHostingStartup 2 { 3 public void
          Configure(IWebHostBuilder builder) 4 { 5 //向IOC容器添加或替換各種服務(wù) 6
          builder.ConfigureServices((c,b)=> { 7 b.AddSingleton<Class1>(); 8 }); 9 //
          為應(yīng)用配置對(duì)象添加更多數(shù)據(jù)源 10 builder.ConfigureAppConfiguration(c => { 11
          c.AddInMemoryCollection(new Dictionary<string, string> { {"a","tttt" } }); 12
          });
          //處理當(dāng)前模塊的其它初始化操作 13 } 14 }
          5、在插件項(xiàng)目ClassLibrary2中隨便找個(gè)類(lèi)文件中,設(shè)置[assembly:
          HostingStartupAttribute(typeof(ClassLibrary2.HostingStartup))]



          ?6、在主程序WebApplication6中設(shè)置環(huán)境變量,



          除了這樣配置,我們也可以在主程序的Program.main配置主機(jī)時(shí)手動(dòng)覆蓋配置值,以達(dá)到設(shè)置插件關(guān)聯(lián)的程序集的目的,多個(gè)插件程序集用分號(hào)“;”分割
          1 public static IHostBuilder CreateHostBuilder(string[] args) => 2
          Host.CreateDefaultBuilder(args)3 .ConfigureWebHostDefaults(webBuilder =>{ 4
          webBuilder.UseSetting(WebHostDefaults.HostingStartupAssembliesKey,"ClassLibrary2
          "); 5 webBuilder.UseStartup<Startup>(); 6 });
          還可以使用webBuilder.UseSetting(WebHostDefaults.HostingStartupExcludeAssembliesKey,
          "ClassLibrary3");排出一些程序集,不把這些程序集當(dāng)做插件來(lái)加載

          原理是啥?

          程序啟動(dòng)時(shí)會(huì)根據(jù)環(huán)境變量找到對(duì)應(yīng)的插件程序集
          根據(jù)程序集找到關(guān)聯(lián)的?HostingStartupAttribute
          通過(guò)?HostingStartupAttribute拿到插件啟動(dòng)類(lèi)并調(diào)用其Confiure方法
          方法內(nèi)部可以做此插件的初始化工作、向主機(jī)IOC容器注冊(cè)各種服務(wù)、設(shè)置應(yīng)用配置的數(shù)據(jù)源等

          多個(gè)模塊的啟動(dòng)順序是啥?

          按配置的順序加載模塊的,所以最少依賴的模塊應(yīng)該寫(xiě)在前面,這個(gè)設(shè)計(jì)不如abp

          模塊之間如何通訊?

          辦法1、直接引用,配置時(shí)最好將被依賴的模塊放前面

          辦法2、不添加直接引用關(guān)系,而用中間層實(shí)現(xiàn)
          如添加一個(gè)中間項(xiàng)目,定義各種接口,由模塊B來(lái)實(shí)現(xiàn),在模塊B中向容器注冊(cè)自己的服務(wù)。模塊A引用中間類(lèi)庫(kù),直接在使用地方注入接口就ok啦

          應(yīng)用關(guān)閉時(shí)模塊如果做一些收尾工作?


          可以定義一個(gè)應(yīng)用生命周期事件處理程序(實(shí)現(xiàn)IHostedApplicationLifetime),在不同事件中定義此模塊的收尾工作。然后在模塊啟動(dòng)類(lèi)中向IOC注冊(cè)這個(gè)服務(wù)。但這樣有個(gè)問(wèn)題,默認(rèn)的生命周期事件處理程序被我們替換掉了,所以我們的類(lèi)應(yīng)該用構(gòu)造函數(shù)注入IHostedApplicationLifetime,然后再調(diào)用它一次

          每次寫(xiě)點(diǎn)東西都語(yǔ)無(wú)倫次,哈哈

          ?

          友情鏈接
          ioDraw流程圖
          API參考文檔
          OK工具箱
          云服務(wù)器優(yōu)惠
          阿里云優(yōu)惠券
          騰訊云優(yōu)惠券
          京東云優(yōu)惠券
          站點(diǎn)信息
          問(wèn)題反饋
          郵箱:[email protected]
          QQ群:637538335
          關(guān)注微信

                国产精品秘 久久久久久奇米影视 | 淫视频 | 国产一级黄色录像 | 性饥渴欧美老妇XXXXX | 欧美女同一区 |