对在我的存储库中使用dispose感到困惑。 EF6 MVC

时间:2016-02-05 04:29:58

标签: model-view-controller entity-framework-6 dispose

我一直在尝试在项目中实现存储库模式。我不确定我是否正确使用处置。我从实体框架的MVA课程中获取了模式。

我的资料库

public static bool IsAwesome { get { return true; } }

   public class Repository<T> : IDisposable where T : class 
   {
    private ApplicationDbContext db = null;
    protected DbSet<T> DbSet { get; set; }

    public Repository()
    {
        db = new ApplicationDbContext();
        DbSet = db.Set<T>();
    }

    public List<T> GetAll()
    {
        return DbSet.ToList();
    }

    public T Get(int id)
    {
        return DbSet.Find(id);
    }

    public T GetWithString(string id)
    {
        return DbSet.Find(id);
    }

    public void Add(T entity)
    {
        DbSet.Add(entity);
    }

    public void Update(T entity)
    {
        DbSet.Attach(entity);
        db.Entry(entity);
    }

    public void SaveChanges()
    {
        db.SaveChanges();
    }


    private bool disposed = false;

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

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

从存储库继承的imageRepository示例

 public class ImageRepository : Repository<Image>
{

    public Image GetLatest(int vehicleId)
    {
        return DbSet.FirstOrDefault(p => p.VehicleId == vehicleId);
    }

    public List<Image> GetImagesByVehicleId(int vehicleId)
    {
        return DbSet.Where(p => p.VehicleId == vehicleId).ToList();
    }

}

在控制器顶部使用我的存储库并将其置于控制器底部

    ImageRepository imageRepository = new ImageRepository();
    UserRepository userRepository = new UserRepository();

    protected override void Dispose(bool disposing)
    {
        imageRepository.Dispose();
        userRepository.Dispose();
        base.Dispose(disposing);
    }

我的代码是否会处理所有非托管连接并正确关闭它们?

提前谢谢你。我对MVC和EF还有点新意。如果我的问题有点新鲜,我很抱歉。我在这里的第一篇文章。所以我希望我没有违反任何规则:)

2 个答案:

答案 0 :(得分:0)

在UnitOfWork中添加您的Dispose代码,从GenericRepository中删除

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

答案 1 :(得分:0)

  

我的代码是否会处理所有非托管连接并关闭它们   正确?

显然是的。

但是,你并没有完全遵循这种模式。您没有必须使用SuppressFinalize,因为您的课程中没有终结器。请阅读proper implementation of IDisposable Pattern