我有asp.net核心应用程序。我想使用IOptions
模式从appsettings.json注入值。所以我有一个SecurityHeaderOptions
类,还有一个目标类SecurityHeadersBuilder
,它的构造函数接受IOptions<SecurityHeaderOptions>
作为参数。
我知道.net核心可以隐式地创建SecurityHeadersBuilder
的实例,方法是在向容器注册两者之后注入IOptions<SecurityHeaderOptions>
。
但是,我想显式地创建SecurityHeadersBuilder
的实例,调用它的一个方法,然后向容器注册该实例。
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方法
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
的构造函数中?
发布于 2018-09-11 17:45:55
使用.NET Core2,并且在ConfigureServices
中没有可用的提供程序(或者不想添加它),我选择了类似这样的东西(以操作码为例):
public void ConfigureServices(IServiceCollection services)
{
// secOpts available for use in ConfigureServices
var secOpts = Configuration
.GetSection("SecurityHeaderOptions")
.Get<SecurityHeaderOptions>();
...
}
发布于 2017-03-22 01:02:15
这就是我如何注册选项并注入到SecurityHeadersBuilder
中
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();
});
}
发布于 2017-03-22 00:37:01
关于你的问题:
1.是的,您需要注册选项,但我认为您这样做的方式是错误的(至少在您的示例中是这样)。您应该按如下方式注册:
services.Configure<SecurityHeaderOptions>(Configuration.GetSection("SecurityHeaderOptions"));
2.我相信我上面提到的正确注册会返回您所期望的结果。
3.只需注册它并将其放在SecurityHeaderBuilder
构造函数中就足够了。您不需要(默认的.NET Core IOC容器也不允许)在注册它时传递构造函数参数。为此,您需要使用其他IOC,如Autofac。
但是您需要注册SecurityHeadersBuilder
以便在其他类中使用它。只需要使用一个接口就可以了。
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
中将其注册为
services.AddScoped<ISecurityHeadersBuilder, SecurityHeadersBuilder>();
https://stackoverflow.com/questions/42932711
复制相似问题