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*/) ```