Как бы я мог препятствовать IDisposible в этом контексте? - PullRequest
5 голосов
/ 13 февраля 2011

Я использую Entity Framework 4 вместе с MSSQL для хранения и доступа к данным в приложении Windows Forms.

Вот пример класса, который я использую для доступа к данным:

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

И вот пример того, как я его использую.

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

Кто-то предложил мне использовать IDisposable для правильной «очистки» соединения, но я не знаю, как это реализовать.

Есть предложения?Спасибо за ваше время.

Ответы [ 2 ]

3 голосов
/ 13 февраля 2011

Не уверен, что я действительно понял, но вы, похоже, реализуете IDisposable, но вам нужно позвонить Dispose или использовать using:

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

Это вызывает Dispose при выходе изиспользуя блок и очищает UserRepository.

Есть еще немного информации:

1 голос
/ 13 февраля 2011

Это StudentRepository или UserRepository? И если одно происходит от другого, тогда у вас есть проблема.

Без наследования ваша реализация StudentRepository является приемлемой. Чтобы быть полностью правильным, вы должны убедиться, объявив его запечатанным:

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

И, как уже говорил @Stefan, вы должны использовать его каждый раз, когда создаете экземпляр StudentRepository, с using() { }.

...