C# 将IConfiguration注入ActionFilter

C# 将IConfiguration注入ActionFilter,c#,asp.net-core,asp.net-core-2.1,C#,Asp.net Core,Asp.net Core 2.1,我们可以像这样将IConfiguration注入类: //Controller AppSettings obj = new AppSettings(_configuration); //Class public class AppSettings { private IConfiguration _configuration; public AppSettings(IConfiguration configuration) { _configurati

我们可以像这样将IConfiguration注入类:

//Controller
AppSettings obj = new AppSettings(_configuration);

//Class
public class AppSettings
{
    private IConfiguration _configuration;

    public AppSettings(IConfiguration configuration)
    {
        _configuration = configuration;
    }

    ...
}
{
  "recaptcha": {
    "secretKey": "xxx",
    "siteKey": "xxx",
    "version": "v3"
  }
}

现在我正试图将IConfiguration注入到ActionFilter中。最好的方法是什么?

在.NET Core 2.x中,
IConfiguration
已注册到DI,因此可以抓取。通常,您只需通过构造函数注入来注入
IConfiguration

公共类MyActionFilter:ActionFilterAttribute
{
专用只读IConfiguration\u config;
公共MyActionFilter(IConfiguration配置)
{
_config=config;
}
}
这将起作用,但这也意味着当您使用操作过滤器时,您需要提供
IConfiguration
作为参数之一:

如果您不必手动提供依赖项,那就更好了


改用
GetService
一种解决方法是在其中一个覆盖上获得所需的服务:

使用Microsoft.AspNetCore.Mvc.Filters;
使用Microsoft.Extensions.Configuration;
使用Microsoft.Extensions.DependencyInjection;
公共类MyActionFilter:ActionFilterAttribute
{
公共重写无效OnActionExecuting(ActionExecutingContext上下文)
{
var config=context.HttpContext.RequestServices.GetService();
字符串recomptchaversion=config.GetValue(“recomptcha:version”);
base.OnActionExecuting(上下文);
}
}
如果您的
appsettings.json
有如下内容:

//Controller
AppSettings obj = new AppSettings(_configuration);

//Class
public class AppSettings
{
    private IConfiguration _configuration;

    public AppSettings(IConfiguration configuration)
    {
        _configuration = configuration;
    }

    ...
}
{
  "recaptcha": {
    "secretKey": "xxx",
    "siteKey": "xxx",
    "version": "v3"
  }
}
然后,
config.GetValue
应该提供您想要访问的内容


将其以相同的方式注入过滤器。您有什么问题?您描述的问题只是将筛选器用作属性时的问题。并不是所有的过滤器都是属性,所以一般来说,在过滤器中使用构造函数注入是没有问题的。即使您需要将其用作属性,您仍然可以使用
ServiceFilterAttribute
(即
[ServiceFilter(typeof(myfilteratribute))]
)这是一个很好的示例。我当时正在研究Recpatca,看到了你的反应。这是正确的金钱与任务,我正在工作的移动Recpatca键的过滤器。