我們希望將一個專案(dll)看做一個模塊/插件,一個模塊往往需要在應用啟動時做一些初始化作業,比如向IOC容器添加一些服務,為應用配置物件添加自己的資料源;也希望在應用關閉時做一些收尾作業,asp.net core為我們提供了這種機制,先來看看如何使用,再講講原理,
如何使用?
1、創建asp.net core 3.1的web應用程式,WebApplication6
2、創建我們的模塊/插件專案,一個Standard2.1專案叫ClassLibrary2

3、在插件專案ClassLibrary2中定義實作IHostingStartup的類
1 public class HostingStartup : IHostingStartup 2 { 3 public void Configure(IWebHostBuilder builder) 4 { 5 //向IOC容器添加或替換各種服務 6 builder.ConfigureServices((c,b)=> { 7 b.AddSingleton<Class1>(); 8 }); 9 //為應用配置物件添加更多資料源10 builder.ConfigureAppConfiguration(c => {11 c.AddInMemoryCollection(new Dictionary<string, string> { {"a","tttt" } });12 });
//處理當前模塊的其它初始化操作13 }14 }
5、在插件專案ClassLibrary2中隨便找個類檔案中,設定[assembly: HostingStartupAttribute(typeof(ClassLibrary2.HostingStartup))]

6、在主程式WebApplication6中設定環境變數,

除了這樣配置,我們也可以在主程式的Program.main配置主機時手動覆寫配置值,以達到設定插件關聯的程式集的目的,多個插件程式集用分號“;”分割
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");排出一些程式集,不把這些程式集當做插件來加載
原理是啥?
程式啟動時會根據環境變數找到對應的插件程式集
根據程式集找到關聯的 HostingStartupAttribute
通過 HostingStartupAttribute拿到插件啟動類并呼叫其Confiure方法
方法內部可以做此插件的初始化作業、向主機IOC容器注冊各種服務、設定應用配置的資料源等
多個模塊的啟動順序是啥?
按配置的順序加載模塊的,所以最少依賴的模塊應該寫在前面,這個設計不如abp
模塊之間如何通訊?
辦法1、直接參考,配置時最好將被依賴的模塊放前面
辦法2、不添加直接參考關系,而用中間層實作
如添加一個中間專案,定義各種介面,由模塊B來實作,在模塊B中向容器注冊自己的服務,模塊A參考中間類別庫,直接在使用地方注入介面就ok啦
應用關閉時模塊如果做一些收尾作業?
可以定義一個應用生命周期事件處理程式(實作IHostedApplicationLifetime),在不同事件中定義此模塊的收尾作業,然后在模塊啟動類中向IOC注冊這個服務,但這樣有個問題,默認的生命周期事件處理程式被我們替換掉了,所以我們的類應該用建構式注入IHostedApplicationLifetime,然后再呼叫它一次
每次寫點東西都語無倫次,哈哈
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/73269.html
標籤:.NET Core
