3

出于内存优化的目的,我们一直在添加这些代码行:

public class Whatever: IDisposable

private bool disposed = false;

protected virtual void Dispose(bool disposing)
{
    if (!this.disposed)
    {
        if (disposing)
        {
            context.Dispose();
        }
    }
    this.disposed = true;
}

public void Dispose()
{
     Dispose(true);
     GC.SuppressFinalize(this);
}

对于我们的每个存储库,我们也会更新每个存储库的测试。我想知道,由于在编码中并不鼓励复制+粘贴,难道没有更好的方法来实现这一点吗?特别烦人,因为根据项目的不同,我们有 10-40 个存储库......

4

2 回答 2

4

也许更简单 - 使用context自身来跟踪处置:

protected virtual void Dispose(bool disposing)
{
    if (disposing) context?.Dispose();
    context = null;
}

public void Dispose()
{
     Dispose(true);
     GC.SuppressFinalize(this);
}

请注意,我还认为您在此处涉及终结器的可能性极小(如果您这样做,那可能是一个大错误),所以说实话:您可以进一步简化

public void Dispose()
{
    context?.Dispose();
    context = null;
}
于 2021-09-17T10:07:33.270 回答
1

扩展Franz 暗示的基类方法;就像是:

// common base class that handles the shared details
public abstract class MyCommonBase : IDisposable
{
    protected SomeContext Context { get; private set; }

    public MyCommonBase(SomeContext context)
        => Context = context ?? throw new ArgumentNullException(nameof(context));

    public virtual void Dispose()
    {
        // your choice of dispose code here, via Context
    }
}

// specific implementation class
public class MySomething : MyCommonBase
{
    public MySomething(SomeContext context) : base(context) {}

    // your *extra* code here; can read Context from base
}

请注意,MySomething您不需要处理任何处置位 - 这一切都由基类处理(尽管您仍然可以添加其他清理功能override的方法)。Dispose()

于 2021-09-17T10:23:14.717 回答