Настройки конфигурации в .NET Core обрабатываются как значения в словаре ключ / значение.Значения от нескольких поставщиков объединяются вместе, а более новые значения заменяют более старые.Имена файлов не имеют особого значения, важен только порядок вызовов.
Это объясняется в Essential .NET - Конфигурация в .NET Core и Конфигурация в 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";
Среда также может легко прийти из аргумента командной строки.Это позволило бы тестировать различные конфигурации на сервере QA, например:
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()