DbContext 在 ActionFilterAttribute 中处置,不会在后续请求中重新加载

neo*_*112 3 asp.net entity-framework dependency-injection ninject asp.net-web-api

我正在尝试将 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);
    }
Run Code Online (Sandbox Code Playgroud)

UOW 容器按照预期进行注入,并且在第一个请求时一切正常。在后续请求中,EF 抛出异常,表明 DbContext 已被释放。

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

我正在使用的 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;
    } 
Run Code Online (Sandbox Code Playgroud)

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

Rem*_*oor 5

过滤器由 WebApi 框架缓存和重用。因此,您不应该在请求范围内注入任何依赖项;使用工厂代替。

有关更多信息,请参阅文档