【发布时间】:2020-02-20 04:16:52
【问题描述】:
在初始化应用程序主机之前,我需要从应用程序的配置中读取一些设置来设置其他一些东西。
在 ASP .NET Core 2.x 中,在初始化应用程序主机之前读取设置我曾经执行以下操作:
public static void Main(string[] args)
{
//...
var configuration = new ConfigurationBuilder()
.AddEnvironmentVariables()
.AddCommandLine(args)
.AddJsonFile("appsettings.json")
.Build();
//Do something useful with the configuration...
var host = WebHost.CreateDefaultBuilder()
.UseStartup<Startup>()
.UseConfiguration(configuration)
.Build();
//...
}
在 ASP .NET Core 3.x 中 WebHost has been deprecated in favor of .NET Generic Host.
.NET 通用主机只有 .ConfigureHostConfiguration() 和 .ConfigureAppConfiguration() 不将构建配置作为参数,而是仅接受用于设置配置的委托。
对于 HTTP 工作负载,您仍然可以使用方法 .UseConfiguration() 让 IWebHostBuilder 公开它,并且与以前基本相同:
public static void Main(string[] args)
{
//...
var configuration = new ConfigurationBuilder()
.AddEnvironmentVariables()
.AddCommandLine(args)
.AddJsonFile("appsettings.json")
.Build();
//Do something useful with the configuration...
var host = Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>()
.UseConfiguration(configuration);
})
.Build();
//...
}
但这仅适用于 HTTP 工作负载,不适用于 Worker Services.
为了在设置主机之前获取配置,我想出了以下方法:
public static void Main(string[] args)
{
//...
var configuration = ConfigureConfigurationBuilder(args)
.Build();
//Do something useful with the configuration...
var host = Host.CreateDefaultBuilder(args)
.ConfigureAppConfiguration(builder => ConfigureConfigurationBuilder(args, builder))
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
})
.Build();
//...
}
public static IConfigurationBuilder ConfigureConfigurationBuilder(string[] args, IConfigurationBuilder configurationBuilder = null)
{
configurationBuilder ??= new ConfigurationBuilder();
configurationBuilder
.AddEnvironmentVariables()
.AddCommandLine(args)
.AddJsonFile("appsettings.json");
return configurationBuilder;
}
基本上我已经编写了一个设置ConfigurationBuilder 并返回它的方法,这样我就可以重用相同的配置。这在实践中有效,但我构建了两次相同的配置。
有没有更简单/更正确的方法(适用于 HTTP 工作负载和非 HTTP 工作负载)在设置主机之前构建和重用配置?
【问题讨论】:
-
恐怕不会,因为您在初始化主机之前无法获得配置。
-
@XingZou 事实上,我可以在设置主机之前设置配置,唯一的问题是我不能再次重复使用该配置,迫使我付出代价来初始化配置两次
标签: c# asp.net-core asp.net-core-3.0