故事背景
一般情況下ASP.Net Core
項目配置可以直接在appsetting.json
中添加,也可以在項目中添加新的配置文件。但如果想和其他項目一起實現配置文件通用呢?我們可以用絕對定位去訪問配置文件,但可能會遇到訪問權限之類的問題;我們也可以通過開發配置文件訪問接口來實現,但太麻煩了,而且不可能加了一個配置我就去改一次訪問代碼。那么,官方有木有提供什么方案呢?
有的,微軟官方提供了允許ASP.Net Core
承載外部程序集功能,實現邏輯就是通過外部類實現IHostingStartup
接口,在啟動時從外部程序集向應用添加增強功能。針對我們前面提到的外部項目向ASP.Net Core
中添加配置文件需求是如何實現的呢?無非ASP.Net Core
在啟動時執行啟動依賴程序集
中指定特性的類中的Configure
方法,而在該方法下將需要共享的配置添加到ASP.Net Core
運行時中。
基本流程
外部類庫程序集
-
創建類庫項目
HostingStartupLibrary
。 -
打開
Nuget
管理界面,依次安裝Microsoft.AspNetCore.Hosting(2.2.7)
、Microsoft.Extensions.Configuration(3.0.0)
包。 -
新增承載類
ServiceKeyInjection
,實現IHostingStartup
接口的Configure
方法,添加部分數據到內存中。using System.Collections.Generic; using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.Configuration; [assembly: HostingStartup(typeof(HostingStartupLibrary.ServiceKeyInjection))] namespace HostingStartupLibrary { public class ServiceKeyInjection : IHostingStartup { var dict = new Dictionary<string, string>() { {"DevAccount_FromLibrary", "DEV_1111111-1111"} }; //配置方法一:主項目配置優先加載,再加載當前配置。 builder.ConfigureAppConfiguration(config => { config.AddInMemoryCollection(dict); }); //配置方法二:當前配置優先加載,再加載主項目配置。 //var builderConfig = new ConfigurationBuilder().AddInMemoryCollection(dict).Build(); //builder.UseConfiguration(builderConfig); } }
ASP.Net Core主項目
- 添加對類庫項目
HostingStartupLibrary
的引用,也可以直接引用類庫項目編譯后的dll文件。 - 配置
主機啟動依賴程序集
,配置方法有兩種:主機配置與環境變量配置。若同時設置了主機配置與環境變量配置,則實際采用主機配置控制。-
主機配置
- 打開
Program.cs
,找到CreateHostBuilder
方法。 - 在
UseStartup<Startup>()
之前,webBuilder
之后添加UseSetting(WebHostDefaults.HostingStartupAssembliesKey, "HostingStartupLibrary")
,HostingStartupLibrary
即為外部程序集的名稱。
- 打開
-
環境變量配置
- 打開
launchSettings.json
文件; - 找到所有的
environmentVariables
節點,在該節點下面添加ASPNETCORE_HOSTINGSTARTUPASSEMBLIES
,值為HostingStartupLibrary
,即外部程序集名稱。
- 打開
-
- 配置獲取測試。
- 通過構造函數注入,將
IConfiguration
注入到控制器中。 - 通過
config["DevAccount_FromLibrary"]
形式獲取配置數據,判斷是否正確。
- 通過構造函數注入,將