C# 在派生类中实现IDisposable
如果我有这样实现的接口(来自一本压力书的示例)C# 在派生类中实现IDisposable,c#,.net,idisposable,C#,.net,Idisposable,如果我有这样实现的接口(来自一本压力书的示例) public interface IArchitectRepository : IDisposable { IEnumerable<Architect> GetArchitects(); Architect GetAchitectDetails(int id); void Create(Achitect a); void Update(Achitect a); void Delete(int id
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();
}
公共接口IArchitectRepository:IDisposable
{
IEnumerable.没有理由认为您实现的Dispose模式与普通模式有任何不同
参见您应该查看MSDN以了解完整的示例:
最低限度将是:
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.
}
}
在具体实现中,您可以按如下方式覆盖
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);
}
}
public bool IsDisposed{get;set;}
public bool islocked用于显示{get;set;}
///
///处理加载的上下文
///
///
受保护的虚拟void Dispose(bool disposing)
{
如果(!this.disposed)
{
如果(处置)
{
//托管代码的处理
context.Dispose();
//收集(上下文);
}
这是真的;
}
}
公共空间处置()
{
如果(!IsLockedForDisposing)
{
IsDisposed=true;
处置(真实);
总干事(本);
}
}
不像大多数接口暗示实现类的义务,实现IDisposable
的类的唯一义务是将调用Dispose
视为实例将被放弃的充分通知。IDisposable
赋予的真正义务取决于instancece所有者:如果一个类型实现了IDisposable
,那么每个实例都应该有一个所有者,该所有者有义务确保其Dispose
方法在被放弃之前被调用;所有者可以通过调用Dispose
本身来实现这一点,或者将所有权传递给一个新的所有者,后者随后将承担该义务
请注意,IDisposable
实例的所有者不关心Dispose
做了什么,只要实例返回后可以安全地放弃。如果在调用Dispose
之前可以安全地放弃某个特定对象,则Dispose
方法不需要做任何事情。它不应该这样做抛出一个NotImplementedException
或NotSupportedException
,因为它不应该能够做它需要做的所有事情(即,什么都不做)。首先确保您了解一次性模式是什么以及它有什么好处。一旦您知道您可以自己回答这个问题。(除了一般建议,我们无法回答,因为我们不知道您的存储库做什么).IArchitectRepository没有实现IDisposable,而是继承了IDisposable,因此您应该能够在实现IArchitectRepository接口的类中实现dispose方法。根据您提供的链接,子类必须使用dispose方法的重写,并且子类不提供的重载版本Dispose方法。我会调用与普通方法不同的方法。当然,子类不实现IDisposable。