Как создать иерархическую конфигурацию в памяти в .Net Core

#configuration #.net-core-2.1

#конфигурация #.net-core-2.1

Вопрос:

Я хотел бы создать иерархическую конфигурацию в памяти по принципу использования вложенного словаря для заполнения IConfiguration . Мой текущий подход примерно таков.

У меня есть словарь, подобный этому:

 var inMemConfig = new Dictionary<string, object>();
inMemConfig["section1"] = new Dictionary<string, string>();
inMemConfig["section2"] = new Dictionary<string, object>();
inMemConfig["deepNest"] = new Dictionary<string, object>();
// Excluding a cast below: 
inMemConfig["deepNest"]["list"] = new List<Dictionary<string, string>>();
inMemConfig["deepNest"]["dict"] = new Dictionary<string string>();
  

После заполнения вышеупомянутого словаря я пытаюсь использовать ConfigurationBuilder как показано ниже.

 var builder = new ConfigurationBuilder();
var configuration = builder.AddInMemoryCollection(inMemConfig).Build(); 
  

Это, очевидно, выдает ошибку компилятора, которая inMemConfig должна быть типа: IEnumerable<KeyValuePair<string, string>> .

Невозможно ли создать иерархические конфигурации в памяти, и если да, то очень ценятся любые указания в правильном направлении. Спасибо.

Ответ №1:

Вы можете использовать двоеточие («:») в качестве разделителя для обозначения иерархии в вашей конфигурации. Так, например:

 var builder = new ConfigurationBuilder();
var configuration = builder.AddInMemoryCollection(new Dictionary<string, string> {
    ["deepNest:list"] = "some_nested_list_value",
    ["deepNest:dict"] = "some_nested_dict_value"
}).Build();
  

Ответ №2:

var inMemConfig = новый словарь<строка, string>();

[Самый глубокий:0:список]=»firstL»,

[Самый глубокий:1:список]=»secondL»,

[Самый глубокий:0:dict]=»firstD»,

[Самый глубокий:1:dict]=»secondD»

Ответ №3:

Вот метод расширения, который я написал, который упрощает передачу сложного иерархического объекта, представляющего настройки:

 /// <summary>
/// Adds settings to the builder from an anonymous object. This allows complex settings object to be built and passed into here, e.g.
/// <code>
///var settings = new
///{
///  programmeLogin = new[] {
///    new {
///      programmeId = 1,
///      loginOptions = new {
///        loginType = loginType,
///        isDefault = true
///      }
///    }
///  },
///  portal = new {
///    programmeId = 1
///  }
///};
///
///IConfigurationBuilder builder = new ConfigurationBuilder().AddObject(settings);
///IConfigurationRoot configurationRoot = builder.Build();
/// </code>
/// </summary>
/// <param name="builder">The <see cref="IConfigurationBuilder"/> to add to.</param>
/// <param name="obj">The <see cref="object"/> containing the settings to add.</param>
/// <returns></returns>
public static IConfigurationBuilder AddObject(this IConfigurationBuilder builder, object obj)
{
    string json = System.Text.Json.JsonSerializer.Serialize(obj);

    return builder.AddJsonStream(new MemoryStream(Encoding.UTF8.GetBytes(json)));
}