处理我只有接口的对象的正确方法是什么?

Ste*_*ann 8 c# idisposable interface

我有一个描述某种业务逻辑的接口,即

public interface IFoo
{
    void Bar();
}
Run Code Online (Sandbox Code Playgroud)

我也有一些该接口的实现,例如

public class ConcreteFoo1 : IFoo
{
    public void Bar() {...}
}

public class ConcreteFoo2 : IFoo, IDisposable
{
    public void Bar() {...}
    public void Dispose {...}
}
Run Code Online (Sandbox Code Playgroud)

在客户端内,我现在通过依赖注入得到一个IFoo实例 - 所以我不知道我得到了哪一个.但是当我得到ConcreteFoo2的一个实例并完成它时,我需要确保调用Dispose.

我想我有两个选择,但如果我有更多更好的选择,请纠正我.

  1. 让IFoo扩展IDisposable
    这不是很好,因为它要求IFoo的所有实现也实现IDisposable.但它允许我使用using {...}语法.

  2. 要求所有客户检查IDisposable并在必要时调用它.
    这将使实现更简单,但将责任转移到客户端,这必须做这样的事情

    public void DoStuff()
    {
        IFoo foo = ....;
        //do stuff

        IDisposable disposable = foo as IDisposable;
        if(disposable != null)
        { 
            disposable.Dispose();
        }
    }
Run Code Online (Sandbox Code Playgroud)

有没有其他/更好的方法可以确保Dispose()被确定性地调用?对这两种方法中的任何一种都有赞成和反对意见吗?