C# 启动时配置节为null,但在服务中填充

C# 启动时配置节为null,但在服务中填充,c#,asp.net-core,.net-core,asp.net-core-2.0,C#,Asp.net Core,.net Core,Asp.net Core 2.0,在调试另一个问题时,我遇到了一些奇怪的情况,我想知道是否有更有知识的人可以解释。下面是一些快速测试代码(我为任何错误道歉) 应用程序设置 { "A": { "B": 123, "C": "ABC" } } Startup.cs: public void ConfigureServices(IServiceCollection services) { var config1 = Configuration.GetSection("A"); //conf

在调试另一个问题时,我遇到了一些奇怪的情况,我想知道是否有更有知识的人可以解释。下面是一些快速测试代码(我为任何错误道歉)

应用程序设置

{  
  "A": {
    "B": 123,
    "C": "ABC"
  }
}
Startup.cs:

public void ConfigureServices(IServiceCollection services)
{
    var config1 = Configuration.GetSection("A");
    //config1.value <- Null
    var config2 = Configuration.GetSection("A:B");
    //config2.value <- 123
    var config3 = Configuration.GetSection("A:C");
    //config3.value <- "ABC"
    services.Configure<ABC>(config1);
    services.AddTransient<ABCService>();
}

public class ABC
{
    public int B {get;set;}
    public string c {get;set;}
}

public class ABCService
{
        public ABCService(IOptions<ABC> abcConfig)
        {
            //abcConfig.Value.B <- 123
            //abcConfig.Value.C <- "ABC"
        }
}
public void配置服务(IServiceCollection服务)
{
var config1=Configuration.GetSection(“A”);

//config1.value您可以向启动类添加构造函数,并将IConfiguration作为依赖项。这将是已解析的配置对象。然后,您可以在ConfigureServices方法中使用它

您可以在此处看到一个示例:
config1。value
null
,原因很简单,在您的示例JSON中,
A
没有值。配置系统使用简单的键值对。例如,在您构建的
配置
对象中,您有以下(key=>value):

如果运行以下示例代码,您可以亲自看到这一点,该代码生成上面所示的输出:

Configuration.AsEnumerable()
    .ToList()
    .ForEach(x => Console.WriteLine("{0} => {1}", x.Key, x.Value));
这表明
A
的值是
null
,这就是您所描述的。
A:B
A:C
都有值,它们是
A
部分的一部分,由
层次分隔符表示。当您使用
服务。配置
时,它实际上只是匹配任何内容在
A:
下,针对您的
ABC
类查找
B
C

通过使用
GetSection(“A”)
,您已经为
配置创建了一个不同的视图
实例,该实例将只包含根于
A
的任何内容。在您的示例中,这两种情况下都是相同的,因为您只有
A

本文在描述配置系统如何工作方面做得很好

Configuration.AsEnumerable()
    .ToList()
    .ForEach(x => Console.WriteLine("{0} => {1}", x.Key, x.Value));