IConfiguration.GetSection () как Properties возвращает null

Я пытаюсь получить конфигурацию внутри своего приложения.

Я передал IConfiguration в класс обслуживания, который должен получить некоторые настройки.

Класс выглядит примерно так:

private IConfiguration _configuration;
public Config(IConfiguration configuration)
{
    _configuration = configuration;
}
public POCO GetSettingsConfiguration()
{
    var section = _configuration.GetSection("settings") as POCO;

    return section;
}

При отладке я вижу, что _configuration действительно содержит настройки, но мой «раздел» просто возвращается как null.

Я знаю, что могу попытаться настроить Poco, который будет создан при запуске, а затем введен как зависимость, но из-за настройки я бы предпочел сделать это в отдельных классах от внедренной IConfiguration, если это возможно.

В моем appsettings.json есть следующие значения:

{
  "Logging": {
    "LogLevel": {
      "Default": "Warning"
    }
  },
  "AllowedHosts": "*",

  "settings": {
    "Username": "user",
    "Password": "password",
    "Domain": "example.com",
    "URL": "http://service.example.com"
  }

}

Мой класс poco выглядит так:

public class POCO
{
    public string URL { get; set; }
    public string Username { get; set; }
    public SecureString Password { get; set; }
    public string Domain { get; set; }
}

person PeaceDealer    schedule 31.01.2019    source источник
comment
Прочтите об операторе as: docs.microsoft.com / ru-ru / dotnet / csharp / language-reference /   -  person Aluan Haddad    schedule 31.01.2019


Ответы (2)


Вам необходимо использовать:

var section = _configuration.GetSection("settings").Get<POCO>();

То, что возвращается из GetSection, - это просто словарь строк. Вы не можете применить это к своему классу POCO.

person Chris Pratt    schedule 31.01.2019
comment
У меня нет опции .Get после GetSelection. - person PeaceDealer; 31.01.2019
comment
Он находится в пространстве имен Microsoft.Extensions.Configuration. Я не понимаю, почему у вас еще нет использования для этого, но если нет, добавьте его. В противном случае с вашим проектом что-то серьезно не так. - person Chris Pratt; 31.01.2019
comment
Могу подтвердить, что его using Microsoft.Extensions.Configuration. Библиотека классов нацелена на .net core 2.2. - person PeaceDealer; 31.01.2019
comment
Не знаю, что тебе сказать. Это там: docs .microsoft.com / en-us / dotnet / api /. Убедитесь, что ваш проект строится правильно. - person Chris Pratt; 31.01.2019
comment
Хорошо, оказывается, мне не хватало пакета .Binding. Спасибо! - person PeaceDealer; 31.01.2019
comment
Интересно. Это не то, на что вам нужно ссылаться явно. Следует указать ссылку на пакет Microsoft.Extensions.Configuration или Microsoft.AspNetCore.App. - person Chris Pratt; 31.01.2019
comment
На самом деле, похоже, он включен только Microsoft.AspNetCore.App. Вы используете это в библиотеке классов или что-то в этом роде? Если это приложение ASP.NET Core, вы должны ссылаться только на Microsoft.AspNetCore.App. - person Chris Pratt; 31.01.2019
comment
После добавления пакета nuget Microsoft.Extenions.Configurations.Binding все заработало - person PeaceDealer; 31.01.2019
comment
Я знаю. Я хочу сказать, что если вы не делаете это в библиотеке классов или каком-либо другом проекте, где вы не можете ссылаться на метапакет Microsoft.AspNetCore.App, в этом нет необходимости. Если у вас есть проект веб-приложения ASP.NET Core, который не ссылается на Microsoft.AspNetCore.App, вам необходимо это исправить. (Если вы не ориентируетесь на .NET Framework, и в этом случае вам придется вместо этого ссылаться на Microsoft.AspNetCore и Microsoft.AspNetCore.Mvc.) - person Chris Pratt; 31.01.2019

IConfiguration и IConfigurationSection имеют метод расширения Свяжите для этого:

var poco = new POCO();
_configuration.GetSection("settings").Bind(poco);

Или просто Получить

var poco = _configuration.GetSection("settings").Get(typeof(POCO));

Или общий

var poco = _configuration.GetSection("settings").Get<POCO>();
person Zabavsky    schedule 31.01.2019