Ninject,Web API和MVC 4 Filter Binding处理datacontext

时间:2012-09-29 18:34:45

标签: asp.net-mvc-4 ninject asp.net-web-api

我的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;
            }

2 个答案:

答案 0 :(得分:1)

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

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

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

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

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

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

ASP.NET MVC 3 and Global Filter Injection

答案 1 :(得分:0)

我最终不得不采取以下措施,没有任何效果。

var apiRepository = new ApiRepository(new DatabaseFactory());
                var apiAuthenticationService = new ApiAuthenticationService(apiRepository, new UnitOfWork(new DatabaseFactory()), new ValidationProvider(null));