有一种方法可以使用构造函数注入。
首先,您将属性替换为“空”属性,您将仅将其用作标记
public class UserValidationAttribute : Attribute { }
然后创建一个过滤器类作为IActionFilter
.
public class UserValidationFilter : IActionFilter
{
private readonly IRepository repository;
public UserValidationFilter(IRepository repository)
{
this.repository = repository;
}
public void OnActionExecuting(ActionExecutingContext filterContext)
{
//do something
}
public void OnActionExecuted(ActionExecutedContext filterContext)
{
//do something
}
}
然后你可以用类似的东西注册它
private static void RegisterServices(IKernel kernel)
{
kernel.BindFilter<UserValidationFilter>(FilterScope.Action, 0)
.WhenActionMethodHas<UserValidationAttribute>();
}
如果你的属性本身有构造函数参数,你可以像这样传递它们
kernel.BindFilter<UserValidationFilter>(FilterScope.Action, 0)
.WhenActionMethodHas<UserValidationAttribute>();
.WithConstructorArgumentFromActionAttribute<UserValidationAttribute>("myParameter", attr => attr.MyParameter);
该BindFilter
语法是Ninject.Web.Mvc.FilterBindingSyntax的一部分。