2014-01-22 25 views
2

所以我在我的項目中有一個包含所有業務邏輯的服務層。這是一個MVC項目,因此當用戶調用需要某些邏輯的頁面時,服務類將被實例化並使用(從控制器)。但它不會再被使用,因爲新的請求會再次實例化一個新的對象。我完成使用後應該處理一個服務(層)類嗎?

我應該在使用它們之後處理這些服務類(使用'using'語句嗎?或者我不會從中獲得任何好處,因爲垃圾回收器不會晚得多嗎? 如果是這種情況, 。同樣適用於使用我的資源庫對象我想

回答

4

取決於你的服務層使用的是什麼樣的資源

一般的經驗法則:

如果說有什麼用一些東西,然後實現IDisposable任何事情都應該實施IDisposable或致電Dispose()做什麼時

爲什麼?假設服務層使用數據庫連接。如果您不處理它們,它們將保持打開狀態,直到垃圾收集器收集它們,導致大量空閒連接。這也意味着ADO.NET連接池必須爲每個新的HTTP請求創建新連接,而不是重用舊連接(當池最終變空時)。

確保IDisposables被丟棄是一種有效利用資源的廉價方式。

所以,如果你有這樣的事情:

public class MyService 
{ 
    public MyRepository _repos = new MyRepository(); 

    // [...] 
} 

public class MyRepository 
{ 
    public SqlConnection _connection = new SqlConnection("..."); 

    // [...] 
} 

你應該改變你的回購開始IDisposable

public class MyRepository : IDisposable 
{ 
    public SqlConnection _connection = new SqlConnection("..."); 

    // [...] 

    public void Dipose() 
    { 
     _connection.Dispose(); 
    } 
} 

現在,如果我們要遵循的規則,我們要麼必須配置資源庫在使用Repos的方法中,或者在服務類中也實現IDisposable。我們做後者,因爲當調用者完成調用時(調用者可能調用服務中的兩種方法),我們現在不是真的。

public class MyService : IDisposable 
{ 
    public MyRepository _repos = new MyRepository(); 

    // [...] 

    public void Dipose() 
    { 
     _repos.Dispose(); 
    } 
} 

終於可以現在只是做到這一點在控制器到達佈置一切:

public ActionResult Execute() 
{ 
    using (var service = new MyService()) 
    { 
     service.CallA(); 
     service.CallB(); 
    } 
} 

我建議你遵循Dispose pattern

+0

謝謝你,我的倉庫使用databasa連接,但是,會議本身(nhibernate)我已經在使用'using(){}'所以我現在就離開它,也許如果我有時間了,我可以稍後做一些比較/測試:) – NeedACar

相關問題