2016-08-16 86 views
0

之前,我有兩個類:處置基類繼承

public abstract class UnitOfWorkBase: IDisposable { } 
public sealed class UnitOfWorkSql: UnitOfWorkBase { } 

派生類的Dispose方法通常是這樣的:

protected override void Dispose (bool disposing) 
{ 
    if (!this.Disposed) 
    { 
     if (disposing) 
     { 
      // Managed. 
     } 

     // Unmanaged. 

     this.Disposed = true; 
    } 

    base.Dispose(disposing); 
} 

我始終認爲,在調用base.Dispose(disposing)該方法的結束。然而,在最近的情況下,有必要在派生類對象之前,將基類的對象如下:

protected override void Dispose (bool disposing) 
{ 
    base.Dispose(disposing); 

    if (!this.Disposed) 
    { 
     if (disposing) 
     { 
      // Managed. 
     } 

     // Unmanaged. 

     this.Disposed = true; 
    } 
} 

我不知道,如果這被認爲是不好的做法。有什麼需要注意的嗎?

+3

我懷疑你沒有看到這個變體,因爲有這個需求是不常見的 - 你可以分享一些關於爲什麼基類*需要*的細節來首先處理?這往往表明你有一些具有不尋常的生命週期或關係的類。 –

+0

@Damien_The_Unbeliever:我將在後續消息中解釋上下文。與此同時,你看到這個變體的一般陷阱嗎? –

+0

@Damien_The_Unbeliever:'UnitOfWorkBase'類包含一個通用的'IDbTransaction'對象,而'UnitOfWorkSql'類包含一個具體的'DbContext'對象。我選擇將事務對象保留在基類中,因爲所有可預見的數據庫平臺都將使用'IDbTransaction'。另外,我不想將實際的交易對象公開爲'public'或'protected'。所以'UnitOfWorkSql'類總是包裝在'using'語句中,而'private'事務對象需要首先處理。希望這是有道理的。 –

回答

1

我認爲你應該打破這裏通常的模式。相反的:

class BaseClass 
{ 
    protected virtual void Dispose(bool disposing) 
    { 
     if (disposing) 
     { 
      //dispose my resources 
     } 
    } 
} 

寫類似:

class BaseClass 
{ 
    private void Dispose(bool disposing) 
    { 
     if (disposing) 
     { 
      //dispose my resources 
      DisposeManagedOverride(); 
     } 

     CloseUnmanagedOverride(); 
    } 

    protected virtual void DisposeManagedOverride() {} 

    protected virtual void CloseUnmanagedOverride() {} 
} 

這樣,您將確保資源釋放正確的順序。