将 IConfiguration 注入 ActionFilter

Inject IConfiguration into ActionFilter

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

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

//Class
public class AppSettings
{
    private IConfiguration _configuration;

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

    ...
}

现在我正在尝试将 IConfiguration 注入我的 ActionFilter。执行此操作的最佳方法是什么?

在 .NET Core 2.x 中,IConfiguration 已经注册到 DI,因此可以获取了。通常你会通过构造函数注入注入 IConfiguration:

public class MyActionFilter : ActionFilterAttribute
{
    private readonly IConfiguration _config;

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

这可行,但这也意味着当您使用动作过滤器时,您需要提供 IConfiguration 作为参数之一:

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


改用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<> 应该给你你想要访问的内容