如何从 ASP.NET5 中正确读取 config.json 的嵌套配置值?
How to properly read nested configuration values from config.json in ASP.NET5?
我正在关注一些 examples for ASP.NET 5,但我迷失了如何正确读取 "nested" 配置值(如果这是正确的术语)。
这里是config.json
的相关部分:
{
"ApplicationName" : "OwNextApp",
"AppSettings": {
"SiteTitle": "OwNext"
},
}
和HomeController.cs
的相关部分:
public IActionResult About()
{
var appNestedNameFailed = _config.Get("AppSettings.SiteTitle");
var appNestedNameSuccess = _config.Get("AppSettings:SiteTitle");
var appName = _config.Get("ApplicationName");
ViewBag.Message = string.Format(@"Your
APP NAME: {0};
APP NESTED NAME FAILED: {1};
APP NESTED NAME SUCCESS: {2}",
appName, appNestedNameFailed, appNestedNameSuccess);
return View();
}
appNestedNameFailed
的值为空(我在研究之前的初步尝试)。而 appNestedNameSuccess
是有价值的;在我做了研究并在 Configuration 的测试中发现(相关代码显示):
// Assert
Assert.Equal("IniValue1", config.Get("IniKey1"));
Assert.Equal("IniValue2", config.Get("IniKey2:IniKey3"));
有人可以解释为什么会这样吗?为什么使用 :
而不是 .
更有意义?从我与 JSON 数据的交互来看,通常 .
符号工作正常,例如How to access nested json data。
此外,我发现了类似的 SO question,但这并没有解释为什么选择 :
。
深入 JsonConfigurationFileParser 源代码的内部,并指责 enter/exit 方法查看:
private void VisitJObject(JObject jObject)
{
foreach (var property in jObject.Properties())
{
EnterContext(property.Name);
VisitProperty(property);
ExitContext();
}
}
private void EnterContext(string context)
{
_context.Push(context);
_currentPath = string.Join(":", _context.Reverse());
}
private void ExitContext()
{
_context.Pop();
_currentPath = string.Join(":", _context.Reverse());
}
看来 ASP.NET 团队应该留下更多有启发性的签到评论:)。
我最好的猜测是 config.json 文件中可能存储了需要包含 .
的数据,而 :
则不太常见。例如:
"AppSettings": {
"Site.Title": "Is .NET getting faster?"
},
这是一个糟糕的例子,但他们希望尽可能 "safe" 并使用一些超出规范的东西似乎是合理的。如果你想存储一个类型的全名,那也会稍微容易一些,而不需要担心流浪期。
"AppSettings": {
"ImportantTypeName": "WebApp.CoolStuff.Helpers.AwesomeClass"
},
这是我们在第一次创建配置模型时决定的约定。我们从 json 开始,:
是那里的分隔符。
无论如何,如果您不想担心这些约定,我建议使用可以作为示例的ConfigurationBinder which binds a configuration to a model (a strong type object). Here are the tests on GitHub。
using Microsoft.Extensions.Configuration;
using System.IO;
IConfigurationRoot configuration = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json")
.Build();
var connectionString = configuration.GetValue<string>("ConnectionStrings:DefaultConnection");
// or
var connectionString2= configuration.GetSection("ConnectionStrings").GetSection("DefaultConnection").Value;
appsettings.json:
{
"ConnectionStrings": {
"DefaultConnection": "myconnection"
},
}
我正在关注一些 examples for ASP.NET 5,但我迷失了如何正确读取 "nested" 配置值(如果这是正确的术语)。
这里是config.json
的相关部分:
{
"ApplicationName" : "OwNextApp",
"AppSettings": {
"SiteTitle": "OwNext"
},
}
和HomeController.cs
的相关部分:
public IActionResult About()
{
var appNestedNameFailed = _config.Get("AppSettings.SiteTitle");
var appNestedNameSuccess = _config.Get("AppSettings:SiteTitle");
var appName = _config.Get("ApplicationName");
ViewBag.Message = string.Format(@"Your
APP NAME: {0};
APP NESTED NAME FAILED: {1};
APP NESTED NAME SUCCESS: {2}",
appName, appNestedNameFailed, appNestedNameSuccess);
return View();
}
appNestedNameFailed
的值为空(我在研究之前的初步尝试)。而 appNestedNameSuccess
是有价值的;在我做了研究并在 Configuration 的测试中发现(相关代码显示):
// Assert
Assert.Equal("IniValue1", config.Get("IniKey1"));
Assert.Equal("IniValue2", config.Get("IniKey2:IniKey3"));
有人可以解释为什么会这样吗?为什么使用 :
而不是 .
更有意义?从我与 JSON 数据的交互来看,通常 .
符号工作正常,例如How to access nested json data。
此外,我发现了类似的 SO question,但这并没有解释为什么选择 :
。
深入 JsonConfigurationFileParser 源代码的内部,并指责 enter/exit 方法查看:
private void VisitJObject(JObject jObject)
{
foreach (var property in jObject.Properties())
{
EnterContext(property.Name);
VisitProperty(property);
ExitContext();
}
}
private void EnterContext(string context)
{
_context.Push(context);
_currentPath = string.Join(":", _context.Reverse());
}
private void ExitContext()
{
_context.Pop();
_currentPath = string.Join(":", _context.Reverse());
}
看来 ASP.NET 团队应该留下更多有启发性的签到评论:)。
我最好的猜测是 config.json 文件中可能存储了需要包含 .
的数据,而 :
则不太常见。例如:
"AppSettings": {
"Site.Title": "Is .NET getting faster?"
},
这是一个糟糕的例子,但他们希望尽可能 "safe" 并使用一些超出规范的东西似乎是合理的。如果你想存储一个类型的全名,那也会稍微容易一些,而不需要担心流浪期。
"AppSettings": {
"ImportantTypeName": "WebApp.CoolStuff.Helpers.AwesomeClass"
},
这是我们在第一次创建配置模型时决定的约定。我们从 json 开始,:
是那里的分隔符。
无论如何,如果您不想担心这些约定,我建议使用可以作为示例的ConfigurationBinder which binds a configuration to a model (a strong type object). Here are the tests on GitHub。
using Microsoft.Extensions.Configuration;
using System.IO;
IConfigurationRoot configuration = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json")
.Build();
var connectionString = configuration.GetValue<string>("ConnectionStrings:DefaultConnection");
// or
var connectionString2= configuration.GetSection("ConnectionStrings").GetSection("DefaultConnection").Value;
appsettings.json:
{
"ConnectionStrings": {
"DefaultConnection": "myconnection"
},
}