c# - 如何在 ASP .NET Core 中初始化主机之前读取配置设置?
问题描述
在初始化应用程序主机之前,我需要从应用程序的配置中读取一些设置来设置其他一些东西。
在 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.xWebHost
已被弃用,取而代之的是 .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 服务。
为了在设置主机之前获取配置,我想出了以下方法:
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;
}
本质上,我编写了一个设置 aConfigurationBuilder
并返回它的方法,以便我可以重用相同的配置。这在实践中有效,但我两次构建相同的配置。
在设置 Host 之前,是否有更简单/更正确的方法(适用于 HTTP 工作负载和非 HTTP 工作负载)来构建和重用配置?
解决方案
您可以清除添加的默认源,然后添加带有扩展方法CreateDefaultBuilder
的预构建。IConfiguration
AddConfiguration
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)
.ConfigureAppConfiguration(builder =>
{
builder.Sources.Clear();
builder.AddConfiguration(configuration);
})
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
})
.Build();
//...
}
推荐阅读
- .htaccess - 如何做“如果修改后”
- html - 关于我的 CSS 网格中奇怪对象放置的问题
- git - Git:将本地分支复制到另一个本地目录
- python - Tensorflow 无法确定张量大小为何发生变化,无法直接调试
- caching - 无需任何 setState 调用即可重建 build 方法的内容
- windows - Windows 上的 PN532 HSU 中间读取
- r - 对于所需条件,在 R 中使用 for 循环未获得所需的结果
- javascript - 如何使用把手渲染 JSON 数组
- excel - 要求用户检查选项按钮
- android - Google play 登录在我的应用程序中不起作用