【问题标题】:dependency injection in mvc filter which is globalmvc过滤器中的依赖注入是全局的
【发布时间】:2015-12-17 19:51:10
【问题描述】:

我在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(new MyActionFilterAttribute()); DbContext 和 ProductService 始终为空。 但是,如果我将 [MyActionFilter] 属性标记为 Controller,一切正常。 我想将一些过滤器注册为全局过滤器,请帮忙。

【问题讨论】:

    标签: asp.net-mvc-4 dependency-injection asp.net-mvc-5


    【解决方案1】:

    您正在注册像这样的全局过滤器filters.Add(new MyActionFilterAttribute()); 您正在注册过滤器实例。每次调用都将使用相同的实例。此实例没有填充您的依赖项,因为您使用默认构造函数自己创建了它,而不是从容器中解析它。当然,您无法在全局过滤器注册期间解析过滤器的实例,因为您的依赖项(例如 DbContext)需要根据请求进行限定。

    所以你有 4 个选项。

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

    【讨论】:

    • 无法理解最后的建议。请写一个简短的例子
    • 很好的答案,但是是的,欢迎使用最后一个选项的示例
    【解决方案2】:

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

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

    并从 Global.asax 中删除该行

    【讨论】:

    • 1. kernel.BindFilter 在什么类的扩展方法中?我没有。 2.我应该删除全局过滤器。添加吗? 3. global.asax 中删除哪一行?
    • 1)您在问题中说您使用 Ninject,因此它使用了一个名为 NinjectWebCommon 的类,通常位于 App_Start 文件夹中。在 RegisterServices 方法中注册绑定。 2) 您必须删除过滤器。Add(new MyActionFilterAttribute());从您的 Global.asax
    • 这种方式更适合我,因为我不接触 MyActionFilterAttribute 中的代码。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2021-10-13
    • 1970-01-01
    • 1970-01-01
    • 2020-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多