实体框架,带有处理方法的统一工作模式

本文关键字:工作 模式 方法 处理 框架 实体 | 更新日期: 2023-09-27 18:05:05

示例:

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

如您所见,现在包含dispose方法,并在其内部处置dbcontext对象。为什么要显式地处理dbContext对象?因为它是ow的成员,所以在作用域外它将被垃圾收集器自动处理。那么,我们为什么要手动操作呢?例如:

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

实体框架,带有处理方法的统一工作模式

在作用域之外,变量不再可访问,但这并不意味着已被处置。根据经验,每个实现IDisposable的类都应该被处置。在EF的情况下,它将清除缓存,跟踪对象更改的图,并回滚任何未提交的事务。

对于GC,您不知道何时启动GC。即使变量超出了作用域,也不意味着它已经被垃圾收集了。使用dispose模式,您可以立即释放内存。

来自MSDN:在决定何时调度垃圾收集时,运行时考虑分配了多少托管内存。如果一个小的托管对象分配了大量的非托管内存,则运行时只考虑托管内存,从而低估了调度垃圾收集的紧迫性。

因此,对于持有本机资源的托管对象,您应该调用dispose来释放本机资源。