gpt4 book ai didi

entity-framework - 如何在工作单元模式中正确使用 Dispose?

转载 作者:行者123 更新时间:2023-12-04 03:12:06 25 4
gpt4 key购买 nike

我知道这个问题已经被问过好几次了,但我无法得到我正在寻找的答案。
所以,我已经实现了存储库(通用)和 UOW 模式,所以我可以使用 EF 访问我的数据库。这是 UnitOfWork 类的一部分:

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

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

问题是:谁在调用 void Dispose 方法?我没有看到使用该方法的示例。

这是工作单元类的上半部分:
    private BDEntities entities = null;

public UnitOfWork()
{
if (entities == null)
{
entities = new BDEntities();
}
}

这是正确的吗?我应该使用“使用”吗?如果是,那么我为什么需要 Dispose 方法?

你能给我一个正确和简单用法的例子吗?

谢谢,
罗腾

最佳答案

您没有遇到任何关于谁调用 dispose 的示例的原因是因为 UoW 通常与依赖注入(inject)和依赖注入(inject)容器(如 Autofac)一起使用。在这种情况下,这个容器负责创建对象并在以后处理它们。当然,这不是使用 UoW 的唯一方式,但它是一种常见的模式。

至于回答你的问题:我认为你采取的方法或多或少是正确的。 UoW 类应该是包装上下文的类,因此它也应该是处置它的类(本质上,DbContext 本身就是一个 UoW)。

不过,您可以简化 Dispose 方法。由于您没有任何非托管而不是 IDisposable资源(如指针),完全可以在UoW的Dispose方法中调用上下文的Dispose方法:

 public void Dispose()
{
entities.Dispose();
}

(没有其他 Dispose 方法,没有 SuppressFinalize 调用)。

是的,你绝对应该使用 using .这正是您需要 Dispose() 的原因方法;只有实现 IDisposable 类型的对象才能在 using 中使用。堵塞。如果你写一个 using block ,它基本上会转换为一个 try-finally block ;您的代码从 using block 进入 try block ,最后是 Dispose()叫做。

关于entity-framework - 如何在工作单元模式中正确使用 Dispose?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44345386/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com