Вставить IConfiguration в ActionFilter - PullRequest
0 голосов
/ 19 сентября 2019

Мы можем внедрить IConfiguration в класс следующим образом:

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

//Class
public class AppSettings
{
    private IConfiguration _configuration;

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

    ...
}

Теперь я пытаюсь внедрить IConfiguration в мой ActionFilter.Каков наилучший подход для этого?

1 Ответ

1 голос
/ 19 сентября 2019

В .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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...