【发布时间】:2015-10-28 07:02:43
【问题描述】:
我正在使用一个在其构造函数中使用对 EF 的引用的类。
我已经实现了IDisposable,但我不确定是否需要析构函数,因为我不确定是否可以将 EF 归类为非托管资源。
如果 EF 是托管资源,那么我不需要析构函数,所以我认为这是一个恰当的例子:
public ExampleClass : IDisposable
{
public ExampleClass(string connectionStringName, ILogger log)
{
//...
Db = new Entities(connectionStringName);
}
private bool _isDisposed;
public void Dispose()
{
if (_isDisposed) return;
Db.Dispose();
_isDisposed= true;
}
}
如果 EF 是非托管的,那么我会这样做:
public ExampleClass : IDisposable
{
public ExampleClass(string connectionStringName, ILogger log)
{
//...
Db = new Entities(connectionStringName);
}
public void Dispose()
{
Dispose(true);
}
~ExampleClass()
{
Dispose(false);
}
private bool _isDisposed;
protected virtual void Dispose(bool disposing)
{
if (_isDisposed) return;
// Dispose of managed resources
if (disposing)
{
// Dispose of managed resources; assumption here that EF is unmanaged.
}
// Dispose of unmanaged resources
Db.Dispose();
_isDisposed = true;
//freed, so no destructor necessary.
GC.SuppressFinalize(this);
}
}
是哪一个?
【问题讨论】:
-
IDisposable 不仅仅处理非托管资源。
-
我将始终控制
DbContext的创建和销毁。需要为一小部分工作创建它。它的内部遵循工作单元模式 -
我认为它是托管的,并希望它为它的非托管部分实现自己的终结器。
-
问题是对于“DbContext 是否不受管理?”没有明确的“是”或“否”答案。它是一个 CLR 类,所以它绝对是一个托管对象。然而在后台,它使用来自池的数据库连接,这些连接往往是非托管资源的(托管包装器)。但是,默认情况下,DbContext 和相关的内部类会自行释放这些非托管资源。当您不自己打开连接时,只需处理 DbContext 就足够了(通常甚至没有必要)。没有其他事情可做。
-
@CodeCaster - 谢谢。
However, the DbContext and related, internal classes by default release those unmanaged resources themselves.这似乎有道理,让我想将 EF 视为托管资源。据我了解,我不需要托管对象的析构函数,因此我可以放心地使用第一个示例,除非另有说明。
标签: c# entity-framework destructor idisposable