首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >非IDisposable接口的IDisposable实现

非IDisposable接口的IDisposable实现
EN

Stack Overflow用户
提问于 2011-05-04 21:38:10
回答 2查看 602关注 0票数 4

接口不从IDisposable继承时,正确处理接口的默认实现的最佳方法是什么?例如,假设我想做

代码语言:javascript
复制
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。我该怎么处置它呢?

问题不仅适用于依赖注入容器,还适用于紧密耦合的依赖关系:

代码语言:javascript
复制
private IFooProvider fooProvider = new PatrickProvider();

在这种情况下,我可以保留另一个引用,以便以后可以释放它,但这看起来确实很奇怪:

代码语言:javascript
复制
private PatrickProvider defaultFooProvider = new PatrickProvider();
private IFooProvider fooProvider = defaultFooProvider;

在这里寻找最佳(或良好)实践。

EN

回答 2

Stack Overflow用户

发布于 2011-05-04 22:02:00

您可以执行运行时检查对象是否实现了IDisposable,如果实现了,则释放它:

代码语言:javascript
复制
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派生出来,说明它的部分约定是您必须在完成时处理它,但我承认,在现实中,这可能并不总是可能的。

票数 1
EN

Stack Overflow用户

发布于 2011-05-04 22:04:46

如果您正在定义IFooProvider,为什么不让它继承IDispoable呢?如果有人想出了一个不需要清理的实现,它可以简单地实现一个空的Dispose方法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5890154

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档