将 IConfiguration 注入 ActionFilter

Shr*_*kar 4 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)
    {
        _configuration = configuration;
    }

    ...
}
Run Code Online (Sandbox Code Playgroud)

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

Dav*_*ang 6

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

public class MyActionFilter : ActionFilterAttribute
{
    private readonly IConfiguration _config;

    public MyActionFilter(IConfiguration config)
    {
        _config = config;
    }
}
Run Code Online (Sandbox Code Playgroud)

这会起作用,但这也意味着当您使用操作过滤器时,您需要提供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);
    }
}
Run Code Online (Sandbox Code Playgroud)

如果你appsettings.json有这样的事情:

{
  "recaptcha": {
    "secretKey": "xxx",
    "siteKey": "xxx",
    "version": "v3"
  }
}
Run Code Online (Sandbox Code Playgroud)

然后config.GetValue<>应该给你你想要访问的内容

在此处输入图片说明