![](/img/trans.png)
[英]Third-party implementation of DbContext, how to also implement IdentityDbContext
[英]How to correctly implement disposable pattern with third-party libraries
假设我有以下课程:
class Foo : IDisposable
{
public void Dispose()
{
bar.Dispose();
}
private Bar bar = new Bar();
}
class Bar : IDisposable
{
public void Dispose()
{
baz.Dispose();
}
private SomeThirdPartyLibraryClass baz = new SomeThirdPartyLibraryClass();
}
使用using
语句时,此代码可以很好地工作:
using (Foo foo = new Foo())
{
// ...
}
// All resources should be disposed at this time
但是,如果由于某种原因此类的用户忘记使用using
语句,则资源将永远不会被处置。
根据MSDN,我应该以以下方式实现一次性模式:
class Foo : IDisposable
{
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if (disposed)
return;
if (disposing) {
// Free any managed objects here.
//
}
// Free any unmanaged objects here.
//
disposed = true;
}
~Foo()
{
Dispose(false);
}
bool disposed = false;
private Bar bar = new Bar();
}
( Bar
)
但是我应该在哪里放置bar.Dispose();
和baz.Dispose();
码?
应该在“托管清理”部分还是“非托管清理”部分下?
顾名思义,我不知道SomeThirdPartyLibraryClass
的实现(无论如何,它可以随着时间改变)。
那我该怎么办?
但是我应该在哪里放置bar.Dispose(); 和baz.Dispose(); 码?
由于您的第三方库似乎是托管代码,因此将在“托管清理”部分中进行。
您应该在Dispose的托管部分下调用bar and baz的Dispose of bar and baz,因为对于您的类而言,它们是托管对象。 如果bar和baz具有不受管理的内容,则应在其Dispose / Finalize实现中通过各自的类对其进行清理。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.