7

Mi è stato detto che ho bisogno di dispose of instances of my Entity Framework repository classes e ho creato una classe base per applicare questa implementazione.Devo implementare IDisposable su tutte le classi o è sufficiente una classe base?

Ho bisogno di verificare con gli esperti: è accettabile implementare IDisposable attraverso una classe base?

Si noti che la classe repository non ha variabili membro della classe.

/// Sample repository. Note that I return List<T> as IEnumerable, 
/// and I use IDisposable 
/// 
public class CompanyRepository : DisposableBase, ICompanyRepository 
{ 
    public IEnumerable<CompanyDetail> GetOneCompany(int? CompanyID) 
    { 
     var t = from c in _entities.CompanyDetail 
       where c.CompanyID == CompanyID.Value 
       select c; 
     return t.ToList(); 
    } 
} 

/// <summary> 
/// Disposable implementation based on advice from this link: 
/// from Http://www.asp.net/entity-framework/tutorials/implementing-the-repository-and-unit-of-work-patterns-in-an-asp-net-mvc-application 
/// </summary> 
public class DisposableBase : IDisposable 
{ 
    protected TLSAdminEntities1 _entities; 

    public DisposableBase() 
    { 
     _entities = new TLSAdminEntities1(); 
     disposed = false; 
    } 

    private bool disposed ; 
    protected virtual void Dispose(bool disposing) 
    { 
     if (!this.disposed) 
     { 
      if (disposing) 
      { 
       _entities.Dispose(); 
      } 
     } 
     this.disposed = true; 
    } 
    public void Dispose() 
    { 
     Dispose(true); 
     GC.SuppressFinalize(this); 
    } 
} 

risposta

4

Dipende se si dispone di risorse nella classe derivata che hanno bisogno essere smaltito. Se esistono risorse specifiche per la classe derivata, l'implementazione di IDisposable solo sulla classe base non sarà sufficiente.

+0

Nel mio caso non ho nulla di locale nella mia classe di repository ereditata. Se questo è il caso, allora la mia implementazione di CompanyRepository è completa? – LamonteCristo

+0

Se nella classe derivata non c'è nulla che richieda lo smaltimento esplicito, l'implementazione della classe base è probabilmente sufficiente. –

+1

Solo la classe base dovrebbe effettivamente * implementare * 'IDisposable'. Le classi derivate dovrebbero in genere aggiungere il loro codice di pulizia sovrascrivendo 'Dispose (bool)', piuttosto che aggiungere una nuova implementazione di 'IDisposable.Dispose()'. – supercat

0

NO. hai anche in sottoclassi.

se non lo fai, il GC deve ancora mappare il suo figlio come non referenziato e POI raccoglierlo ... così non hai guadagnato nulla.

+0

dispose non è correlato a gc. il modello di smaltimento è per liberare risorse non gestite e gc è per la memoria gestita. questa risposta non ha davvero senso. –

1

Generalamente parlato, è necessario implementare IDispoable in ogni classe, in cui si dispone di membri privati ​​che implementano IDisposable stessi. Queste risorse devono essere "liberate". Vi consiglio vivamente di leggere questo ottimo documento su CodeProject sul modello IDisposable.

7

La risposta è "dipende".

Se il metodo "Dispose()" in alcune superclasse è sufficiente, non è necessario reimplementarlo in ogni sottoclasse.

La "superclasse" potrebbe essere la classe base; potrebbe essere una o più sottoclassi.

Dipende da cosa si assegna e cosa è necessario pulire.

IMHO ...

Ecco cosa ha da dire MSDN:

http://msdn.microsoft.com/en-us/magazine/cc163392.aspx

Quando si deriva da un tipo usa e getta, e che tipo di derivata non introducono nuove risorse , quindi niente di speciale deve essere fatto. L'implementazione di tipo IDisposable di base si occuperà della pulizia delle sue risorse e la sottoclasse può ignorare beatamente i dettagli di .

< = In altre parole, non è necessario necessariamente re-implementare Smaltire più e più

... ma ...

Tuttavia, è anche comune avere una sottoclasse che contiene nuove risorse che devono essere ripulite. In questo caso, la tua classe ha bisogno di per rilasciare le sue risorse, mentre si assicura che anche le risorse del tipo di base vengano rilasciate. A tale scopo, l'override del metodo di pulitura, liberando le risorse, e quindi chiamando il tipo di base per ripulire le sue risorse, come in Figura 6.

+1

+1 Per l'articolo – LamonteCristo

0

va bene smaltire utilizzando una classe base. la cosa importante qui è ripulire le risorse non gestite, che in questo caso significa chiudere le connessioni al database. Direi che staresti meglio ad attaccarti ad asp.net con cose come httpmodules o filtri di azione per gestire la tua unità di lavoro e fare il dispose per un tipo di installazione unit-of-work-per-request, ma se si sta semplicemente facendo in modo di chiamare le istanze del repository, avendo una classe base che dispone il contesto della struttura dell'entità va bene (e si potrebbe ancora usare la classe base per questi repository anche disponendoli con un filtro/modulo).

Problemi correlati