如何不通过DI创建类从appsettings.json集合读取单个值
读取appsettings.json中Serilog配置的serverUrl值(无DI方式)
正确实现方式
方式1:直接通过索引定位数组元素
因为WriteTo是数组结构,第一个元素的索引为0,可以直接用完整配置路径读取:
var configurationBuilder = new ConfigurationBuilder() .AddJsonFile("appsettings.json", optional: false) .AddJsonFile($"appsettings.{environmentName}.json", optional: true) .AddEnvironmentVariables(); IConfiguration _configuration = configurationBuilder.Build(); // 直接用索引定位数组元素,路径用冒号分隔 var serverUrl = _configuration.GetValue<string>("Serilog:WriteTo:0:Args:serverUrl");
方式2:遍历数组筛选目标节点(更灵活)
如果Seq节点在WriteTo数组中的位置不固定,可以遍历子节点并筛选Name为Seq的项:
var writeToSection = _configuration.GetSection("Serilog:WriteTo"); // 遍历数组元素 foreach (var section in writeToSection.GetChildren()) { if (section.GetValue<string>("Name") == "Seq") { var serverUrl = section.GetValue<string>("Args:serverUrl"); // 后续处理逻辑 break; } } // 或者用LINQ简化 var serverUrl = writeToSection.GetChildren() .FirstOrDefault(s => s.GetValue<string>("Name") == "Seq")? .GetValue<string>("Args:serverUrl");
你之前尝试失败的原因
- 第一次尝试:
_configuration.GetSection("Serilog").GetChildren().First()获取的是WriteTo节点(Serilog的直接子节点只有WriteTo),而非数组里的具体项,后续读取Args::serverUrl自然找不到对应值。 - 第二次尝试:配置路径缺少数组元素的索引(
WriteTo是数组,必须指定0这类索引定位元素),同时错误使用了::分隔符,.NET配置系统统一用冒号:分隔路径。 - 第三次尝试:同样错误地将
WriteTo节点当成了数组元素,需要先调用GetChildren().First()获取数组内的具体项,再读取Args下的serverUrl。
内容的提问来源于stack exchange,提问作者user21996911
相关产品推荐
相关产品推荐

