依赖注入的设置过滤器属性,以接受构造函数中的params

Sha*_*ean 7 asp.net-mvc ninject asp.net-mvc-3

我正在关注此页面上的ninject过滤器属性设置.

对他们来说,他们有:

.WithConstructorArgumentFromControllerAttribute<LogAttribute>(
      "logLevel", attribute => attribute.LogLevel);
Run Code Online (Sandbox Code Playgroud)

第二个参数是期待a Func<LogAttribute, object> callback.他们的实际参数列表设置如下:

Log(LogLevel = Level.Debug)
Run Code Online (Sandbox Code Playgroud)

但我的filter属性设置如下:

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

不知怎的,这是错误的.因为我希望我的过滤器看起来像:

[Auth("Admin", "Contrib")]
Run Code Online (Sandbox Code Playgroud)

我的绑定:

 kernel.BindFilter<AuthFilter>(FilterScope.Controller, 0)
            .WhenControllerHas<AuthAttribute>()
            .WithConstructorArgumentFromControllerAttribute<AuthAttribute>("roles", /*Stuck here*/)
Run Code Online (Sandbox Code Playgroud)

B Z*_*B Z 16

您需要将角色添加到属性中的属性中.

属性:

public class AuthAttribute : FilterAttribute 
{ 
  public string[] Roles { get; set; }

  public AuthAttribute(params string[] roles)
  {
      this.Roles = roles;
  }
}
Run Code Online (Sandbox Code Playgroud)

过滤:

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
  }
}
Run Code Online (Sandbox Code Playgroud)

调节器

   [AuthAttribute("a", "b")]
   public class YourController : Controller 
   {

   }
Run Code Online (Sandbox Code Playgroud)

捆绑:

kernel.BindFilter<AuthFilter>(FilterScope.Controller, 0)
            .WhenControllerHas<AuthAttribute>()
            .WithConstructorArgumentFromControllerAttribute<AuthAttribute>("roles", attribute => attribute.Roles);
Run Code Online (Sandbox Code Playgroud)