Setup filter attribute for dependency injection to accept params in constructor

asp.net-mvc, asp.net-mvc-3, ninject

Solution

You need to make roles into a property in your attribute.

Attribute:

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

  public AuthAttribute(params string[] roles)
  {
      this.Roles = roles;
  }
}

Filter:

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
  }
}

Controller

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

   }

Binding:

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

Problem

I'm following a ninject filter attribute setup on this page. For them, they have: ``` .WithConstructorArgumentFromControllerAttribute<LogAttribute>( "logLevel", attribute => attribute.LogLevel); ``` The second parameter is expecting a `Func<LogAttribute, object> callback`. Their actual param list is setup as follows: ``` Log(LogLevel = Level.Debug) ``` But my filter attribute is setup as follows: ``` 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(); } } ``` Somehow this is wrong. Because I want my filter to look like: ``` [Auth("Admin", "Contrib")] ``` My bindings: ``` kernel.BindFilter<AuthFilter>(FilterScope.Controller, 0) .WhenControllerHas<AuthAttribute>() .WithConstructorArgumentFromControllerAttribute<AuthAttribute>("roles", /*Stuck here*/) ```

Original source

Related problems