7

Me dijeron que necesito dispose of instances of my Entity Framework repository classes y creé una clase base para hacer cumplir esta implementación.¿Debo implementar IDisposable en todas las clases, o es una clase base suficiente?

Necesito consultar con los expertos: ¿es aceptable implementar IDisposable a través de una clase base?

Tenga en cuenta que la clase de repositorio no tiene variables de miembro de clase.

/// 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); 
    } 
} 

Respuesta

4

Depende de si tiene recursos en la clase derivada que necesitan para ser eliminado Si hay recursos específicos para la clase derivada, implementar IDisposable solo en la clase base no será suficiente.

+0

En mi caso no tengo nada local en mi clase de repositorio heredado. Si este es el caso, ¿mi implementación de CompanyRepository está completa? – LamonteCristo

+0

Si no hay nada en la clase derivada que requiera eliminación explícita, la implementación de la clase base es probablemente suficiente. –

+1

Solo la clase base debería * implementar * 'IDisposable'. Las clases derivadas generalmente deberían agregar su código de limpieza anulando 'Dispose (bool)', en lugar de agregar una nueva implementación de 'IDisposable.Dispose()'. – supercat

0

NO. también lo has hecho en sub clases.

si no lo hace, el GC todavía necesita asignar su hijo como no referenciado - y ENTONCES para recogerlos ... para que no gane nada.

+0

desechar no está relacionado con gc. el patrón de eliminación es para liberar recursos no administrados y gc es para memoria administrada. esta respuesta realmente no tiene sentido. –

1

En términos generales, debe implementar IDispoable en todas las clases, donde tiene miembros privados que a su vez implementan IDisposable. Esos recursos deben ser "liberados". Le recomiendo leer este documento muy bueno en CodeProject sobre el patrón IDisposable.

7

La respuesta es "depende".

Si el método "Dispose()" en alguna superclase es suficiente, no es necesario que vuelva a implementarlo en todas y cada una de las subclases.

La "superclase" podría ser la clase base; podría ser una o más subclases.

Depende de lo que asigne y de lo que deba limpiarse.

mi humilde opinión ...

Esto es lo que tiene que decir MSDN:

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

Al derivar de un tipo desechable, y que tipo derivado no introducir nuevos recursos , entonces no es necesario hacer nada especial. El tipo de base IDisposable implementación se encargará de limpiar sus recursos y su subclase puede ignorar felizmente los detalles .

< = En otras palabras, no necesariamente tiene que volver a aplicar Desechar una y otra

... pero ...

Sin embargo, también es común tener una subclase que contiene nuevos recursos que deben limpiarse. En este caso, su clase necesita para liberar sus recursos, mientras se asegura de que los recursos del tipo base también sean liberados. Para ello, reemplazando el método de limpieza, liberar sus recursos, y después de llamar al tipo base para limpiar sus recursos, como en la Figura 6.

+1

+1 Para el artículo – LamonteCristo

0

está bien desechar utilizando una clase base. lo importante aquí es limpiar los recursos no gestionados, lo que en este caso significa cerrar las conexiones de la base de datos. Argumentaría que sería mejor que se conectara a asp.net con cosas como httpmodules o filtros de acción para manejar su unidad de trabajo y deshacerse de una configuración de unidad de trabajo por solicitud, pero si en su lugar, solo se asegura de invocar dispose en sus instancias de repositorio, tener una clase base que elimine el contexto del marco de la entidad está bien (y aún podría usar la clase base para estos repositorios incluso con disponer de ellos con un filtro/módulo).

Cuestiones relacionadas