所以我在我的項目中有一個包含所有業務邏輯的服務層。這是一個MVC項目,因此當用戶調用需要某些邏輯的頁面時,服務類將被實例化並使用(從控制器)。但它不會再被使用,因爲新的請求會再次實例化一個新的對象。我完成使用後應該處理一個服務(層)類嗎?
我應該在使用它們之後處理這些服務類(使用'using'語句嗎?或者我不會從中獲得任何好處,因爲垃圾回收器不會晚得多嗎? 如果是這種情況, 。同樣適用於使用我的資源庫對象我想
所以我在我的項目中有一個包含所有業務邏輯的服務層。這是一個MVC項目,因此當用戶調用需要某些邏輯的頁面時,服務類將被實例化並使用(從控制器)。但它不會再被使用,因爲新的請求會再次實例化一個新的對象。我完成使用後應該處理一個服務(層)類嗎?
我應該在使用它們之後處理這些服務類(使用'using'語句嗎?或者我不會從中獲得任何好處,因爲垃圾回收器不會晚得多嗎? 如果是這種情況, 。同樣適用於使用我的資源庫對象我想
取決於你的服務層使用的是什麼樣的資源
一般的經驗法則:
如果說有什麼用一些東西,然後實現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
謝謝你,我的倉庫使用databasa連接,但是,會議本身(nhibernate)我已經在使用'using(){}'所以我現在就離開它,也許如果我有時間了,我可以稍後做一些比較/測試:) – NeedACar