我的datacontext在我的web api控制器附带的一个过滤器中偶尔会出现问题。这是为我的Web API控制器设置过滤器的正确方法吗?为什么我的datacontext有时会被处置?
由于已经处理了DbContext,因此无法完成操作。
Global.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;
}
答案 0 :(得分:1)
您应该使用Filter绑定语法,然后Ninject将处理过滤器生命周期,它还将处理过滤器的构造函数注入。
https://github.com/ninject/ninject.web.mvc/wiki/Filter-configurations
我也会让Ninject处理数据文本的生命周期,而不是使用工厂。
kernel.Bind<MyContext>().ToSelf().InRequestScope();
或者,如果您想要更好的可测试性,可以从接口派生您的上下文并绑定到该上下文。 InRequestScope确保整个Web请求的上下文存在,并且在请求完成时它将自动处理。您不必记住这样做,并且通过保留比单个请求更长的请求不会有任何内存泄漏。
你可以在这里看到一个例子:
答案 1 :(得分:0)
我最终不得不采取以下措施,没有任何效果。
var apiRepository = new ApiRepository(new DatabaseFactory());
var apiAuthenticationService = new ApiAuthenticationService(apiRepository, new UnitOfWork(new DatabaseFactory()), new ValidationProvider(null));