При использовании файлов appsettings.json, относящихся к среде, есть ли способ, для каждой настройки, заменить, а не добавить?
Я обнаружил, что при настройке консольного приложения с использованием .NET Generic Host и нескольких appsettings.json
файлы, содержимое последних файлов перезаписывает содержимое более ранних файлов (в отношении регистрации) в памяти, но они не заменяют его.
Позвольте мне объяснить, я опубликую код, который воспроизводит это ниже, но сначала два файла json:
appsettings.json
загружен первым{ "Folders": [ "main-1", "main-2" ] }
appsettings.debug.json
, загружен второй{ "Folders": [ "debug-1" ] }
При загрузке этого в объект параметров, я ожидал бы, что параметр отладки имеет приоритет, и это, вроде как, но он просто заменяет первый элемент основного файла конфигурации.
Позвольте мне перефразировать это. Я загружаю файлы конфигурации в этот класс:
internal class Options
{
public List<string> Folders { get; } = new List<string>();
}
Когда оба файла добавлены, и файл отладки добавлен последним, я хочу, чтобы свойство списка выше содержало только "debug-1"
,
Вместо этого он содержит "debug-1", "main-2"
, поэтому только первый элемент был перезаписан, второй - нет.
В то время как я мог понять это для словаря, только заменяя ключи, которые я фактически указал, для массива это кажется немного странным (для меня).
Вот код:
using System;
using System.Collections.Generic;
using Microsoft.Extensions.Configuration;
namespace ConsoleApp3
{
class Program
{
static void Main()
{
var builder = new ConfigurationBuilder();
builder.AddJsonFile("appsettings.json");
builder.AddJsonFile("appsettings.debug.json");
var configuration = builder.Build();
var options = configuration.Get<Options>();
foreach (var folder in options.Folders)
Console.WriteLine(folder);
}
}
internal class Options
{
public List<string> Folders { get; } = new List<string>();
}
}
Вывод этой программы такой:
debug-1
main-2
Я хотел бы, чтобы это содержало только "debug-1"
, Могу ли я указать что-то при загрузке файлов конфигурации, чтобы это могло вести себя так?
Это консольное приложение.NET Core 2.1, мне пришлось добавить следующие пакеты:
- Microsoft.Extensions.Configuration
- Microsoft.Extensions.Configuration.Json
- Microsoft.Extensions.Configuration.Binder
0 ответов
По сути, конфигурация работает с парами ключ / значение.
Когда вы используете массив в файле конфигурации json, отдельные элементы в массиве сопоставляются с отдельными парами ключ / значение с использованием индекса, начинающегося с нуля. Смотрите документы.
Ваш appsettings.json
эквивалентно парам ключ / значение:
Folders:0, main-1
а такжеFolders:1, main-2
в то время как ваш appsettings.debug.json
эквивалентно паре ключ / значение:
Folders:0, debug-1
Как видите, вы только переопределили ключ Folders:0
,
Одним из возможных решений проблемы является указание папок в виде строки с разделителями вместо массива и последующее извлечение отдельных значений.