【发布时间】:2011-05-04 21:38:10
【问题描述】:
当接口不继承自 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();
在这种情况下,我可以保留另一个引用,以便以后可以 Dispose() 它,但这似乎真的很麻烦:
private PatrickProvider defaultFooProvider = new PatrickProvider();
private IFooProvider fooProvider = defaultFooProvider;
在这里寻找最佳(或良好)做法。
【问题讨论】:
-
你在控制 IFooProvider 吗?帕特里克提供者?您是在寻找设计它们的最佳做法,还是仅在现有的情况下使用它们?
-
按原样使用它们——假设 IFooProvider 没有实现 IDisposable,但 PatrickProvider 实现了。
-
这根本不是真的。具体实现的
new-er 应该负责处理,因为new-er(例如DI容器)知道如何将IFooProvider映射到具体实现,并且还具有特定于该特定的所有代码实施。 -
这些是我的想法,是的:)。有时您还需要通知容器您已完成对象的能力;大多数 DI 容器都提供此功能(通常名称为
Release)。但是仍然由容器来决定是否该 dispose 了,例如如果一个对象具有单例生命周期,那么它将等待所有消费者释放后再释放。
标签: .net oop idisposable