有人建议我,在使用IOC容器时,应该将这个改成:
class Foobar: IFoobar, IDisposable {};
转化为这样:
interface IFoobar: IDisposable{};
class Foobar : IFoobar{};
我在想这样做是否可以,或者它解决了一个问题但又带来了另一个问题。当然,它解决了我非常想做这件事的问题:
using( IFoobar = myContainer.Resolve<IFoobar>() )
{ ... }
现在我知道任何替代品都不会引起运行时错误。
另一方面,现在我的所有模拟对象也必须处理IDisposable。我是否正确地认为,大多数模拟框架都可以轻松处理这个问题?如果是的话,那么这可能不是一个问题。
还是有问题吗?我应该注意到另一个隐藏的陷阱吗?当然,我想到了一个问题,如果我使用IOC容器而不是用于单元测试/模拟,而是用于真正的服务独立性,那么这可能是一个问题,因为只有我的一个可交换服务实际上涉及非受控资源(现在我必须在这些其他服务中实现空的“IDispose”操作)。
即使是后一种问题,为了获得像上面演示的“using”语句的能力,我想我也可以接受。但是,我是否遵循一种流行的惯例,或者我错过了一个完全不同且更好的解决方案?