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

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

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 Ответ

0 голосов
/ 31 августа 2018

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

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

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

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

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

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

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

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

Также ссылается на это GitHub Issue

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...