关于asp.net core:ServiceProvider无法解析配置方法中的选项

ServiceProvider cannot resolve options in configure method

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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);
    }

}

这是因为在services.Configure< T >(...)中,您注册的不是确切的T,而是IOptions< T >
因此,您有两种方法。 要么注册确切的T喜欢

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

或通过IOptions获得T

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

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

1
2
3
4
5
6
7
8
9
public void Configure(
    IApplicationBuilder app,
    IHostingEnvironment env,
    ILoggerFactory loggerFactory,
    IApplicationLifetime appLifetime,
    IOptions<HstsOptions> hstsOptions)
{
        app.UseHsts(hstsOptions.Value);
}

请注意,当您使用services.Configure时,您实际上是在注册要注册的东西的IOptions,并使用该东西的.Value属性来获得该东西。