如何从ASP.NET Core的appsettings.json生成字典并获取指定环境对象
从appsettings.json转换环境配置为Dictionary并获取活跃环境
问题背景
你的ASP.NET Core Web API的appsettings.json中有如下配置:
{ "Environments": [ { "Sandbox": { "clientID": "", "secret": "", "adminLoginName": "", "apiEndpoint": "", "linkURL": "" } }, { "Development": { "clientID": "", "secret": "", "adminLoginName": "", "apiEndpoint": "", "linkURL": "" } }, { "Production": { "clientID": "", "secret": "", "adminLoginName": "", "apiEndpoint": "", "linkURL": "" } } ], "ActiveEnvironment": "Sandbox" }
对应的Environment类定义:
public class Environment { public string? ClientID { get; set; } public string? Secret { get; set; } public string? AdminLoginName { get; set; } public string? ApiEndpoint { get; set; } public string? LinkURL { get; set; } }
需要将Environments数组转换为Dictionary<string, Environment>,并根据ActiveEnvironment获取对应的配置对象。
解决方案
方法1:适配现有配置结构转换
由于当前Environments是数组,每个元素仅包含一个键值对,需要遍历每个数组元素提取键和配置对象:
using Microsoft.Extensions.Configuration; using System.Linq; // 获取Environments配置节点 var environmentsSection = configuration.GetSection("Environments"); // 转换为Dictionary<string, Environment> var environmentsDict = environmentsSection.GetChildren() .ToDictionary( // 提取每个数组元素中的唯一键 section => section.GetChildren().First().Key, // 将键对应的配置绑定到Environment对象 section => section.Get<Dictionary<string, MyAPI.Models.Environment>>().Values.First() ); // 获取活跃环境配置 var activeEnvName = configuration["ActiveEnvironment"]; if (environmentsDict.TryGetValue(activeEnvName, out var activeEnvironment)) { // 这里可以使用activeEnvironment的配置项 var clientId = activeEnvironment.ClientID; }
方法2:修改配置结构简化转换
如果可以调整appsettings.json的结构,将Environments从数组改为直接的字典结构,绑定会更简洁:
修改后的appsettings.json:
{ "Environments": { "Sandbox": { "clientID": "", "secret": "", "adminLoginName": "", "apiEndpoint": "", "linkURL": "" }, "Development": { "clientID": "", "secret": "", "adminLoginName": "", "apiEndpoint": "", "linkURL": "" }, "Production": { "clientID": "", "secret": "", "adminLoginName": "", "apiEndpoint": "", "linkURL": "" } }, "ActiveEnvironment": "Sandbox" }
此时直接绑定为字典:
var environmentsDict = configuration.GetSection("Environments") .Get<Dictionary<string, MyAPI.Models.Environment>>(); var activeEnvironment = environmentsDict[configuration["ActiveEnvironment"]];
内容的提问来源于stack exchange,提问作者SiBrit
相关产品推荐
相关产品推荐

