Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用Ninject的过滤器构造函数注入_C#_Asp.net Mvc_Ninject - Fatal编程技术网

C# 使用Ninject的过滤器构造函数注入

C# 使用Ninject的过滤器构造函数注入,c#,asp.net-mvc,ninject,C#,Asp.net Mvc,Ninject,我试图找到一种使用Ninject将构造函数依赖项注入过滤器的方法。我发现许多描述属性注入的文章现在被建议不要使用,但是文章的其余部分涉及工厂、定位器、全局包装器或存根属性的复杂设置 有了MVC,您几乎可以覆盖其操作的任何部分,我原以为这只是一个创建自己的过滤器提供程序的例子,与创建自己的依赖项解析程序的方式类似 现在允许注入的正确方法是什么?或者如果使用某些类型的过滤器与其他类型的过滤器相比,它是否变得更容易 public class UserValidationAttribute : Act

我试图找到一种使用Ninject将构造函数依赖项注入过滤器的方法。我发现许多描述属性注入的文章现在被建议不要使用,但是文章的其余部分涉及工厂、定位器、全局包装器或存根属性的复杂设置

有了MVC,您几乎可以覆盖其操作的任何部分,我原以为这只是一个创建自己的过滤器提供程序的例子,与创建自己的依赖项解析程序的方式类似

现在允许注入的正确方法是什么?或者如果使用某些类型的过滤器与其他类型的过滤器相比,它是否变得更容易

 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