我有一个子类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;
}
}
MyUnitOfWork
在每个(网络)请求的生命周期范围内注册。我有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()
包含它封装的实例,而装饰不是封装。