将IConfiguration注入到ActionFilter中

5
我们可以像这样将IConfiguration注入到类中:
//Controller
AppSettings obj = new AppSettings(_configuration);

//Class
public class AppSettings
{
    private IConfiguration _configuration;

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

    ...
}

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


你可以以同样的方式将其注入到过滤器中。你遇到了什么问题? - Chris Pratt
1个回答

10
在.NET Core 2.x中,IConfiguration已经注册到DI中,因此可以直接使用。通常情况下,您只需通过构造函数注入来获取IConfiguration:
public class MyActionFilter : ActionFilterAttribute
{
    private readonly IConfiguration _config;

    public MyActionFilter(IConfiguration config)
    {
        _config = config;
    }
}

那样可以实现,但也意味着当使用操作筛选器时,需要提供IConfiguration作为其中一个参数: enter image description here 最好不要手动提供依赖项。
使用GetService<>是解决问题的一种方法:
在其中一个覆盖重写方法中获取所需的服务即可。
using Microsoft.AspNetCore.Mvc.Filters;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;

public class MyActionFilter : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext context)
    {
        var config = context.HttpContext.RequestServices.GetService<IConfiguration>();

        string recaptchaVersion = config.GetValue<string>("recaptcha:version");

        base.OnActionExecuting(context);
    }
}

如果你的 appsettings.json 文件有以下内容:

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

那么config.GetValue<>应该给你想要访问的内容。

enter image description here


您所描述的问题仅在将过滤器用作属性时才存在问题。并非所有过滤器都是属性,因此一般来说,在过滤器中使用构造函数注入没有问题。即使您需要将其用作属性,您仍然可以使用 ServiceFilterAttribute(即 [ServiceFilter(typeof(MyFilterAttribute))])。 - Chris Pratt
很好的例子。我正在处理reCaptcha并看到了你的回复。它非常适合我正在处理的将reCaptcha密钥移动到过滤器的任务。 - Elim Garak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接