DbContext在ActionFilterAttribute中处理,而不是在后续请求中重新加载

时间:2014-05-25 13:28:49

标签: asp.net entity-framework asp.net-web-api dependency-injection ninject

我正在尝试将UOW容器注入WebApi 2 actionfilter属性

 public class VerifyApiToken : ActionFilterAttribute
{
    [Inject]
    public IUOW Uow { get; set; }

    public override void OnActionExecuting(HttpActionContext actionContext)
    {
       //get and save data to any repository in the uow container
       base.OnActionExecuting(actionContext);
    }

UOW容器被注入就像它应该的那样,并且在第一个请求时一切正常。在后续请求中,EF抛出一个异常,说明已经处理了DbContext。

所有依赖项都绑定在请求范围内,因此基础dbcontext的处理是正常的。在WebApi控制器中使用构造函数注入时,一切正常,在每个请求上重新创建资源,为什么在尝试在ActionFilterAttributes中使用Property注入时不会重新创建它们,以及如何解决这个问题?

我正在使用的IFilterProvider:

 public IEnumerable<FilterInfo> GetFilters(HttpConfiguration configuration, HttpActionDescriptor actionDescriptor)
    {
        IEnumerable<FilterInfo> controllerFilters = actionDescriptor.ControllerDescriptor.GetFilters().Select(instance => new FilterInfo(instance, FilterScope.Controller));
        IEnumerable<FilterInfo> actionFilters = actionDescriptor.GetFilters().Select(instance => new FilterInfo(instance, FilterScope.Action));
        IEnumerable<FilterInfo> filters = controllerFilters.Concat(actionFilters);

        foreach (FilterInfo filter in filters)
        {
            _kernel.Inject(filter.Instance);
        }
        return filters;
    } 

“Inject”方法描述说“注入指定的实例,而不管理其生命周期”。所以我认为我的VerifyApiToken属性在每个App生命周期(基本上是Application_Start)注入一次,因此在以下请求中使用相同的实例(当然使用处理的DbContext)。 是否可以将Ninject配置为在ActionFilterAttributes中为每个请求使用新的IUOW容器?

2 个答案:

答案 0 :(得分:4)

过滤器是Web Api Framework的缓存和重用。因此,您不应在请求范围中注入任何依赖;改为使用工厂。

有关详细信息,请参阅documentation

答案 1 :(得分:1)

我能够关注qujck的提示,而是将一个Func注入actionfilter。

需要以下绑定:

kernel.Bind<Func<IUOW>>().ToMethod(m => () => m.Kernel.Get<IUOW>());