ServiceProvider无法解析configure方法中的选项

时间:2017-03-17 20:05:47

标签: asp.net-core coreclr

我有asp.net核心应用程序。我在appsettings.json文件中存储了Options。我在服务中注册Options,然后尝试在Configure方法中解决它。

但服务提供商无法解决Configure方法中的选项。

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

    public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory, IApplicationLifetime appLifetime,IServiceProvider services)
    { 

            var options = services.GetService<HstsOptions>();
            // service provider cannot resolve options here, it returns null
            app.UseHsts(options);
    }

}

2 个答案:

答案 0 :(得分:2)

您可以更改Configure的方法签名,并将先前注册的任何内容注入到方法中,如下所示:

public void Configure(
    IApplicationBuilder app, 
    IHostingEnvironment env, 
    ILoggerFactory loggerFactory, 
    IApplicationLifetime appLifetime,
    IOptions<HstsOptions> hstsOptions)
{ 
        app.UseHsts(hstsOptions.Value);
}

请注意,当您使用services.Configure时,您实际上正在注册您正在注册的事物的IOptions,并获得您使用该事件的.Value属性

答案 1 :(得分:1)

这是因为使用services.Configure<T>(...)时,您注册的不是完全T,而是IOptions<T>。 因此,您有两种方法。要么注册精确的T像

services.AddScoped(provider => provider.GetRequiredService<IOptions<T>>().Value);

或通过IOptions获得T

var options = services.GetService<IOptions<HstsOptions>>().Value;