首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在ConfigureServices方法中获取IOptions?

如何在ConfigureServices方法中获取IOptions?
EN

Stack Overflow用户
提问于 2017-03-22 00:18:34
回答 5查看 28.7K关注 0票数 51

我有asp.net核心应用程序。我想使用IOptions模式从appsettings.json注入值。所以我有一个SecurityHeaderOptions类,还有一个目标类SecurityHeadersBuilder,它的构造函数接受IOptions<SecurityHeaderOptions>作为参数。

我知道.net核心可以隐式地创建SecurityHeadersBuilder的实例,方法是在向容器注册两者之后注入IOptions<SecurityHeaderOptions>

但是,我想显式地创建SecurityHeadersBuilder的实例,调用它的一个方法,然后向容器注册该实例。

代码语言:javascript
复制
public sealed class SecurityHeaderOptions
{
    public string FrameOption { get; set; }    
    public string XssProtection { get; set; }
}


public class SecurityHeadersBuilder
{
    private readonly SecurityHeaderOptions _options = null;

    public SecurityHeadersBuilder(IOptions<SecurityHeaderOptions> options)
    {
        _options = options.Value;    
    }

    public SecurityHeadersBuilder AddDefaultPolicy()
    {
        AddFrameOptions();
        AddConetntSecurityPolicy();
        return this;
    }
}

ConfigureServices方法

代码语言:javascript
复制
public void ConfigureServices(IServiceCollection services)
{        
    services.Configure<SecurityHeaderOptions>(Configuration.GetSection("SecurityHeaderOptions"));

    services.AddScoped<SecurityHeadersBuilder>(provider => 
           new SecurityHeadersBuilder(?????).AddDefaultPolicy())
}

问题

1>如果我显式地将选项传递给构造函数,我需要使用service.Configure方法在容器中注册SecurityHeaderOptions吗?

2> Configuration.GetSection("SecurityHeaderOptions")无法返回IOptions<SecurityHeaderOptions>的实例,而是返回IConfigurationSection

如何检索SecurityHeaderOptions并将其传递到SecurityHeadersBuilder的构造函数中?

EN

回答 5

Stack Overflow用户

发布于 2018-09-11 17:45:55

使用.NET Core2,并且在ConfigureServices中没有可用的提供程序(或者不想添加它),我选择了类似这样的东西(以操作码为例):

代码语言:javascript
复制
public void ConfigureServices(IServiceCollection services)
{
    // secOpts available for use in ConfigureServices
    var secOpts = Configuration
        .GetSection("SecurityHeaderOptions")
        .Get<SecurityHeaderOptions>();

    ...
}
票数 62
EN

Stack Overflow用户

发布于 2017-03-22 01:02:15

这就是我如何注册选项并注入到SecurityHeadersBuilder

代码语言:javascript
复制
public void ConfigureServices(IServiceCollection services)
{
    services.Configure<SecurityHeaderOptions>(Configuration.GetSection("SecurityHeaderOptions"));            
    services.AddScoped<SecurityHeadersBuilder>(provider =>
    {
        var option = provider.GetService<IOptions<SecurityHeaderOptions>>();
        return new SecurityHeadersBuilder(option)
            .AddDefaultPolicy();
    });
}
票数 15
EN

Stack Overflow用户

发布于 2017-03-22 00:37:01

关于你的问题:

1.是的,您需要注册选项,但我认为您这样做的方式是错误的(至少在您的示例中是这样)。您应该按如下方式注册:

代码语言:javascript
复制
services.Configure<SecurityHeaderOptions>(Configuration.GetSection("SecurityHeaderOptions"));

2.我相信我上面提到的正确注册会返回您所期望的结果。

3.只需注册它并将其放在SecurityHeaderBuilder构造函数中就足够了。您不需要(默认的.NET Core IOC容器也不允许)在注册它时传递构造函数参数。为此,您需要使用其他IOC,如Autofac。

但是您需要注册SecurityHeadersBuilder以便在其他类中使用它。只需要使用一个接口就可以了。

代码语言:javascript
复制
public interface ISecurityHeadersBuilder
{
    SecurityHeadersBuilder AddDefaultPolicy();    
}

public class SecurityHeadersBuilder : ISecurityHeadersBuilder
{
    private readonly SecurityHeaderOptions _options = null;

    public SecurityHeadersBuilder(IOptions<SecurityHeaderOptions> options)
    {
        _options = options.Value;    
    }

    public SecurityHeadersBuilder AddDefaultPolicy()
    {
        AddFrameOptions();
        AddContentSecurityPolicy();
        return this;
    }
}

然后,只需在startup.cs中将其注册为

代码语言:javascript
复制
services.AddScoped<ISecurityHeadersBuilder, SecurityHeadersBuilder>();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42932711

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档