Как правильно читать вложенные значения конфигурации из 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"
},
Другие вопросы по тегам