2015-07-27 3 views
2

Образец UOW:Entity Framework, UnitOfWork шаблон с методом Dispose

using System; 
using ContosoUniversity.Models; 

namespace ContosoUniversity.DAL 
{ 
    public class UnitOfWork : IDisposable 
    { 
     private SchoolContext context = new SchoolContext(); 
     private GenericRepository<Department> departmentRepository; 
     private GenericRepository<Course> courseRepository; 

     public GenericRepository<Department> DepartmentRepository 
     { 
      get 
      { 

       if (this.departmentRepository == null) 
       { 
        this.departmentRepository = new GenericRepository<Department>(context); 
       } 
       return departmentRepository; 
      } 
     } 

     public GenericRepository<Course> CourseRepository 
     { 
      get 
      { 

       if (this.courseRepository == null) 
       { 
        this.courseRepository = new GenericRepository<Course>(context); 
       } 
       return courseRepository; 
      } 
     } 

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

     private bool disposed = false; 

     protected virtual void Dispose(bool disposing) 
     { 
      if (!this.disposed) 
      { 
       if (disposing) 
       { 
        context.Dispose(); 
       } 
      } 
      this.disposed = true; 
     } 

     public void Dispose() 
     { 
      Dispose(true); 
      GC.SuppressFinalize(this); 
     } 
    } 
} 

Как видите UOW включает в себя метод утилизации и внутри него распоряжается объект dbContex. Почему мы должны явно удалять объект dbContext. Поскольку он является членом uow, вне рамок, он автоматически утилизирует сборщик мусора. Итак, почему мы делаем это вручную? В качестве примера:

using(Uow uowObject = new Uow()) 
{ 
     //there is a dbcontext 
} 
    //it will be disposed automaticly by gc 

ответ

3

Вне области видимости переменная больше недоступна, но это не означает, что она выбрана. Как правило, каждый класс, который реализует IDisposable, должен быть удален. В случае EF он очистит кеш, график, который отслеживает изменения объекта и откатывает любые незафиксированные транзакции.

+1

Просто чтобы добавить, он будет удален, но только когда GC запрошено освободить память и часть этой памяти, это экземпляр dbContext. И некоторые случаи возникают только тогда, когда приложение завершается, потому что не использует много ресурсов. как говорит Мэтт, зависит от срочности GC и его алгоритма. – mijail

+1

Dispose не означает, что он собирается собирать мусор. Dispose означает, что некоторые ресурсы будут удалены, например, закрытие соединения с БД. Сборщик garbarge очищает объекты от памяти, что является чем-то другим. –

2

С GC вы не знаете, когда GC будет запущен. Даже переменная не входит в сферу действия, это не значит, что собран мусор. С помощью шаблона удаления вы можете сразу освободить память.

От MSDN: При определении того, когда планировать сбор мусора, среда выполнения учитывает, сколько выделенной управляемой памяти. Если небольшой управляемый объект выделяет большое количество неуправляемой памяти, среда выполнения учитывает только управляемую память и, таким образом, недооценивает срочность планирования сбора мусора.

Итак, для управляемых объектов, которые содержат собственный ресурс, вы должны вызвать dispose, чтобы освободить собственный ресурс.

+0

Неудачный код dbcontex? –

+0

Нет, но он содержит беспилотные ресурсы, такие как подключение к базе данных. – Matt

Смежные вопросы