Asp.net mvc 4 mvc过滤器中的依赖项注入是全局的

Asp.net mvc 4 mvc过滤器中的依赖项注入是全局的,asp.net-mvc-4,dependency-injection,asp.net-mvc-5,Asp.net Mvc 4,Dependency Injection,Asp.net Mvc 5,我在mvc4、mvc5中使用unity和ninject。 我通过以下方式将服务或dbcontext作为公共属性注入操作筛选器: public class MyActionFilterAttribute: FilterAttribute,IActionFilter { [Inject] public IDbContext DbContext { get; set; } [Inject] public IProductService ProductService {

我在mvc4、mvc5中使用unity和ninject。 我通过以下方式将服务或dbcontext作为公共属性注入操作筛选器:

 public class MyActionFilterAttribute: FilterAttribute,IActionFilter
{
    [Inject]
    public IDbContext DbContext { get; set; }
    [Inject]
    public IProductService ProductService { get; set; }


    public void OnActionExecuting(ActionExecutingContext filterContext)
    {
        Debug.WriteIf(DbContext == null, "db context is null");
        Debug.WriteIf(ProductService == null, "productservice is null");


    }
    public void OnActionExecuted(ActionExecutedContext filterContext)
    { }
}
}

如果我注册了一个全局过滤器,
filters.Add(新的MyActionFilterAttribute())
DbContext和ProductService始终为空。 但如果我将[MyActionFilter]属性标记到控制器,一切都会正常工作。
我想将一些筛选器注册为全局筛选器,请提供帮助。

您正在注册这样的全局筛选器
筛选器。添加(新的MyActionFilterAttribute())您正在注册筛选器实例。每次调用都将使用相同的实例。此实例没有填充依赖项,因为您是使用默认构造函数自己创建的,而不是从容器中解析它。当然,您不能在全局筛选器注册期间解析筛选器的实例,因为您的依赖项(例如DbContext)需要根据请求确定作用域

所以你有4个选择

  • 使用动作过滤器装饰所有控制器
  • 创建控制器基类,用动作过滤器装饰该类,然后从该类派生所有控制器
  • 在操作筛选器代码中使用某种形式的服务定位器,以便在每次需要时从容器中解析依赖项。然后可以将过滤器注册为全局过滤器
  • 创建自定义的
    IFilterProvider
    ,并在
    GetFilters
    方法中从容器解析过滤器。然后注册你的提供者
    FilterProviders.Providers.Add(新的MyFilterProvider(双容器))

简单的例子是在NinjectWebCommon类中全局注册过滤器,您可以这样做:

kernel.BindFilter<MyActionFilterAttribute>(FilterScope.Global, 1).InRequestScope();
kernel.BindFilter(FilterScope.Global,1.InRequestScope();

并从全局删除该行。asax

无法理解最后的建议。请写一个简短的例子好的答案,但是的,最后一个选项的例子是好的。扩展方法中的kernel.BindFilter在哪个类中?我没有。2.是否应删除全局筛选器。添加?3.在global.asax中删除哪一行?1)您在问题中说您使用了Ninject,所以它使用了一个名为NinjectWebCommon的类,通常在App_Start文件夹中。在RegisterServices方法中注册绑定。2) 必须删除筛选器。添加(新的MyActionFilterAttribute());从你的Global.asax这个方法更适合我,因为我不接触ActionFilterAttribute中的代码。谢谢