【问题标题】:Can not inject IOptions in service无法在服务中注入 IOptions
【发布时间】:2019-05-22 15:47:26
【问题描述】:

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

【问题讨论】:

  • 您是否尝试通过config 而不是configurationservices.Configure&lt;Config&gt;(configuration); 传递?
  • Config 没有实现 IConfiguration ,这就是 Configure 扩展所期望的。
  • 试试这个:services.Configure&lt;Config&gt;(options =&gt; configuration.GetSection("Config").Bind(options));

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


【解决方案1】:

你的代码应该是这样的:

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

【讨论】:

    【解决方案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;
    }  
    

    希望这能解决您的问题。

    【讨论】:

    • services.Configure 比 services.Configure> 效果更好 :(
    猜你喜欢
    • 1970-01-01
    • 2019-09-08
    • 2017-06-27
    • 2014-07-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-18
    • 2019-06-18
    • 1970-01-01
    相关资源
    最近更新 更多