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。