有一种使用构造函数注入的方法。
首先,您将属性替换为一个“空”的属性,这只是一个标记。
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)
{
}
public void OnActionExecuted(ActionExecutedContext filterContext)
{
}
}
然后你可以像下面这样将其注册:
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 的一部分。
filterContext.ActionDescriptor.IsDefined(typeof(MyTokenAttribute), true)
时,我得到true
,但如果我只将令牌属性放在控制器上,则为false
。 - John Freebs