При использовании файлов 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,

Одним из возможных решений проблемы является указание папок в виде строки с разделителями вместо массива и последующее извлечение отдельных значений.

Другие вопросы по тегам