При использовании файлов appsettings.json, относящихся к среде, есть ли способ для каждой настройки заменить, а не добавить? - PullRequest
0 голосов
/ 31 августа 2018

Я обнаружил, что при настройке консольного приложения с использованием .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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...