无法在服务中注入 IOptions
Can not inject IOptions in service
我正在尝试在我创建的服务中注入 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
}
}
P.S 配置只是一个 POCO,使用 UseConfiguration
extension.The 配置在 Program.Main
方法中填充好的,没问题 there.I 在 Startup
构造函数中成功注入配置。
你的代码应该是这样的:
services.Configure<Config>(configuration.GetSection("Config"));
我建议您将选项作为单独的 class 注入,这样您就可以只获得相关类型的设置 and/or 常量。首先,您应该定义 appsettings.json 中的选项,如下所示。
{
"Config": {
"ConfigId": "value",
"ConfigName": "value",
"SomeBoolean": true,
"SomeConstant": 15,
}
}
在 appsettings.json 文件中指定您的内容后,您需要创建一个 class 以从 appsettings.json 加载这些值。在这种情况下,它的 Config.cs 详细信息如下所示 class。
public class Config
{
public string ConfigId { get; set; }
public string ConfigName { get; set; }
public bool SomeBoolean { get; set; }
public int SomeConstant { get; set; }
}
创建正确的 class 后,您可以将值添加到 class 中,如下所示。正如您可能注意到的那样,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"));
}
配置选项后 class (Config.cs),您可以将其作为 IOptions 注入,如下所示。
private readonly Config _config;
public StatusService(IOptions<Config> config)
{
_config = config.Value;
}
希望这能解决您的问题。
我正在尝试在我创建的服务中注入 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
}
}
P.S 配置只是一个 POCO,使用 UseConfiguration
extension.The 配置在 Program.Main
方法中填充好的,没问题 there.I 在 Startup
构造函数中成功注入配置。
你的代码应该是这样的:
services.Configure<Config>(configuration.GetSection("Config"));
我建议您将选项作为单独的 class 注入,这样您就可以只获得相关类型的设置 and/or 常量。首先,您应该定义 appsettings.json 中的选项,如下所示。
{
"Config": {
"ConfigId": "value",
"ConfigName": "value",
"SomeBoolean": true,
"SomeConstant": 15,
}
}
在 appsettings.json 文件中指定您的内容后,您需要创建一个 class 以从 appsettings.json 加载这些值。在这种情况下,它的 Config.cs 详细信息如下所示 class。
public class Config
{
public string ConfigId { get; set; }
public string ConfigName { get; set; }
public bool SomeBoolean { get; set; }
public int SomeConstant { get; set; }
}
创建正确的 class 后,您可以将值添加到 class 中,如下所示。正如您可能注意到的那样,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"));
}
配置选项后 class (Config.cs),您可以将其作为 IOptions 注入,如下所示。
private readonly Config _config;
public StatusService(IOptions<Config> config)
{
_config = config.Value;
}
希望这能解决您的问题。