Диспетчер конфигурации.NET Core, читая словарь, в котором один ключ имеет двоеточие, выдает странное сообщение об ошибке о значении, это ожидается?

Следующая программа:

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");

            var configuration = builder.Build();
            var options = configuration.Get<Options>();
            foreach (var kvp in options.Values)
                Console.WriteLine($"{kvp.Key}: {kvp.Value}");
        }
    }

    internal class Options
    {
        public Dictionary<string, bool> Values { get; } = new Dictionary<string, bool>();
    }
}

Когда дано это appsettings.json файл, работает отлично:

{
    "Values": {
        "a": true,
        "b": false
    }
}

но изменить appsettings.json содержание к этому:

{
    "Values": {
        "a:b": true,
        "b": false
    }
}

и я получаю это исключение:

Необработанное исключение: System.InvalidOperationException: невозможно создать экземпляр типа 'System.Boolean', поскольку в нем отсутствует открытый конструктор без параметров.

трассировки стека:

   at Microsoft.Extensions.Configuration.ConfigurationBinder.CreateInstance(Type type)
   at Microsoft.Extensions.Configuration.ConfigurationBinder.BindInstance(Type type, Object instance, IConfiguration config, BinderOptions options)
   at Microsoft.Extensions.Configuration.ConfigurationBinder.BindDictionary(Object dictionary, Type dictionaryType, IConfiguration config, BinderOptions options)
   at Microsoft.Extensions.Configuration.ConfigurationBinder.BindInstance(Type type, Object instance, IConfiguration config, BinderOptions options)
   at Microsoft.Extensions.Configuration.ConfigurationBinder.BindProperty(PropertyInfo property, Object instance, IConfiguration config, BinderOptions options)
   at Microsoft.Extensions.Configuration.ConfigurationBinder.BindNonScalar(IConfiguration configuration, Object instance, BinderOptions options)
   at Microsoft.Extensions.Configuration.ConfigurationBinder.BindInstance(Type type, Object instance, IConfiguration config, BinderOptions options)
   at Microsoft.Extensions.Configuration.ConfigurationBinder.Get[T](IConfiguration configuration, Action`1 configureOptions)
   at ConsoleApp3.Program.Main() in D:\Dev\ConsoleApp3\ConsoleApp3\Program.cs:line 15

Что я делаю неправильно? Обратите внимание, что двоеточие в ключе вполне допустимо в формате json, но, возможно, хранение какого-либо нечетного словаря в файле appsettings.json не поддерживается?

1 ответ

Решение

Справочная конфигурация в ASP.NET Core: данные иерархической конфигурации

API конфигурации способен поддерживать иерархические данные конфигурации, сглаживая иерархические данные с использованием разделителя в ключах конфигурации.

Когда файл считывается в конфигурацию, создаются уникальные ключи для поддержки исходной иерархической структуры данных источника конфигурации. Разделы и ключи сглаживаются с помощью двоеточия (:), чтобы сохранить первоначальную структуру

Это означает, что в следующем файле appsettings.json

{
    "Values": {
        "a:b": true,
        "b": false
    }
}

Ключи будут сплющены

  • Значения: а: Ь
  • Значения: б

который собирается нарушить структуру файла настроек, когда ConfigurationBinder.BindDictionary пытается связать Dictionary<string, bool> недвижимость в Options

Также ссылка на этот выпуск GitHub

Двоеточия зарезервированы для специального значения в ключах, поэтому их не следует использовать как часть нормальных значений ключей.

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