繁体   English   中英

没有DI的多层MVC Dispose()

[英]MVC Dispose() in multi-layer without DI

我目前有一个多层MVC应用程序(Web,BLL,DAL),试图了解如何正确使用DbContext的Dispose。

关于如何使用依赖注入进行操作的信息很多。

我不确定我是否会使用DI。 因此,为什么我要努力弄清到目前为止所做的事情是否正确。

以下是已完成的操作:

网页

在Controller中,实例化DbContext,并使用Dispose()方法。

  private MyDbContext _context = new MyDbContext();
  ...
  ...

  protected override void Dispose(bool disposing)
  {
      if (disposing)
      {
       _context.Dispose();
      }
      base.Dispose(disposing);
  }

实例化BLL.service对象并将其传递给DbContext

BLL

实例化DAL.repository对象并将其传递给DbContext

DAL

此类继承自:IDisposable

并包含Dispose方法。

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

上下文原因:

控制器实例化DbContext,并将其传递给存储库类。 这样更好(即共享上下文),而不是每个存储库都实例化它们自己的上下文。

问题:

我怀疑存储库类是否需要Dispose()逻辑。 那BLL呢? 它有一个上下文对象,但是只是传递它呢? 这里是否需要Dispose()逻辑。

即控制器中的Dispose()是否足够? 还是在每个级别都需要“处置”? 通常,如果我所做的是正确的? 谢谢。

尝试对创建DbContext进行抽象,看看这个这个

我怀疑存储库类是否需要Dispose()逻辑。 那BLL呢? 它有一个上下文对象,但是只是传递它呢? 这里是否需要Dispose()逻辑。

不。 不需要。

dbContext不拥有任何昂贵的资源来保证其处置(例如,打开连接)。 检索数据后,dbContext将立即关闭其连接。 即使在高负载下,性能增益也可以忽略不计。

在DbContext上使用Dispose()的问题

公开dbContext的Dispose()方法会引发将来调用该方法的潜在问题,从而有效地破坏了ORM的目的(无意中杀死了惰性加载器)。 在共享的dbContexts上,此问题将很明显,在该共享库中,一个存储库将其处置,而其他一些存储库可能仍在使用它。

尽管在某些特殊情况下您需要显式调用dbContext.Dispose(),但在大多数情况下它已经足够了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM