2011-02-13 12 views
5

Estoy usando Entity Framework 4 junto con MSSQL para almacenar y acceder a los datos en mi aplicación Windows Forms.¿Cómo podría imponer IDisposible en este contexto?

Aquí es una clase de ejemplo que utilizo para acceder a los datos:

public class StudentRepository : IDisposable 
{ 
    ColegioDBEntities db = new ColegioDBEntities(); 

    public IQueryable<Student> FindAllStudents() 
    { 
     return db.Students; 
    } 

    public Student FindStudent(int id) 
    { 
     return db.Students.SingleOrDefault(c => c.StudentId == id); 
    } 

    public void Add(Student Student) 
    { 
     db.AddToStudents(Student); 
    } 

    public void Save() 
    { 
     db.SaveChanges(); 
    } 

    public void Dispose() 
    { 
     db.Dispose(); 
    } 
} 

Y aquí es un ejemplo de cómo lo uso.

private void btnLogin_Click(object sender, EventArgs e) 
    { 
     UserRepository repo = new UserRepository(); 
     var result = repo.FindAllUsers().Where(u => u.Username == txtUsername.Text && u.Password == txtPassword.Text); 
     if (result.Count() > 0) 
     { 
      MainForm form = new MainForm(txtUsername.Text); 
      form.Show(); 
      this.Hide(); 
     } 
     else 
     { 
      MessageBox.Show("Usuario y/o contraseña incorrecta.", 
      "Acceso Denegado", 
      MessageBoxButtons.OK, 
      MessageBoxIcon.Stop, 
      MessageBoxDefaultButton.Button1); 
      txtUsername.Focus(); 
      txtPassword.Focus(); 
     } 
    } 

Alguien sugirió que yo uso IDisposable para "limpiar" correctamente la conexión, pero no sé cómo implementar esto.

¿Alguna sugerencia? Gracias por tu tiempo.

Respuesta

3

No estoy seguro si realmente tiene el punto, pero pareces a aplicar IDisposable, pero hay que llamar Dispose o utilizar using:

using(UserRepository repo = new UserRepository()) 
    { 
    // ... 
    } 

Para esto se necesitan botar al salir del bloque usando y se limpia el UserRepository .

hay algo más de información:

+0

¡Ah! Ese era el punto. :) Me olvidé de incluir la declaración using para que el objeto sea eliminado. Gracias por tu tiempo. ¿Recomiendas que haga esto cada vez que utilizo una clase de repositorio? –

+0

Usted realmente debe SIEMPRE hacer esto cuando se trata de tipos IDisposable. Obtendrá pérdidas de memoria y probablemente malos efectos secundarios si no lo hace. –

+0

Sí, por supuesto, cada instancia de una clase que se puede eliminar debe ser eliminada después de usarla. – Enyra

1

Es StudentRepository o UserRepository? Y si uno deriva del otro, entonces tiene un problema.

Sin herencia, su implementación de StudentRepository es aceptable. Para ser totalmente correcta debe asegurarse declarándolo sellada:

public sealed class StudentRepository : IDisposable 
{ 
    .... 
    public void Dispose() 
    { 
     db.Dispose(); 
    } 
} 

Y, como ya se ha señalado @Stefan, usted tiene que hacer uso de él cada vez que se ejemplariza un StudentRepository, con using() { }.

Cuestiones relacionadas