2016-08-16 5 views
0

Ich habe zwei Klassen:Entsorgung Basisklasse vor der Klasse geerbt

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

Die Dispose Methode der abgeleiteten Klasse normalerweise wie folgt aussieht:

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

     // Unmanaged. 

     this.Disposed = true; 
    } 

    base.Dispose(disposing); 
} 

ich immer den Anruf zu base.Dispose(disposing) gesehen habe an das Ende der Methode. Doch in einem aktuellen Szenario besteht ein Bedarf an Objekten der Basisklasse, bevor Objekte in der abgeleiteten Klasse zu verfügen wie folgt:

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

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

     // Unmanaged. 

     this.Disposed = true; 
    } 
} 

Ich bin nicht sicher, ob diese schlechte Praxis betrachtet wird. Gibt es etwas, auf das man achten sollte?

+3

Ich vermute, dass Sie diese Variante nicht sehen, weil es ungewöhnlich ist, diese Anforderung zu haben - könnten Sie ein bisschen mehr Details darüber, warum die Basisklasse * * zuerst 'Dispose' muss, teilen? Es würde darauf hindeuten, dass Sie einige Gruppen von Klassen mit ungewöhnlichen Lebenszeiten oder Beziehungen haben. –

+0

@Damien_The_Unbeliever: Ich werde den Kontext in einer Follow-up-Nachricht erklären. Siehst du in der Zwischenzeit irgendwelche allgemeinen Probleme mit dieser Variante? –

+0

@Damien_The_Unbeliever: Die 'UnitOfWorkBase' Klasse enthält ein generisches' IDbTransaction' Objekt während die 'UnitOfWorkSql' Klasse ein konkretes' DbContext' Objekt enthält. Ich habe beschlossen, das Transaktionsobjekt in der Basisklasse zu belassen, da alle vorhersehbaren Datenbankplattformen IDbTransaction verwenden. Außerdem möchte ich das tatsächliche Transaktionsobjekt nicht als "öffentlich" oder "geschützt" offen legen. Die 'UnitOfWorkSql'-Klasse wird also immer in eine' using'-Anweisung eingebunden, während das 'private'-Transaktionsobjekt zuerst entsorgt werden muss. Hoffnung, die Sinn macht. –

Antwort

1

Ich denke, dass Sie das übliche Muster hier brechen sollten. Statt:

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

schreiben so etwas wie:

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

     CloseUnmanagedOverride(); 
    } 

    protected virtual void DisposeManagedOverride() {} 

    protected virtual void CloseUnmanagedOverride() {} 
} 

Auf diese Weise werden Sie die richtige Reihenfolge der Freigabe Ressourcen gewährleisten.

Verwandte Themen