【发布时间】:2021-12-24 02:22:59
【问题描述】:
我希望我的 .Net Core 5 控制台应用程序根据 DOTNET_ENVIRONMENT 环境变量从相应的 appsettings 文件中选择设置。我正在通过在 Visual Studio 2019 调试器中运行它并从我的 launchSettings.json 文件中获取环境来对此进行测试。
在 .Net Core 5 控制台应用程序中,我有 4 个“appsettings”文件:
- appsettings.json
- appsettings.Development.json
- appsettings.Staging.json
- appsettings.Production.json
每个文件的属性都设置为 Build Action : Content 和 Copy to Output Directory: Copy if newer.
在我的 launchSettings.json 中,我将环境设置为“Staging”,如下所示:
{
"profiles": {
"MyAppName": {
"commandName": "Project",
"dotnetRunMessages": "true",
"environmentVariables": {
"DOTNET_ENVIRONMENT": "Staging"
}
}
}
}
我需要在 Program.cs 的“Main”方法中访问我的配置,因此在该类中,我在静态构造函数中设置了一个模块级字符串变量“_environment”:
_environment = Environment.GetEnvironmentVariable("DOTNET_ENVIRONMENT");
这行得通;值“Staging”被加载到变量 _environment。
然后我将我的配置加载到一个静态变量中,如下所示:(编辑——这是我的错误,假设这个静态属性在静态 ctor 之后加载。实际上它在静态 ctor 之前加载。这意味着 _environment 变量不是set,这意味着我的环境特定的 appsettings 文件从未加载)。
private static IConfiguration Configuration { get; } = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.AddJsonFile($"appsettings.{_environment}.json", optional: true, reloadOnChange: true)
.AddEnvironmentVariables()
.Build();
当我随后检查配置的内容时,我发现它只是从 appsettings.json 加载值。它没有从 appsettings.Staging.json 加载值。 我正在寻找的具体值是“ConnectionStrings”。这是 appsettings.json 中 ConnectionStrings 部分的外观:
"ConnectionStrings": {
"ConnectionStringName": "Data Source=SqlDevelopment; Initial Catalog=MyTable; Integrated Security=SSPI;",
}
这就是同一部分在 appsettings.Staging.json 中的外观:
"ConnectionStrings": {
"ConnectionStringName": "Data Source=SqlStaging; Initial Catalog=MyTable; Integrated Security=SSPI;",
}
但是当我从 Configuration 中读取 DataSource 时,它始终是“SqlDevelopment”,即使环境是 Staging。
尝试失败后,我尝试加载这4个Nuget包,但没有效果:
- Microsoft.Extensions.Configuration
- Microsoft.Extensions.Configuration.Binder
- Microsoft.Extensions.Configuration.EnvironmentVariables
- Microsoft.Extensions.Configuration.Json
我错过了什么?
【问题讨论】:
标签: .net-core console-application .net-5 appsettings