Asp.net mvc 4 mvc过滤器中的依赖项注入是全局的
我在mvc4、mvc5中使用unity和ninject。 我通过以下方式将服务或dbcontext作为公共属性注入操作筛选器: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 {
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中的代码。谢谢