ASP.NET Core 2.1 Как вызвать фильтр, который ссылается на класс - PullRequest
0 голосов
/ 17 октября 2018

У меня есть этот фильтр действий, который я хочу вызвать из функции.Однако в этом фильтре я имею в виду другой класс, называемый ValidateRoleClient.Как я могу сделать сервисный впрыск?Или правильно вызвать этот класс в моей функции?

public class RolesFilterAttribute : ActionFilterAttribute
{
    public ValidateRoleClient validateRoleClient;
    public string Role { get; set; }

    public RolesFilterAttribute(ValidateRoleClient validateRoleClient)
    {
        this.validateRoleClient = validateRoleClient;
    }

    public override void OnActionExecuting(ActionExecutingContext context)
    {
        if (context.HttpContext.Request.Cookies["Token"] != null || context.HttpContext.Request.Cookies["RefreshToken"] != null)
        {
            TokenViewModel tvm = new TokenViewModel
            {
                Token = context.HttpContext.Request.Cookies["Token"],
                RefreshToken = context.HttpContext.Request.Cookies["RefreshToken"]
            };
            ValidateRoleViewModel vrvm = new ValidateRoleViewModel
            {
                Role = Role,
                Token = tvm
            };
            validateRoleClient.ValidateRole(vrvm);
        }
    }
}

Вот как я ссылаюсь на фильтр в моей функции

[RolesFilter]
public IActionResult About()
{
    return View();
}

Текущая ошибка, которую я получаю от этого

Код серьезности Описание Состояние подавления строки файла проекта CS7036 Не указан аргумент, соответствующий необходимому формальному параметру 'validateRoleClient' из 'RolesFilterAttribute.RolesFilterAttribute (ValidateRoleClient)'

1 Ответ

0 голосов
/ 17 октября 2018

Вы можете заключить свой атрибут в FilterFactory следующим образом:

public class RolesFilterAttribute : Attribute, IFilterFactory
{
    public string Role { get; set; }       

    public IFilterMetadata CreateInstance(IServiceProvider serviceProvider)
    {
        return new RolesFilterAttributeImplementation(
            serviceProvider.GetRequiredService<ValidateRoleClient>(),
            Role
        );
    }

    private class RolesFilterAttributeImplementation : ActionFilterAttribute
    {
        private readonly ValidateRoleClient validateRoleClient;
        private readonly string role;

        public RolesFilterAttributeImplementation(ValidateRoleClient validateRoleClient, string role)
        {
            this.validateRoleClient = validateRoleClient;
            this.role = role;
        }

        public override void OnActionExecuting(ActionExecutingContext context)
        {
            if (context.HttpContext.Request.Cookies["Token"] != null || context.HttpContext.Request.Cookies["RefreshToken"] != null)
            {
                TokenViewModel tvm = new TokenViewModel
                {
                    Token = context.HttpContext.Request.Cookies["Token"],
                    RefreshToken = context.HttpContext.Request.Cookies["RefreshToken"]
                };
                ValidateRoleViewModel vrvm = new ValidateRoleViewModel
                {
                    Role = role,
                    Token = tvm
                };
                validateRoleClient.ValidateRole(vrvm);
            }
        }
    }

    public bool IsReusable => false;
}

Конечно, сначала необходимо настроить службу ValidateRoleClient для инъекции.

Затем можно использоватьатрибут RolesFilterAttribute, как обычно.

А подробнее о IFilterFactory вы можете прочитать здесь: https://docs.microsoft.com/en-us/aspnet/core/mvc/controllers/filters?view=aspnetcore-2.1#ifilterfactory

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