Не удается получить раздел конфигурации после обновления до ASP.NET Core 2
Я обновил свой проект с 1.0.0-rc1-final до 1.0.0-rc2-final, который теперь называется ASP.NET Core 2. Вот как я инициализирую конструктор конфигурации:
var builder = new ConfigurationBuilder().SetBasePath(Environment.GetEnvironmentVariable("ASPNETCORE_CONTENTROOT")).AddJsonFile(file).AddEnvironmentVariables();
IConfiguration configuration = builder.Build();
Я точно знаю, что инициализация в порядке, потому что я могу сделать
configuration.AsEnumerable()
в отладчике и увидеть все значения в файлах конфигурации там.
Однако, если я попытаюсь получить весь раздел конфигурации, подобный этому
configuration.GetSection(section.Name);
он не работает. Он возвращает объект независимо от того, что я передаю GetSection. Однако поле Value этого объекта всегда равно null, независимо от того, существует или нет раздел.
Обратите внимание, что раньше это работало отлично.
Любые подсказки?
Ответы
Ответ 1
Оказывается, что больше нельзя делать что-то вроде:
var allSettingsInSection = configuration.Get(typeof(StronglyTypedConfigSection), sectionName);
Вместо этого это должно быть сделано следующим образом:
IConfigurationSection sectionData = configuration.GetSection(sectionName);
var section = new StronglyTypedConfigSection();
sectionData.Bind(section);
Обратите внимание, что необходимо включить Microsoft.Extensions.Configuration.Binder в project.json.
Ответ 2
Только более чистая версия принятого ответа:
public void ConfigureServices(IServiceCollection services)
{
services.Configure<MySettings>(options => Configuration.GetSection("MySettings").Bind(options));
}
Источник
Ответ 3
Я использую выделение GetSection, и поэтому я создал метод расширения, чтобы помочь мне получить разделы с использованием дженериков
public static class ConfigurationExtensions
{
public static T GetConfig<T>(this IConfiguration config) where T : new()
{
var settings = new T();
config.Bind(settings);
return settings;
}
public static T GetConfig<T>(this IConfiguration config, string section) where T : new()
{
var settings = new T();
config.GetSection(section).Bind(settings);
return settings;
}
}
Ответ 4
В ядре net net 2.1 вы можете сделать это:
var MyConfigClass = Configuration.GetSection("MyConfigClass").Get<MyConfigClass>();