11

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

使用 MVC 允许您覆盖其操作的几乎任何部分,我原以为这只是以与创建自己的依赖解析器类似的方式创建自己的过滤器提供程序的一种情况。

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

 public class UserValidationAttribute : ActionFilterAttribute
 {
    private IRepository repository;

    public UserValidationAttribute(IRepository repository)
    {
        this.repository = repository;
    }
}
4

3 回答 3

18

有一种方法可以使用构造函数注入。

首先,您将属性替换为“空”属性,您将仅将其用作标记

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的一部分。

于 2013-09-26T11:55:11.240 回答
2

假设属性是元数据的一部分,这意味着它应该在编译时被实例化,任何 ioc 容器都不可能将存储库注入到属性中。容器在运行时运行。

于 2013-09-25T21:38:15.083 回答
0

如果要将依赖项注入文件管理器,则需要使用属性注入而不是构造函数注入。

public class UserValidationAttribute : ActionFilterAttribute
{
    [Inject]
    private IRepository repository { get; set; }

    public UserValidationAttribute()
    {
    }
}

https://stackoverflow.com/a/7192754/296861

于 2013-09-25T21:45:02.410 回答