Пытаясь прочитать конфигурацию в проекте .Net Core 2.0 от нескольких поставщиков, я не получаю желаемого результата.
Я добавил следующие пакеты NuGet в стандартный проект .Net Core C#, чтобы прочитать конфигурацию. Обе установили версию 2.0.2.
Install-Package Microsoft.Extensions.Configuration.Binder
Install-Package Microsoft.Extensions.Configuration.Json
Это код, демонстрирующий проблему.
class Program
{
static void Main(string[] args)
{
var InMemoryValue = new Dictionary<string, string>()
{
["Configuration.Test1"] = "IndexerValue1",
["Configuration.Test2"] = "IndexerValue2",
};
var configurationBuilder = new ConfigurationBuilder();
configurationBuilder
.AddInMemoryCollection(InMemoryValue)
.AddJsonFile("Config.json")
;
var configuration = configurationBuilder.Build();
Console.WriteLine("Indexer");
Console.WriteLine($" Test1:{configuration["Configuration.Test1"]}");
Console.WriteLine($" Test2:{configuration["Configuration.Test2"]}");
Console.WriteLine($" Test3:{configuration["Configuration.Test3"]}");
var getConfig = configuration.Get<Configuration>();
Console.WriteLine("Get");
Console.WriteLine($" Test1:{getConfig.Test1}");
Console.WriteLine($" Test2:{getConfig.Test2}");
Console.WriteLine($" Test3:{getConfig.Test3}");
var bindConfig = new Configuration();
configuration.GetSection("Configuration").Bind(bindConfig);
Console.WriteLine("Bind");
Console.WriteLine($" Test1:{bindConfig.Test1}");
Console.WriteLine($" Test2:{bindConfig.Test2}");
Console.WriteLine($" Test3:{bindConfig.Test3}");
Console.Write("Press [Enter] to end.");
Console.Read();
}
private class Configuration
{
public string Test1 { get; set; }
public string Test2 { get; set; }
public string Test3 { get; set; }
}
}
Вот содержимое файла Config.json.
{
"Configuration": {
"Test1": "JsonValue1",
"Test3": "JsonValue3"
}
}
И, наконец, вот результат.
Indexer
Test1:IndexerValue1
Test2:IndexerValue2
Test3:
Get
Test1:
Test2:
Test3:
Bind
Test1:JsonValue1
Test2:
Test3:JsonValue3
Press [Enter] to end.
Насколько я понимаю, я считаю, что должен иметь JsonValue1, IndexerValue2 и JsonValue3 в каждом разделе.
Будем признательны за любые подсказки.
@JamieMeyer, чувак, я тоже это знал. Большое спасибо за то, что показали мне мою ошибку. Вторая группа по-прежнему пуста, но я могу достаточно хорошо использовать третий метод привязки. Если вы опубликуете ответ, я отмечу это как таковое.





Как указано в комментарии ... Измените ссылки на двоеточия и опустите второй регистр. Это кажется лишним. Вот код, который я придумал.
class Program
{
static void Main(string[] args)
{
var InMemoryValue = new Dictionary<string, string>()
{
["Configuration:Test1"] = "IndexerValue1",
["Configuration:Test2"] = "IndexerValue2",
};
var configurationBuilder = new ConfigurationBuilder();
configurationBuilder
.AddInMemoryCollection(InMemoryValue)
.AddJsonFile("Config.json")
;
var configuration = configurationBuilder.Build();
Console.WriteLine("Indexer");
Console.WriteLine($" Test1:{configuration["Configuration:Test1"]}");
Console.WriteLine($" Test2:{configuration["Configuration:Test2"]}");
Console.WriteLine($" Test3:{configuration["Configuration:Test3"]}");
var bindConfig = new Configuration();
configuration.GetSection("Configuration").Bind(bindConfig);
Console.WriteLine("Bind");
Console.WriteLine($" Test1:{bindConfig.Test1}");
Console.WriteLine($" Test2:{bindConfig.Test2}");
Console.WriteLine($" Test3:{bindConfig.Test3}");
Console.Write("Press [Enter] to end.");
Console.Read();
}
public class Configuration
{
public string Test1 { get; set; }
public string Test2 { get; set; }
public string Test3 { get; set; }
}
}
В индексах конфигурации (["Configuration.Test1"]) для доступа к иерархии конфигурации используется двоеточие, а не точка. Итак, перейдите на ["Конфигурация: Test1"]. Второй раздел необходимо отредактировать, поскольку он пытается использовать отражение для сопоставления полей, которые не могут быть найдены. В любом случае кажется, что второй тест решается с помощью третьего теста, и поэтому в нем нет необходимости.