Entity Framework, шаблон UnitofWork с методом удаления

Образец Уов:

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 включает метод dispose и внутри него удаляет объект dbContex. Почему мы должны явно располагать объект dbContext. Так как он является членом UOW, за пределами области он будет автоматически уничтожен сборщиком мусора. Итак, почему мы делаем это вручную? В качестве примера:

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

2 ответа

Решение

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

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

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

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

Другие вопросы по тегам