asp.net core 3.x 模塊化開發之HostingStartup

咱們但願將一個項目(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,而後再調用它一次

每次寫點東西都語無倫次,哈哈

相關文章
相關標籤/搜索