Dekorateure und IDisposable

Ich habe eine Unterklasse vonDbContext

public class MyContext : DbContext { }

und ich habe eineIUnitOfWork Abstraktion herumMyContext das implementiertIDisposable um sicherzustellen, dass Referenzen wieMyContext rechtzeitig entsorgt werden

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;
    }
}

MeineUnitOfWork ist mit einem lebenslangen Gültigkeitsbereich pro (Web-) Anfrage registriert. Ich habe Dekorateure vonIUnitOfWork Das könnte als vorübergehend oder lebenslang eingestuft werden, und meine Frage ist, was sie in Bezug auf die Implementierung tun sollenIDisposable - speziell, ob sie den Anruf weiterleiten oder nichtDispose().

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();
    }
}    

Ich sehe 2 Optionen (ich vermute, Option 2 ist die richtige Antwort):

Es wird erwartet, dass jeder Dekorateur weiß, ob es sich um eine vorübergehende oder eine lebenslange Tätigkeit handelt. Wenn ein Dekorateur vorübergehend ist, sollte er nicht anrufenDispose() auf der verzierten Instanz. Wenn es lebenslang ist, sollte es.Jeder Dekorateur sollte sich nur um die Entsorgung selbst kümmern und solltenoch nie den Anruf an die dekorierte Instanz weiterleiten. Der Container verwaltet den Anruf anDispose() für jedes Objekt in der Aufrufkette zum entsprechenden Zeitpunkt. Ein Objekt sollte nurDispose() von Instanzen, die gekapselt und dekoriert werden, ist keine Verkapselung.

Antworten auf die Frage(3)

Ihre Antwort auf die Frage