Настройте атрибут фильтра для внедрения зависимости, чтобы принимать параметры в конструкторе
Я следую за настройкой атрибута целевого фильтра на этой странице.
Для них у них есть:
.WithConstructorArgumentFromControllerAttribute<LogAttribute>(
"logLevel", attribute => attribute.LogLevel);
Второй параметр ожидает Func<LogAttribute, object> callback
, Их фактический список параметров настроен следующим образом:
Log(LogLevel = Level.Debug)
Но мой атрибут фильтра настроен следующим образом:
public class AuthAttribute : FilterAttribute { }
public class AuthFilter : IAuthorizationFilter
{
private readonly IUserService userService;
private string[] roles;
//Stuck on the constructor also. How do I accept params?
public AuthFilter(IUserService userService, params string[] roles)
{
this.userService = userService;
this.roles = roles;
}
public void OnAuthorization(AuthorizationContext filterContext)
{
throw new NotImplementedException();
}
}
Как-то это не так. Потому что я хочу, чтобы мой фильтр выглядел так:
[Auth("Admin", "Contrib")]
Мои привязки:
kernel.BindFilter<AuthFilter>(FilterScope.Controller, 0)
.WhenControllerHas<AuthAttribute>()
.WithConstructorArgumentFromControllerAttribute<AuthAttribute>("roles", /*Stuck here*/)
1 ответ
Решение
Вам нужно превратить роли в свойство в вашем атрибуте.
Атрибут:
public class AuthAttribute : FilterAttribute
{
public string[] Roles { get; set; }
public AuthAttribute(params string[] roles)
{
this.Roles = roles;
}
}
Фильтр:
public class AuthFilter : IAuthorizationFilter
{
private readonly IUserService userService;
private readonly string[] roles;
public AuthFilter(IUserService userService, string[] roles)
{
this.userService = userService;
this.roles = roles;
}
public void OnAuthorization(AuthorizationContext filterContext)
{
//do stuff
}
}
контроллер
[AuthAttribute("a", "b")]
public class YourController : Controller
{
}
Переплет:
kernel.BindFilter<AuthFilter>(FilterScope.Controller, 0)
.WhenControllerHas<AuthAttribute>()
.WithConstructorArgumentFromControllerAttribute<AuthAttribute>("roles", attribute => attribute.Roles);