2

我已經建立我的網站使用實體和存儲庫模式與ninject注入。我的問題是我的關係似乎沒有得到處理。我有大約30個知識庫(每個表有一個),我可以快速獲得SQL過期時間。我不能使用常規使用語句,因爲代碼在注入之前只識別接口。 (在每個控制器中,我有通過ninject注入的我的存儲庫接口實例)。實體和存儲庫模式與ninject,處置問題

我搜索了網絡,但找不到解決方案,對我來說是準確的。 任何人都可以幫我嗎? 代碼例如:

這是在ninject控制器下addBindings():

ninjectKernel.Bind<IMovieRepository>().To<MovieRepository>().InRequestScope(); 

和我的庫之一:

public class MovieRepository : IMovieRepository, IDisposable 
     { 
     private Entities dataContext = new Entities(); 
     public System.Data.Entity.DbContext DbContext 
     { 
      get { return dataContext ?? (dataContext = new Entities()); } 
     } 
     public void Dispose() { dataContext.Dispose(); } 
     } 

和在Global.asax文件:

ControllerBuilder.Current.SetControllerFactory(new NinjectControllerFactory() as IControllerFactory); 
+0

您能否顯示您的Ninject綁定和您的某個存儲庫類的示例?我對如何管理DbContext的生命週期感興趣。 – ngm 2012-04-21 08:40:10

+0

你在做什麼?在Global.asax中?您如何設置Ninject?如果可以的話,也許用這個代碼更新你的問題。 – ngm 2012-04-21 10:47:41

+0

@ngm:這是在ninject控制器下的addBindings:ninjectKernel.Bind ()。到()。InRequestScope();和我的一個倉庫:公共類MovieRepository:IMovieRepository,IDisposable { 私人實體dataContext =新實體(); public System.Data.Entity.DbContext DbContext { get {return dataContext ?? (dataContext = new Entities()); () } public void } } – 2012-04-21 10:49:05

回答

3

我猜你的儲存庫(因此可能是你的DbCo ntexts)被綁定在瞬時範圍內,我相信這意味着每當Ninject需要在某個地方注入一個時,就會創建一個新的。我不確定,但我猜測,這些都是在你的應用程序的整個生命週期中停留,也許不會被處置。

嘗試在請求範圍內綁定您的存儲庫,以便根據Web請求創建並處理它們。

例如

Bind<IFooRepository>().To<ConcreteFooRepository>().InRequestScope(); 

Ninject wiki

有四個內置範圍可在Ninject:

  • 瞬態 - 該類型的新實例會在每次請求一次創建。 (這是默認範圍)。綁定方法是.InTransientScope()
  • Singleton - 將只創建一個類型的單個實例,併爲每個後續請求返回相同的實例。綁定方法是.InSingletonScope()
  • 線程 - 將爲每個線程創建一個類型的實例。綁定方法是.InThreadScope()
  • 請求 - 該類型的一個實例將根據Web請求創建,並在請求結束時被銷燬。結合方法是.InRequestScope()
+0

actaully我在ninject版本2中使用inRequestScope,但我認爲,因爲我將我的實例從控制器移動到站點的不同部分,ninject不知道範圍在哪裏結束。 – 2012-04-21 10:36:31

3

這樣的問題如果長期生活的對象依賴於更短的生命物體,通常會出現。例如。單例服務在請求範圍中使用存儲庫。

+1

謹慎闡述? – 2012-04-22 20:44:29

+1

如果一個長活體對象,例如單例作用域中的服務依賴於較短的活動對象,這將適用於第一個請求。在第一次請求之後,對象將由ninject處理,因爲範圍已經結束。在下一個請求中,服務將嘗試使用導致異常的處置對象。 – 2012-04-22 20:51:21

+0

謝謝雷莫的小費。我使用的是InRequestScope()。這種方式我沒有得到處置對象的空例外。感謝您的 – 2012-04-23 06:55:52