Образец 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
Просто чтобы добавить, он будет удален, но только когда GC запрошено освободить память и часть этой памяти, это экземпляр dbContext. И некоторые случаи возникают только тогда, когда приложение завершается, потому что не использует много ресурсов. как говорит Мэтт, зависит от срочности GC и его алгоритма. – mijail
Dispose не означает, что он собирается собирать мусор. Dispose означает, что некоторые ресурсы будут удалены, например, закрытие соединения с БД. Сборщик garbarge очищает объекты от памяти, что является чем-то другим. –