[TypeFilter(typeof(RolesFilterAttribute), …]
Это говорит о том, что тип фильтра, который вы хотите создать - RolesFilterAttribute
.В фильтре типов вы также передаете два аргумента "role"
и "abc1234"
.Поэтому, когда фильтр типов инициирует создание RolesFilterAttribute
, он будет искать конструктор, который принимает эти две строки.Но есть только один конструктор:
public RolesFilterAttribute()
: base(typeof(RolesFilterAttributeImpl))
{ }
Таким образом, у вас есть два параметра для конструктора без параметров.Вот почему вы получаете сообщение об ошибке.
Вместо этого вам нужно, чтобы атрибут [TypeFilter]
создал реальный фильтр.Таким образом, вам нужно передать тип RolesFilterAttributeImpl
:
[TypeFilter(typeof(RolesFilterAttributeImpl), Arguments = new object[] { "role", "abc1234" })]
В этот момент ваш RolesFilterAttribute
также станет избыточным, так что вы можете просто избавиться от него и просто определить RolesFilterAttributeImpl
(которыйЯ бы переименовал просто в RolesFilter
, поскольку это фильтр, а не атрибут или реализация атрибута.
Кроме того, поскольку вы используете [TypeFilter]
, вам не необходимо зарегистрироватьсяваш тип фильтра с вашим контейнером внедрения зависимости.Вам нужно только зарегистрировать зависимости вашего типа, поэтому в вашем случае только ValidateRoleClient
.
Таким образом, ваша реализация фильтра будет выглядеть так:
public class RolesFilter : IActionFilter
{
private readonly ValidateRoleClient validateRoleClient;
private readonly string role;
private readonly string secretKey;
public RolesFilter(string role, string secretKey, ValidateRoleClient validateRoleClient)
{
this.validateRoleClient = validateRoleClient;
this.role = role;
this.secretKey = secretKey;
}
public void OnActionExecuted(ActionExecutedContext context)
{
// …
}
public void OnActionExecuting(ActionExecutingContext context)
{ }
}
[TypeFilter]
это кстати.только один способ разрешить указание фильтров с использованием атрибутов.Вы также можете создать свой собственный атрибут, который на самом деле является просто фабрикой фильтров , которая отвечает за создание экземпляра фильтра во время выполнения.Это то, что [TypeFilter]
делает для вас по умолчанию.
См. Также мой связанный ответ на тему использования зависимостей в фильтрах MVC .