2

我有一个问题,我的数据上下文每隔一段时间就会在我的一个连接到我的 web api 控制器的过滤器中被处理。这是为我的 Web API 控制器设置过滤器的正确方法吗?为什么有时会处理我的数据上下文?

操作无法完成,因为 DbContext 已被释放。

全球.asax

GlobalConfiguration.Configuration.Filters
               .Add(new ApiValidationFilter(kernel.Get<IApiAuthenticationService>()));

kernel.Bind<IDatabaseFactory>()
      .To<DatabaseFactory>()
      .InScope(q => HttpContext.Current ?? StandardScopeCallbacks.Thread(q));

ApiValidationFilter.cs

public class ApiValidationFilter : System.Web.Http.Filters.IActionFilter
    {
            private readonly IApiAuthenticationService _apiAuthenticationService;

            public ApiValidationFilter(
                IApiAuthenticationService apiAuthenticationService)
            {
                _apiAuthenticationService = apiAuthenticationService;
            }
4

2 回答 2

1

您应该使用过滤器绑定语法,然后 Ninject 将处理过滤器的生命周期,它还将处理过滤器的构造函数注入。

https://github.com/ninject/ninject.web.mvc/wiki/Filter-configurations

我也会让 Ninject 处理管理数据上下文的生命周期,而不是使用工厂。

kernel.Bind<MyContext>().ToSelf().InRequestScope();  

或者,如果您想要更好的可测试性,您可以从接口派生上下文并绑定到该接口。InRequestScope 确保上下文存在于整个 Web 请求中,并且在请求完成时会自动释放。您不必记住这样做,并且通过持有比单个请求更长的请求不会有任何内存泄漏。

你可以在这里看到一个例子:

ASP.NET MVC 3 和全局过滤器注入

于 2012-09-29T19:34:43.737 回答
0

我最终不得不求助于以下方法,没有任何效果。

var apiRepository = new ApiRepository(new DatabaseFactory());
                var apiAuthenticationService = new ApiAuthenticationService(apiRepository, new UnitOfWork(new DatabaseFactory()), new ValidationProvider(null));
于 2012-10-25T22:11:22.117 回答