C# 使用Ninject的过滤器构造函数注入
我试图找到一种使用Ninject将构造函数依赖项注入过滤器的方法。我发现许多描述属性注入的文章现在被建议不要使用,但是文章的其余部分涉及工厂、定位器、全局包装器或存根属性的复杂设置 有了MVC,您几乎可以覆盖其操作的任何部分,我原以为这只是一个创建自己的过滤器提供程序的例子,与创建自己的依赖项解析程序的方式类似 现在允许注入的正确方法是什么?或者如果使用某些类型的过滤器与其他类型的过滤器相比,它是否变得更容易C# 使用Ninject的过滤器构造函数注入,c#,asp.net-mvc,ninject,C#,Asp.net Mvc,Ninject,我试图找到一种使用Ninject将构造函数依赖项注入过滤器的方法。我发现许多描述属性注入的文章现在被建议不要使用,但是文章的其余部分涉及工厂、定位器、全局包装器或存根属性的复杂设置 有了MVC,您几乎可以覆盖其操作的任何部分,我原以为这只是一个创建自己的过滤器提供程序的例子,与创建自己的依赖项解析程序的方式类似 现在允许注入的正确方法是什么?或者如果使用某些类型的过滤器与其他类型的过滤器相比,它是否变得更容易 public class UserValidationAttribute : Act
public class UserValidationAttribute : ActionFilterAttribute
{
private IRepository repository;
public UserValidationAttribute(IRepository repository)
{
this.repository = repository;
}
}
假设属性是元数据的一部分,这意味着它应该在编译时实例化,那么任何ioc容器都不可能将存储库注入属性。容器在运行时运行。如果要向文件服务器注入依赖项,则需要使用属性注入而不是构造函数注入
public class UserValidationAttribute : ActionFilterAttribute
{
[Inject]
private IRepository repository { get; set; }
public UserValidationAttribute()
{
}
}
有一种方法可以使用构造函数注入
public class UserValidationAttribute : ActionFilterAttribute
{
[Inject]
private IRepository repository { get; set; }
public UserValidationAttribute()
{
}
}
首先,将属性替换为一个“空”属性,该属性仅用作标记
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>();
}
私有静态无效注册服务(IKernel内核)
{
kernel.BindFilter(FilterScope.Action,0)
.WhenActionMethodHas();
}
如果属性本身具有构造函数参数,则可以像
kernel.BindFilter<UserValidationFilter>(FilterScope.Action, 0)
.WhenActionMethodHas<UserValidationAttribute>();
.WithConstructorArgumentFromActionAttribute<UserValidationAttribute>("myParameter", attr => attr.MyParameter);
kernel.BindFilter(FilterScope.Action,0)
.WhenActionMethodHas();
.WithConstructorArgumentFromActionAttribute(“myParameter”,attr=>attr.myParameter);
BindFilter
语法是Ninject.Web.Mvc.FilterBindingSyntax的一部分。只是一个注释-一般的共识似乎是属性注入应该用于可选依赖项,而构造函数注入应该用于所需依赖项(哪种类型有意义?如果没有所需的依赖项,您无法构造类型,但属性可能无法根据容器可用的服务进行注入)我现在实现了一个方法,其中有一个全局过滤器,通过查看是否存在令牌属性来检查它是否适用。目前我没有得到的是,当我在操作上使用令牌属性并使用filterContext.ActionDescriptor.IsDefined(typeof(MyTokenAttribute),true)时
我得到了true
,但是如果我只在控制器上添加了token属性,我得到了false
。他的依赖项是一个存储库,似乎是必需的,所以它应该通过构造函数注入。另外,我觉得在类中散布IoC神奇属性是一种不好的模式。现在大多数IoC容器都支持injecting转换为MVC过滤器,包括Ninject、Unity v3和StructureMap