Как правильно читать вложенные значения конфигурации из config.json в ASP.NET5?
Я следовал за некоторыми примерами для ASP.NET 5, и я наткнулся на то, как правильно читать "вложенные" значения конфигурации (если это правильный термин).
Вот соответствующая часть 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
имеет значение; после того, как я провел исследование и обнаружил в тестах для конфигурации (соответствующий код показан):
// Assert
Assert.Equal("IniValue1", config.Get("IniKey1"));
Assert.Equal("IniValue2", config.Get("IniKey2:IniKey3"));
Может кто-нибудь объяснить, почему это так? Почему имеет смысл использовать :
над .
? Из моего взаимодействия с данными JSON обычно .
нотация работает нормально, например, как получить доступ к вложенным данным JSON.
Кроме того, я нашел аналогичный вопрос, но это не дает объяснения, почему :
был выбран.
2 ответа
Это соглашение, которое мы определили, когда впервые создали модель конфигурации. Мы начали с JSON и :
это разделитель там.
В любом случае, если вы не хотите беспокоиться об этих соглашениях, я рекомендую использовать ConfigurationBinder, который привязывает конфигурацию к модели (объект строгого типа). Вот тесты, которые могут служить примером.
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"
},
}
Вглядываясь вглубь источника JsonConfigurationFileParser с обвинением в методах входа / выхода, которые смотрят на:
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?"
},
Это плохой пример, но кажется разумным, что они хотели быть максимально "безопасными" и использовать что-то, выходящее за рамки нормы. Если вы хотите сохранить полное имя типа, это также будет немного проще, не беспокоясь о случайном периоде.
"AppSettings": {
"ImportantTypeName": "WebApp.CoolStuff.Helpers.AwesomeClass"
},