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