无法在服务中注入IOptions

时间:2018-12-22 16:00:24

标签: c# asp.net-core microsoft.extensions.hosting

我正在尝试在我创建的服务内注入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只是使用Program.Main扩展名以UseConfiguration方法填充的POCO。配置被解析为OK,所以没有问题。我将配置注入在Startup构造函数中成功。

2 个答案:

答案 0 :(得分:5)

您的代码应如下所示:

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

答案 1 :(得分:2)

我建议您将选项作为一个单独的类注入,这样您就可以只获得相关类型的设置和/或常量。首先,应在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()中,您应该从该Configuration对象获取相关部分的值,以注入其他服务。

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;
}  

希望这可以解决您的问题。