2

如果我有像这样实现IDisposable的接口(来自 apress book 的示例)

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

4

4 回答 4

4

您没有理由以与正常方式不同的方式实现 Dispose 模式。

请参阅实现 Dispose 方法

于 2013-10-10T15:32:22.223 回答
2

与大多数暗示实现类的义务的接口不同,实现类的唯一义务IDisposable是将调用Dispose视为充分通知实例将被放弃。实例所有者赋予的真正义务是IDisposable:如果一个类型实现了IDisposable,每个实例都应该有一个所有者,该所有者有义务确保其Dispose方法在被放弃之前被调用;所有者可以通过调用Dispose自己或将所有权转让给新的所有者来执行此操作,然后新所有者将承担该义务。

请注意,只要实例在返回后可以安全地放弃,IDisposable实例的所有者并不关心它做了什么。如果某个特定对象在被调用Dispose之前可以安全地放弃,则该方法不需要做任何事情。它不应该抛出or ,因为它不应该能够做它需要做的所有事情(即什么也不做)。DisposeDisposeNotImplementedExceptionNotSupportedException

于 2013-10-10T18:46:50.717 回答
0

Whiting具体实现可以覆盖如下

        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);
            }
        }
于 2013-10-10T15:35:53.607 回答
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.
    }
}
于 2013-10-10T15:33:55.907 回答