2017-06-03 29 views
1

我知道這個問題之前已經被問過好幾次了,但是我找不到我正在尋找的答案。 所以,我已經實現了Repository(generic)和UOW模式,所以我可以使用EF訪問我的數據庫。這裏是UnitOfWork類的一部分:如何在工作單元模式中正確使用Dispose?

protected virtual void Dispose(bool disposing) 
    { 
     if (!disposed) 
     { 
      if (disposing) 
      { 
       entities.Dispose(); 
      } 
     } 
     this.disposed = true; 
    } 

    public void Dispose() 
    { 
     Dispose(true); 
     GC.SuppressFinalize(this); 
    } 

問題是:誰在調用void Dispose方法?我沒有看到該方法的用法示例。

這一點,單位上班類的上半部分:

private BDEntities entities = null; 

    public UnitOfWork() 
    { 
     if (entities == null) 
     { 
      entities = new BDEntities(); 
     } 
    } 

這是正確的?我應該使用「使用」嗎?如果是,那爲什麼我需要Dispose方法?

你能給我一個正確和簡單的用法的例子嗎?

謝謝 Rotem公司

回答

1

你之所以還沒有碰到過任何的例子來了解誰調用了處置是因爲UOW通常與依賴注入和依賴注入容器,像Autofac一起使用。在這種情況下,這個容器有責任創建對象並在以後處理它們。當然,這不是唯一可以使用UoW的方法,但它是一種常見模式。

至於回答你的問題:我認爲你採取的方法或多或少是正確的。 UoW類應該是包裝上下文的類,所以它應該是一個處理它的人(本質上,DbContext本身就是一個UoW)。

雖然您可以簡化Dispose方法。既然你沒有任何管理,也不能被IDisposable資源(如指針),它是完全足以叫在UOW的Dispose方法的情況下的處理方法:

public void Dispose() 
{ 
    entities.Dispose(); 
} 

(沒有其他Dispose方法,沒有SuppressFinalize調用)。

是的,你應該絕對使用using。這就是爲什麼你需要一個Dispose()方法;只有實現IDisposable類型的對象纔可用於using塊。如果你寫一個使用塊,它基本上轉化爲一個try-finally塊;您在使用塊內的代碼進入try塊,最後,調用Dispose()

+0

非常感謝!因此,基本上,該方法應該如下所示: if(entities == null) {0122}使用(entities = new BSODEntities()){}; } 我真的不需要Dispose方法,因爲「using」已經封裝了它?對? –

+0

是的,這基本上是我認爲應該使用的。至於Dispose()方法:如果使用using塊,則不必在完成對象時顯式調用它。但是你需要在你的類中實現它,所以它可以通過來自using塊的封裝調用來調用。 –

相關問題