咱們但願將一個項目(dll)看作一個模塊/插件,一個模塊每每須要在應用啓動時作一些初始化工做,好比向IOC容器添加一些服務,爲應用配置對象添加本身的數據源;也但願在應用關閉時作一些收尾工做,asp.net core爲咱們提供了這種機制,先來看看如何使用,再講講原理。web
一、建立asp.net core 3.1的web應用程序,WebApplication6asp.net
二、建立咱們的模塊/插件項目,一個Standard2.1項目叫ClassLibrary2函數
三、在插件項目ClassLibrary2中定義實現IHostingStartup的類ui
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 }
五、在插件項目ClassLibrary2中隨便找個類文件中,設置[assembly: HostingStartupAttribute(typeof(ClassLibrary2.HostingStartup))]spa
六、在主程序WebApplication6中設置環境變量,.net
除了這樣配置,咱們也能夠在主程序的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容器註冊各類服務、設置應用配置的數據源等code
按配置的順序加載模塊的,因此最少依賴的模塊應該寫在前面,這個設計不如abp對象
辦法一、直接引用,配置時最好將被依賴的模塊放前面
辦法二、不添加直接引用關係,而用中間層實現
如添加一箇中間項目,定義各類接口,由模塊B來實現,在模塊B中向容器註冊本身的服務。模塊A引用中間類庫,直接在使用地方注入接口就ok啦
能夠定義一個應用生命週期事件處理程序(實現IHostedApplicationLifetime),在不一樣事件中定義此模塊的收尾工做。而後在模塊啓動類中向IOC註冊這個服務。但這樣有個問題,默認的生命週期事件處理程序被咱們替換掉了,因此咱們的類應該用構造函數注入IHostedApplicationLifetime,而後再調用它一次
每次寫點東西都語無倫次,哈哈