Декораторы и IDisposable

У меня есть подклассDbContext

public class MyContext : DbContext { }

и у меня естьIUnitOfWork абстракция вокругMyContext который реализуетIDisposable чтобы убедиться, что ссылки, такие какMyContext утилизируются в соответствующее время

public interface IUnitOfWork : IDisposable { }

public class UnitOfWork : IUnitOfWork 
{
    private readonly MyContext _context;

    public UnitOfWork()
    {
        _context = new MyContext();
    }

    ~UnitOfWork()
    {
        Dispose(false);
    }

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

    private bool _disposed;

    protected virtual void Dispose(bool disposing)
    {
        if (_disposed) return;

        if (disposing)
        {
            if (_context != null) _context.Dispose();
        }

        _disposed = true;
    }
}

мойUnitOfWork регистрируется с продолжительностью действия каждого (веб) запроса. У меня есть декораторыIUnitOfWork которые могут быть зарегистрированы как временные или ограниченные по времени жизни, и мой вопрос заключается в том, что они должны делать в отношении реализацииIDisposable - конкретно они должны или не должны передать вызовDispose().

public class UnitOfWorkDecorator : IUnitOfWork
{
    private readonly IUnitOfWork _decorated;

    public UnitOfWorkDecorator(IUnitOfWork decorated)
    {
        _decorated = decorated;
    }

    public void Dispose()
    {
        //do we pass on the call?
        _decorated.Dispose();
    }
}    

Я вижу 2 варианта (думаю, вариант 2 - правильный ответ):

Ожидается, что каждый Декоратор будет знать, является ли он временным или ограниченным по времени жизни. Если декоратор временный, он не должен вызыватьDispose() на украшенном экземпляре. Если это время жизни, то должно.Каждый декоратор должен заботиться только об утилизации себя и долженникогда передать вызов на оформленный экземпляр. Контейнер будет управлять вызовомDispose() для каждого объекта в цепочке вызовов в соответствующее время. Объект должен толькоDispose() случаев, когда он инкапсулирует и декорирует, не является инкапсуляцией.

Ответы на вопрос(3)

Ваш ответ на вопрос