2012-04-06 60 views
1

我在MVC4應用程序和Ninject.MVC3中使用EF 4.3。 控制器使用-Repository開關進行MVCscaffolded。 MVCScaffolder使用EF進行數據訪問,其中DbContext派生對象始終作爲每個腳手架存儲庫中的數據成員「新建」,從而創建存儲庫類(和相應的IRepository接口)。MVC3腳手架存儲庫中的Singleton DbContext派生對象

MyContext context = new MyContext(); 

腳手架控制器的性質使得對於每個控制器,您通常也會獲得相應的存儲庫。

問題:

1)是否有意義有對你有一個控制器,每個域對象存儲庫? 與存儲庫模式相比,這似乎違反直覺,其中只有聚合根應該暴露於

2)是否有意義有每次產生的 存儲庫對象被實例化一個的DbContext派生對象的新實例或是否有意義有一個與DI容器上註冊的 的DbContext派生對象的單一實例應用程序啓動並解決它在 單庫,像這樣:

Bind<MyContext>().To<MyContext>().InSingletonScope(); //ninject code on app startup 


//resolve context in repositories: 
MyContext context = ServiceLocator.Current.GetInstance<MyContext>(); 

有什麼缺點持有到一個派生的DbContext對象作爲 單爲應用程序的生命週期?

謝謝。

回答

2
  1. 這取決於你的期望。如果你想使用真正的倉庫,你將使用聚合根,你將自己編寫這些倉庫(不自動生成),因爲這樣的倉庫總是特定的。如果你只是想generic wrapper around EF你會使用你當前的解決方案。 T
  2. 對於您的控制器必須使用多個存儲庫並且必須協調將所有存儲庫中的數據保存在一起(工作單元模式)的場景,通常會根據HTTP請求使用新的上下文。 Don't use singleton context!
+0

這就是我也傾向於。謝謝確認 – 2012-04-07 17:49:31