使用Ninject过滤构造函数注入

Joh*_*ebs 11 c# asp.net-mvc ninject

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

使用MVC允许你覆盖它的几乎任何操作部分,我认为这只是一个创建自己的过滤器提供程序的情况,就像你创建自己的依赖项解析器一样.

什么是现在正确的注射方式,或者如果你使用某些类型的过滤器与其他过滤器变得更容易?

 public class UserValidationAttribute : ActionFilterAttribute
 {
    private IRepository repository;

    public UserValidationAttribute(IRepository repository)
    {
        this.repository = repository;
    }
}
Run Code Online (Sandbox Code Playgroud)

sha*_*p00 18

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

首先,将您的属性替换为仅用作标记的"空"属性

public class UserValidationAttribute : Attribute { }
Run Code Online (Sandbox Code Playgroud)

然后创建一个过滤器类作为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
    }      
}
Run Code Online (Sandbox Code Playgroud)

然后你可以用类似的东西注册它

private static void RegisterServices(IKernel kernel)
{
    kernel.BindFilter<UserValidationFilter>(FilterScope.Action, 0)
        .WhenActionMethodHas<UserValidationAttribute>();
}
Run Code Online (Sandbox Code Playgroud)

如果属性本身具有构造函数参数,则可以将它们传递给

kernel.BindFilter<UserValidationFilter>(FilterScope.Action, 0)
    .WhenActionMethodHas<UserValidationAttribute>();
    .WithConstructorArgumentFromActionAttribute<UserValidationAttribute>("myParameter", attr => attr.MyParameter);
Run Code Online (Sandbox Code Playgroud)

BindFilter语法的一部分Ninject.Web.Mvc.FilterBindingSyntax.


Wik*_*hla 2

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