#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)));
}