啟動類選擇
- 2021 年 1 月 9 日
- 筆記
- aspnetcore, 我的程式碼
AspNet Core 多環境的配置方式有一種基於Startup類的選擇。
- webBuilder.UseStartup() //顯式註冊、會靶定Startup.cs
- webBuilder.UseStartup(Assembly.GetExecutingAssembly().FullName); //多環境寫法,根據環境變數選擇基於約定名的類
還有其它兩種方式這裡不細說,配置多環境很明顯不是採用顯式註冊。因此以下測試均採用方式二
嘗試一:不同環境的優先順序
註:.net core中很多基於約定的配置,一般體現在名稱上。例如 Startup{EnvironmentName} 就是一個約定了環境的啟動項


public class Startup { public void ConfigureServices(IServiceCollection services) { IConfigurationRoot root = new ConfigurationBuilder().AddJsonFile("appsettings.Production.json").Build(); } public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { } }
默認


public class StartupProduction { public void ConfigureServices(IServiceCollection services) { IConfigurationRoot root = new ConfigurationBuilder().AddJsonFile("appsettings.Production.json").Build(); } public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { } }
Production環境
結論:很明顯是環境變數優先
嘗試二:不同命名空間下的優先順序


public class Startup { public void ConfigureServices(IServiceCollection services) { IConfigurationRoot root = new ConfigurationBuilder().AddJsonFile("appsettings.Production.json").Build(); } public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { } }
無命名空間


namespace Other { public class Startup { public void ConfigureServices(IServiceCollection services) { IConfigurationRoot root = new ConfigurationBuilder().AddJsonFile("appsettings.Production.json").Build(); } public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { } } }
任意命名空間


namespace AspnetCore { public class Startup { public void ConfigureServices(IServiceCollection services) { IConfigurationRoot root = new ConfigurationBuilder().AddJsonFile("appsettings.Production.json").Build(); } public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { } } }
當前命名空間
結論:無命名空間優先在情理之中,可任意命名空間竟然比當前的優先集要高,有些出人意料
後續
其一:多環境配置方式往小的說,還可以有基於配置文件的選擇傳送門,和基於配置方法的選擇兩種配置方式
其二:其它兩種方式分別是
- webBuilder.Configure(app => {}) //註冊一個DelegateStartup對象
- webBuilder.UseSetting(“StartupAssembly”, Assembly.GetEntryAssembly().FullName) //直接指定法