如果我有这样实现IDisposable的接口(来自apress书的例子)
public interface IArchitectRepository : IDisposable
{
IEnumerable<Architect> GetArchitects();
Architect GetAchitectDetails(int id);
void Create(Achitect a);
void Update(Achitect a);
void Delete(int id);
void Save();
}
如何在派生类中实现Dispose方法?
在书中,它保留为NotImplementedException。
答案 0 :(得分:3)
您没有理由以不同于正常情况的方式实现Dispose模式。
答案 1 :(得分:2)
与大多数意味着实现类义务的接口不同,实现IDisposable
的类的唯一义务是将Dispose
的调用视为一个实例将要发布的充分通知被遗弃IDisposable
赋予的真正义务落在实例所有者身上:如果类型实现IDisposable
,则每个实例应该有一个所有者有义务确保其Dispose
方法在被放弃之前被调用;所有者可以通过致电Dispose
本身,或将所有权转让给新的所有者来履行义务。
请注意,IDisposable
实例的所有者并不关心Dispose
提供的实例在返回后可以安全放弃的情况。如果在调用Dispose
之前可以安全地放弃某个特定对象,则Dispose
方法无需执行任何操作。它应该不抛出NotImplementedException
或NotSupportedException
,因为它应该无法做它需要做的所有事情(即什么都没有)。
答案 2 :(得分:0)
您应该查看MSDN以获取完整示例:http://msdn.microsoft.com/en-us/library/system.idisposable.aspx
最低要求是:
public class ArchitectRepository : IArchitectRepository
{
// implement all the IArchitectRepository methods
public void Dispose()
{
// assuming your repository has a connection property
if (this.Connection != null)
this.Connection.Close();
// do the same for all other disposable objects your repository has created.
}
}
答案 3 :(得分:0)
具体实现可以覆盖如下
public bool IsDisposed { get; set; }
public bool IsLockedForDisposing { get; set; }
/// <summary>
/// Dispose the Loaded Context
/// </summary>
///
protected virtual void Dispose(bool disposing)
{
if (!this.disposed)
{
if (disposing)
{
// Disposing of managed code
context.Dispose();
// GC.Collect(context);
}
this.disposed = true;
}
}
public void Dispose()
{
if (!IsLockedForDisposing)
{
IsDisposed = true;
Dispose(true);
GC.SuppressFinalize(this);
}
}