Диспетчер конфигурации.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
Двоеточия зарезервированы для специального значения в ключах, поэтому их не следует использовать как часть нормальных значений ключей.