【问题标题】:Inject IConfiguration into ActionFilter将 IConfiguration 注入 ActionFilter
【发布时间】:2019-09-19 22:00:29
【问题描述】:

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

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

//Class
public class AppSettings
{
    private IConfiguration _configuration;

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

    ...
}

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

【问题讨论】:

  • 您以同样的方式将其注入过滤器。你有什么问题?

标签: c# asp.net-core asp.net-core-2.1


【解决方案1】:

在 .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&lt;&gt;应该会给你你想要访问的东西

【讨论】:

  • 您描述的问题只是使用过滤器作为属性时的问题。并不是所有的过滤器都是属性,所以一般来说,在过滤器中使用构造函数注入是没有问题的。即使你需要将其用作属性,你仍然可以使用ServiceFilterAttribute(即[ServiceFilter(typeof(MyFilterAttribute))]
  • 很好的例子。我实际上正在研究 reCpatcha 并看到了您的回复。我正在做的任务是将 reCpatcha 键移动到过滤器,这很划算。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-02
  • 1970-01-01
  • 1970-01-01
  • 2019-09-11
  • 2015-10-25
相关资源
最近更新 更多