Настройте атрибут фильтра для внедрения зависимости, чтобы принимать параметры в конструкторе

Я следую за настройкой атрибута целевого фильтра на этой странице.

Для них у них есть:

.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);
Другие вопросы по тегам