Настройте атрибут фильтра для внедрения зависимости, чтобы принимать параметры в конструкторе - PullRequest
7 голосов
/ 01 июня 2011

На этой странице .

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

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

.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 Ответ

16 голосов
/ 01 июня 2011

Вам необходимо сделать роли в свойстве вашего атрибута.

Атрибут:

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);
...