繁体   English   中英

.NET Core 配置管理器,读取一个键里面有一个冒号的字典,给出一个关于值的奇怪的错误消息,这是预期的吗?

[英].NET Core configuration manager, reading a dictionary where one key has a colon inside, gives an odd error message about the value, is this expected?

以下程序:

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 文件中存储任何奇怪的字典?

ASP.NET Core 中的参考配置:分层配置数据

配置 API 能够通过使用配置键中的分隔符扁平化分层数据来维护分层配置数据。

当文件被读入配置时,会创建唯一键来维护配置源的原始分层数据结构。 部分和键使用冒号 (:) 变平以保持原始结构

这意味着在以下appsettings.json文件中

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

键将被展平为

  • 值:a:b
  • 值:b

这是要打破的设置文件的结构时ConfigurationBinder.BindDictionary试图绑定的Dictionary<string, bool>在属性Options

还参考了这个GitHub 问题

冒号保留用于键中的特殊含义,因此不应将它们用作普通键值的一部分。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM