当接口不从IDisposable继承时,正确处理接口的默认实现的最佳方法是什么?例如,假设我想做
public class FooGetter : IDisposable {
private IFooProvider fooProvider = MyContainer.GetDefault<IFooProvider>();
...
public void Dispose(){
...
if (fooProvider != null) fooProvider.Dispose(); // obviously has compile error here
}
}IFooProvider的默认实现是IDisposable,但是IFooProvider接口并不继承于IDisposable。我该怎么处置它呢?
问题不仅适用于依赖注入容器,还适用于紧密耦合的依赖关系:
private IFooProvider fooProvider = new PatrickProvider();在这种情况下,我可以保留另一个引用,以便以后可以释放它,但这看起来确实很奇怪:
private PatrickProvider defaultFooProvider = new PatrickProvider();
private IFooProvider fooProvider = defaultFooProvider;在这里寻找最佳(或良好)实践。
发布于 2011-05-04 22:02:00
您可以执行运行时检查对象是否实现了IDisposable,如果实现了,则释放它:
public class FooGetter : IDisposable
{
private IFooProvider fooProvider = MyContainer.GetDefault<IFooProvider>();
...
public void Dispose()
{
IDisposable disposable = fooProvider as IDisposable;
if (disposable != null)
{
fooProvider.Dispose();
}
}
}您仍然需要知道接口的实现可能是一次性的,否则代码就有点毫无意义,但对于您的情况,它将确保在具有它的实现上调用Dispose()。
理想情况下,您的接口应该从IDisposable派生出来,说明它的部分约定是您必须在完成时处理它,但我承认,在现实中,这可能并不总是可能的。
发布于 2011-05-04 22:04:46
如果您正在定义IFooProvider,为什么不让它继承IDispoable呢?如果有人想出了一个不需要清理的实现,它可以简单地实现一个空的Dispose方法。
https://stackoverflow.com/questions/5890154
复制相似问题