2012-05-05 21 views
0

我使用Ninject 2.0与MVC 2/EF 4项目为了注入我的存储库到我的控制器。我读过,当做这样的事情时,应该使用InRequestScope()绑定。当我这样做时,我会为每个请求获取一个新的存储库,但旧存储库不会被丢弃。由于旧的存储库保留在内存中,因此与同时存在的多个ObjectContexts发生冲突。Ninject 2.0 InRequestScope()导致我的问题 - 依赖没有被处置

我的具体信息库实现IDisposable:

public class HGGameRepository : IGameRepository, IDisposable 
{ 
    // ... 

    public void Dispose() 
    { 
     if (this._siteDB != null) 
     { 
      this._siteDB.Dispose(); 
     } 
    } 
} 

而且我Ninject代码:

public class NinjectControllerFactory : DefaultControllerFactory 
{ 
    private IKernel kernel = new StandardKernel(new HandiGamerServices()); 

    protected override IController GetControllerInstance(System.Web.Routing.RequestContext requestContext, Type controllerType) 
    { 
     try 
     { 
      if (controllerType == null) 
      { 
       return base.GetControllerInstance(requestContext, controllerType); 
       // return null; 
      } 
     } 
     catch (HttpException ex) 
     { 
      if (ex.GetHttpCode() == 404) 
      { 
       IController errorController = kernel.Get<ErrorController>(); 
       ((ErrorController)errorController).InvokeHttp404(requestContext.HttpContext); 

       return errorController; 
      } 
      else 
      { 
       throw ex; 
      } 
     } 

     return (IController)kernel.Get(controllerType); 
    } 

    private class HandiGamerServices : NinjectModule 
    { 
     public override void Load() 
     { 
      Bind<HGEntities>().ToSelf().InRequestScope(); 
      Bind<IArticleRepository>().To<HGArticleRepository>().InRequestScope(); 
      Bind<IGameRepository>().To<HGGameRepository>().InRequestScope(); 
      Bind<INewsRepository>().To<HGNewsRepository>().InRequestScope(); 
      Bind<ErrorController>().ToSelf().InRequestScope(); 
     } 
    } 
} 

我在做什么错?

+1

有没有你不使用[官方Ninject MVC扩展]一个原因(http://www.ninject.org/extensions.html )? –

+0

它工作瓦特/ MVC 2? –

+1

[是](https://github.com/ninject/ninject.web.mvc/wiki)。 –

回答

4

我很确定你错误地猜测你的对象没有被处置。这只是在你认为会发生时才会发生。但事实是,这确实发生在后面,除非你做错了什么,否则不应该给你任何问题ObjectContexts。无论如何,在高负载情况下,您将同时拥有很多ObjectContexts

但是,可能会成为问题的是内存使用量增加。这就是为什么请求范围需要主动发布的原因。 Ninject MVC扩展将会照顾到这一点。否则,看看在OnePerRequestModule,看看它是如何做:

https://github.com/ninject/Ninject.Web.Common/blob/master/src/Ninject.Web.Common/OnePerRequestHttpModule.cs