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);
}
}
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
Se nella classe derivata non c'è nulla che richieda lo smaltimento esplicito, l'implementazione della classe base è probabilmente sufficiente. –
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