啟動類選擇

AspNet Core 多環境的配置方式有一種基於Startup類的選擇。

  1. webBuilder.UseStartup() //顯式註冊、會靶定Startup.cs
  2. 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)
        {
        }
    }
}

當前命名空間

結論:無命名空間優先在情理之中,可任意命名空間竟然比當前的優先集要高,有些出人意料

後續

其一:多環境配置方式往小的說,還可以有基於配置文件的選擇傳送門,和基於配置方法的選擇兩種配置方式

其二:其它兩種方式分別是

  1. webBuilder.Configure(app => {}) //註冊一個DelegateStartup對象
  2. webBuilder.UseSetting(“StartupAssembly”, Assembly.GetEntryAssembly().FullName) //直接指定法