我正在尝试找到一种使用 Ninject 将构造函数依赖项注入(inject)过滤器的方法。我发现许多文章描述了现在不建议使用的属性注入(inject),但其余文章涉及工厂、定位器、全局包装器或 stub 属性的复杂设置。
MVC 允许您覆盖其操作的几乎任何部分,我原以为这只是一个简单的案例,以类似于您创建自己的依赖项解析器的方式创建您自己的过滤器提供程序。
现在允许注入(inject)的正确方法是什么,或者如果您使用某些类型的过滤器而不是其他类型,它会变得更容易吗?
public class UserValidationAttribute : ActionFilterAttribute
{
private IRepository repository;
public UserValidationAttribute(IRepository repository)
{
this.repository = repository;
}
}
最佳答案
有一种方法可以使用构造函数注入(inject)。
首先,您将您的属性替换为一个“空”属性,您将仅将其用作标记
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 的一部分。
关于c# - 使用 Ninject 过滤构造函数注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19014535/