Невозможно ввести IOptions в службу - PullRequest
0 голосов
/ 22 декабря 2018

Я пытаюсь внедрить IOptions внутри службы, которую я создал, и она всегда пуста:

public class Startup
{
    private IConfiguration configuration;
    public Startup(IConfiguration config)
    {
        this.configuration = config; //gets injected from Main method , not null !
    }
    public void ConfigureServices(IServiceCollection services)
    {

        Config config = configuration.GetSection("Config").Get<Config>();
        services.Configure<Config>(configuration);
        services.AddTransient<StatusService>();
        services.AddCors();
        services.AddOptions();

    }
}

Служба

internal class StatusService
{
    private Config config;
    public StatusService(IOptions<Config>_config)
    {
      this.config=_config.Value; // _config has default fields
    }
}

PS Config - это просто POCO, который заполняется в методе Program.Main с использованием расширения UseConfiguration. Конфигурация проанализирована ОК, поэтому проблем нет. Я получаю конфигурацию, успешно введенную в конструктор Startup.

Ответы [ 2 ]

0 голосов
/ 23 декабря 2018

Я бы посоветовал вам внедрить опции как отдельный класс, чтобы вы могли получать только связанные типы настроек и / или константы вместе.Во-первых, вы должны определить параметры в appsettings.json, как показано ниже.

{
  "Config": {
    "ConfigId": "value",
    "ConfigName": "value",
    "SomeBoolean": true,
    "SomeConstant": 15,
  }
}

После указания ваших вещей в файле appsettings.json вам нужно создать класс для загрузки этих значений из appsettings.json.В этом случае это выглядит как подробности Config.cs этого класса, показанные ниже.

public class Config
{
    public string ConfigId { get; set; }
    public string ConfigName { get; set; }
    public bool SomeBoolean { get; set; }
    public int SomeConstant { get; set; }
}

После создания соответствующего класса вы можете получить значения для класса, как показано ниже.Как вы могли заметить, IConfiguration является частной и получает все настройки из appsetttings.json только для инициализации приложения.А в ConfigureServices () вы должны получить значения связанных частей из этого объекта конфигурации для внедрения других сервисов.

private IConfiguration Configuration { get; }
public Startup(IConfiguration configuration)
{
      Configuration = configuration;
}

public void ConfigureServices(IServiceCollection services)
{               
     services.Configure<Config>(Configuration.GetSection("Config"));
}

После настройки вашего класса параметров (Config.cs) вы можете внедрить его как IOptions, как показано ниже.

private readonly Config _config;
public StatusService(IOptions<Config> config)
{
     _config = config.Value;
}  

Надеюсь, это решит вашу проблему.

0 голосов
/ 22 декабря 2018

Ваш код должен быть таким:

services.Configure<Config>(configuration.GetSection("Config"));
...