我正在尝试找到一种方法来使用 Ninject 将构造函数依赖项注入过滤器。我发现许多描述属性注入的文章现在被建议反对,但其余的文章涉及工厂、定位器、全局包装器或存根属性的复杂设置。
由于 MVC 允许您覆盖其操作的几乎任何部分,我认为这只是以类似于创建自己的依赖项解析器的方式创建自己的过滤器提供程序的情况。
现在允许注入的正确方法是什么,或者如果您使用某些类型的过滤器而不是其他过滤器,它是否会变得更容易?
public class UserValidationAttribute : ActionFilterAttribute
{
private IRepository repository;
public UserValidationAttribute(IRepository repository)
{
this.repository = repository;
}
}
有一种方法可以使用构造函数注入。
首先,您将属性替换为"空"属性,将其用作标记
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 的一部分。
假设该属性是元数据的一部分,这意味着它应该在编译时实例化,因此不可能通过任何 ioc 容器将存储库注入到属性中。容器在运行时运行。
将依赖项注入文件管理器,则需要使用属性注入而不是构造函数注入。
public class UserValidationAttribute : ActionFilterAttribute
{
[Inject]
private IRepository repository { get; set; }
public UserValidationAttribute()
{
}
}
https://stackoverflow.com/a/7192754/296861