2010-06-04 63 views
3

我在過去幾天一直在使用Linq在存儲庫模式上搜索一下。這裏有很多信息,但它往往是矛盾的,我仍然在尋找一個明確的來源。Linq到SQL存儲庫應該實現IDisposable

我仍然不確定的事情之一是知識庫是否應該實例化它自己的DataContext並具有SubmitChanges方法,或者如果DataContext應該被注入並且提交在外部處理。我已經看到了這兩種設計,但沒有對推理做出真正的評論。

不管怎樣,下面的模式是很常見

class Repository<T> 
{ 
    DataContext db = new LinqDataContext(); 

    public IEnumerable<T> GetAll() { ... } 
    public T GetById() { ... } 

    ... etc 

    public void SubmitChanges() { ... } 
} 

所以我的主要問題是,與上述實施,爲什麼不倉庫需要實現IDisposable?我已經看過上面幾百個例子,並且他們中沒有一個似乎打擾了處理DataContext。這不是內存泄漏嗎?

+0

這是一個網站或「胖」的客戶? – 2010-06-04 16:07:28

回答

3

如果將autoclose設置爲false,則處置DataContext會關閉底層連接如果你不打電話處置,你必須等待GC給你打電話。您應該實現IDisposable並處置您的存儲庫,然後處理它們的DataContext。

另一個解決方案是爲您的存儲庫中的每個方法創建一個新的數據上下文,如果您的方法在單個事務中不能一起工作的話。然後,您可以通過using()指令立即處理上下文。

+0

如果你關閉了datacontext,那麼你不能提交你對返回對象的任何修改。那是對的嗎?或者,新的環境仍然可以解決哪些項目很髒? – fearofawhackplanet 2010-06-04 22:47:25

+0

每個實例都有它自己的狀態。在處理DataContext時,它釋放用於跟蹤更改的對象高速緩存。 – 2010-06-04 23:34:12

+0

MSDN聲明:一般來說,DataContext實例旨在持續一個「工作單元」,但您的應用程序定義了該術語。 DataContext是輕量級的,創建起來並不昂貴。典型的LINQ to SQL應用程序在方法範圍創建DataContext實例,或者作爲表示相關數據庫操作的邏輯集合的短期類的成員。 – 2010-06-04 23:34:57

相關問題