Не удается получить раздел конфигурации после обновления до 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>();