c# - 使用 Ninject 过滤构造函数注入(inject)

标签 c# asp.net-mvc ninject

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

MVC 允许您覆盖其操作的几乎任何部分,我原以为这只是一个简单的案例,以类似于您创建自己的依赖项解析器的方式创建您自己的过滤器提供程序。

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

 public class UserValidationAttribute : ActionFilterAttribute
 {
    private IRepository repository;

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

最佳答案

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

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

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

关于c# - 使用 Ninject 过滤构造函数注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19014535/

相关文章:

c# - Multi-Tenancy 应用程序允许一个用户访问多个租户帐户?

asp.net-mvc - 在没有任何 DI 库的情况下使用依赖注入(inject)

c# - 将 TreeView 与 ObservableCollection 绑定(bind)

c# - 基于一组关键字进行搜索

c# - 在 data-originalvalue 属性中使用时,MVC 4 View Page 中的 Null Reference Exception?

c# - 验证: How to inject A Model State wrapper with Ninject?

c# - Ninject 未通过 Application_Start 中的 DependencyResolver 解析

c# - 编程语言,您可以在其中通过 引用数组元素。 (点)

c# - 当前上下文中不存在名称 'inputLength'

c# - Unity编辑器捕获 "hold mouse down and move"事件