2013-01-17 39 views
5

我的應用程序中有一些「緩存」對象,它通過依賴注入(Ninject)獲得IRepository(自定義存儲庫模式契約)。這些對象只使用一次存儲庫,但它們具有強制所有者刷新自身的Refresh功能。他們是單身,創建只有一次,一個ManualResetEvent確保直到它加載的所有請求被阻塞。依賴注入單身數據連接的最佳方法

IRepositoriesEF CodeFirst基於,所以是OK只是簡單地確保連接被關閉並保持參照DbContext永遠存在?

我禁用了代理服務器和延遲加載,所以...可以從緩存對象的根到數百個這些緩存的POCO實體的長引用?

乾杯。

回答

0

最後我找到了最好的解決方案是創建一種新的包裝器:

public class Generator<T> where T : IDisposable 
    { 
     readonly Func<T> _generate; 
     public Generator(Func<T> generate) 
     { 
      _generate= generate; 
     } 

     public T Generate() 
     { 
      return _generate(); 
     } 
    } 

,並創建一個結合或多或少是這樣的:

// Dependency Injection bindings declaration section 
DI.Bind<Generator<IRepository>>() 
    .To(()=> new Generator<IRepository>(()=> DI.Get<IRepository>())); 

因此,長壽命的對象需要剛剛創建和銷燬的元素,我可以要求Generator<IRepository>服務,而不是IRepository。所以,每次我需要刷新的時候,我只是想創建一個新的IRepository,不知道它是如何打造的引擎蓋下:

using (var repository = repositoryGenerator.Generate()) 
{ 
    repository.DoStuff(); 
} 

它的工作原理就像一個魅力至今。

其實,我已經將這個特性添加到了我的DI框架中。我現在可以綁定IAnything,之後請求Generator,並且框架將使用此技術爲我提供完整的對象。How to create a Func<> delegate programmatically

乾杯。

2

我們參考朱莉·勒曼意見, http://msdn.microsoft.com/en-us/magazine/ee532098.aspx?sdmr=JulieLerman 的建議是有幾個/許多較小的環境和在Web方案的情況下創建一個新的上下文中的每個電話。 雖然她寫的關於實體框架和AppFabric的第二級緩存。

隨着時間的推移,上下文將包含許多對象,並且性能會相應下降。 我覺得這個網站有一些關於EF性能的好建議。 例如生成的視圖。 http://msdn.microsoft.com/en-us/data/hh949853

我個人的建議,我不能說是最好的做法,但是從關注表現的​​人來說,每個電話的小範圍界限是一個長期的妥協妥協。 使用生成的視圖,以保持初始加載時間儘可能小。

您可以通過從上下文中刪除未使用的對象的方式管理永久DBContext。或者使用帶有事件的高速緩存庫來執行此操作。不是一個小任務。

我會感興趣的你終於選擇解決方案。請發佈。

+0

感謝。我會讓你知道的 :) – vtortola