2009-11-20 37 views
1

我有這段代碼。如何做清理?

創建上下文的新實例的基類。

public class Base 
{ 
     private Entities context; 

     public Base() 
     { 
      context = new Entities(); 
     } 
} 

而且比從這個類繼承的類。

public class SomeService : Base 
{ 

     public Gallery Get(int id) 
     { 
      return context.GallerySet.FirstOrDefault(g => g.id == id); 
     } 
} 

問題是,如何照顧配置上下文對象?我正在考慮在基類中的析構函數,我只需要調用上下文對象的dispose方法。

~Base() 
{ 
    context.Dispose(); 
} 

會這樣嗎?或者還有其他方式來照顧上下文對象嗎?

回答

6

您的基類應執行IDisposable而不是終結器。當您直接訪問非託管資源時(例如表示Windows句柄的IntPtr),您應該只有一個終結器。

但是,我會嘗試來找出一個沒有涉及到的設計。只要有可能,我儘量避免使用需要處理的成員變量 - 我傾向於在方法中獲取資源,將這些資源傳遞給其他方法,然後以獲取它們的相同方法處理它們。 IDisposable的實現越少,您可能需要管理的資源生命週期的複雜性就越少。顯然有時它是不可避免的...

+0

這有一定道理,你說怎麼樣IDisposable.But與上面的方法,我想擺脫使用在這樣 每一個方法調用使用的(實體上下文=新的實體()){ .... } SomeService類會有很多使用上下文對象的短方法。在每種方法中重複使用方法都是針對SOLID principe。 – user137348 2009-11-20 10:29:23

+0

儘管你仍然需要使用語句。例如,您不需要每個SomeService方法中的using語句 - 上下文可以傳遞到方法中。 – 2009-11-20 10:40:48

+0

同意@Jon。看看[這篇文章] [1]。 請注意,即使該文章按照通用設計模式(一次性模式) [1]進行分類,標題爲實現完成並處置以清理**非託管資源**:http://msdn.microsoft.com/ en-us/library/b1yfkh5e%28VS.71%29.aspx – 2009-11-20 11:18:53

1

在編寫析構函數時,實際上是錯誤的,因爲框架並不能保證上下文對象在最終確定的時候是有效的。

你應該在你的對象上實現IDisposable,並在那裏處理上下文。如果上下文具有非託管資源,則應該有自己的終結器。