2012-05-05 36 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