我有一个描述某种业务逻辑的接口,即
public interface IFoo
{
void Bar();
}
我也有一些该接口的实现,例如
public class ConcreteFoo1 : IFoo
{
public void Bar() {...}
}
public class ConcreteFoo2 : IFoo, IDisposable
{
public void Bar() {...}
public void Dispose {...}
}
在客户端中,我现在通过依赖注入获取IFoo的实例 - 所以我不知道我得到了哪一个。但是当我得到ConcreteFoo2的一个实例并完成它时,我需要确保调用Dispose。
我想我有两个选择,但如果我有更多更好的选择,请纠正我。
让IFoo扩展IDisposable
这并不好,因为它要求IFoo的所有实现也实现IDisposable。但它允许我使用using {...}语法。
要求所有客户检查IDisposable并在必要时进行调用。
这将使实现更简单,但将责任转移到客户端,这必须做这样的事情
public void DoStuff()
{
IFoo foo = ....;
//do stuff
IDisposable disposable = foo as IDisposable;
if(disposable != null)
{
disposable.Dispose();
}
}
是否有其他/更好的方法可以确保Dispose()被确定性地调用?这两种方法中的任何一种都有专业人士和对手吗?