我正在编写将验证验证码的属性。为了正常工作,它需要知道秘密,我保留在设置中(秘密管理器工具)。但是,我不知道如何从属性类中读取配置。 asp.net核心中的DI支持构造函数注入(并且不支持属性注入),因此这将产生编译错误:
public ValidateReCaptchaAttribute(IConfiguration configuration)
{
if (configuration == null)
{
throw new ArgumentNullException("configuration");
}
this.m_configuration = configuration;
}
因为当我使用[ValidateReCaptcha]
修饰方法时,我无法通过配置
那么如何从属性类中的方法中读取config中的内容?
答案 0 :(得分:8)
您可以在此blog post和asp.net docs中使用ServiceFilter attribute
,更多信息。
[ServiceFilter(typeof(ValidateReCaptchaAttribute))]
public IActionResult SomeAction()
在Startup
public void ConfigureServices(IServiceCollection services)
{
// Add functionality to inject IOptions<T>
services.AddOptions();
// Add our Config object so it can be injected
services.Configure<CaptchaSettings>(Configuration.GetSection("CaptchaSettings"));
services.AddScoped<ValidateReCaptchaAttribute>();
...
}
ValidateReCaptchaAttribute
public class ValidateReCaptchaAttribute : ActionFilterAttribute
{
private readonly CaptchaSettings _settings;
public ValidateReCaptchaAttribute(IOptions<CaptchaSettings> options)
{
_settings = options.Value;
}
public override void OnActionExecuting(ActionExecutingContext context)
{
...
base.OnActionExecuting(context);
}
}
答案 1 :(得分:4)
你应该像这样使用ServiceFilter
:
[ServiceFilter(typeof(ValidateReCaptcha))]
如果您想使用IConfiguration
,则应将其注入ConfigureServices
:
services.AddSingleton((provider)=>
{
return Configuration;
});