![](/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.