我的asp.net核心应用程序中有3个名为appsettings.[int/stg/prod].json
的文件:
{
"EmailForFailedNonCrucial":
{
"Email": "royin...",
"Subject": "...",
"Body": "...",
"ConnectionString": "Staging-Connection-String"
},
"Servers": [
{
"Name": "aaa",
"Services": [
...
]
},
{
"Name": "bbb",
"Services": [
...
]
}]
}
每个部分在C#类中都有一个对应的部分。 (用于IOptions
)。
对于每个环境,我都有该文件的3个版本:
我可以通过以下方式使用它:
public static IConfigurationRoot ConfigureConfiguration()
{
return new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile($"appsettings.json", optional: true, reloadOnChange: true)
.AddJsonFile($@"appsettings.{Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT")}.json", optional: true)
.AddEnvironmentVariables()
.Build();
}
但是在各个环境中应该唯一的 事物是ConnectionString
。
Servers
部分对于所有环境都是相同的。
问题:
在所有3个文件中复制Servers
似乎很奇怪。
如何完成一次(继承?)指定,并且每个环境只有EmailForFailedNonCrucial
?
答案 0 :(得分:2)
只需将servers
部分放在根目录appsettings.json中,将其从其他目录中删除,则默认情况下,应将servers
配置添加到所有其他目录中。
更多阅读内容:Configuration in Core
答案 1 :(得分:0)
.NET Core中的配置设置被视为键/值字典中的值。来自多个提供程序的值全部合并在一起,新值替换了旧值。文件名没有特殊意义,仅调用顺序很重要。
这在Essential .NET - Configuration in .NET Core和Configuration in ASP.NET Core中有解释。尽管有名称,配置库也可用于Full Framework应用程序。
加载时,设置将转换为键/值对。该文件的内容:
{
"section0": {
"key0": "value",
"key1": "value"
},
"section1": {
"key0": "value",
"key1": "value"
}
}
被平整为4对,其密钥为:
- section0:key0
- section0:key1
- section1:key0
- section1:key1
如果另一个文件或提供程序产生相同的密钥,则它可以覆盖先前的设置。 SomeotherFile.json
可以通过仅为此键指定一个新值来替换section1:key0
:
{
"section1": {
"key0": "value",
}
}
无需重复设置。
您可以通过将所有通用设置放入一个文件,并从另一文件或提供程序读取特定于环境的设置,从而为每个环境指定不同的设置。
var envSpecificFile=...
return new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile($"appsettings.json", optional: true, reloadOnChange: true)
.AddJsonFile(envSpecificFile, optional: true)
.AddEnvironmentVariables()
.Build();
使用appsettings.prod.json
只是一个约定。读取特定的环境变量来确定环境也只是一个约定。
ASP.NET Core项目的通用约定是使用ASPNETCORE_ENVIRONMENT
环境变量:
var env=Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");
var envSpecificFile = $"appsettings.{env}.json";
环境也很容易来自命令行参数。这样可以在质量检查服务器上测试不同的配置,例如:
string env;
if(args.Length>0)
{
env=args[0];
}
else
{
env=Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");
}
这些设置不需要来自JSON文件,它们可以轻松地来自字典,数据库或集中式配置服务。
例如:
var dictSettings = new Dictionary<string, string>()
{
["section0:key1"] = args[1],
};
可用于覆盖section0:key1
值:
return new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.AddJsonFile($"appsettings.{env}.json", optional: true)
.AddInMemoryCollection(dictSettings)
.AddEnvironmentVariables()
.Build();
该示例有些人为。字典通常用于提供默认值,因此通常在其他提供者之前添加字典。
.AddInMemoryCollection(defaultSettings)
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.AddJsonFile($"appsettings.{env}.json", optional: true)
.AddEnvironmentVariables()