根据MSDN,实现IDisposable接口的最佳方法是使用SafeHandle类的实例。
在given example中,他们有以下行;
SafeHandle handle = new SafeFileHandle(IntPtr.Zero, true);
我一直在阅读有关依赖注入和TDD的内容,我的理解是,为了遵循TDD并正确实现IDisposable接口,我会做这样的事情;
public class SomeDisposableClass : IDisposable
{
private readonly Stream _stream;
private readonly IDisposable _safeHandle;
public SomeDisposableClass(Stream stream, IDisposable safeHandle)
{
_stream = stream;
_safeHandle = safeHandle;
}
private bool disposed = false;
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if (disposed) return;
if (disposing)
{
_safeHandle.Dispose();
_stream.Dispose();
}
disposed = true;
}
}
我正在注入safeHandle而不是在SomeDisposableClass中实例化它。这将允许我传入一个mock并声明在SomeDisposableClass实例调用其Dispose()方法的情况下调用其Dispose方法。
使用TDD和依赖注入时这是正确的做法还是我做得太过分了? (即可以实例化某些类而不是注入它们,还是应该像瘟疫那样避免“新”?)
我知道我的示例存在问题(例如,您没有义务传入SafeHandle实例,只传递IDisposable实例)。
答案 0 :(得分:1)
您不应该使用DI为您的班级提供SafeHandle
。 SafeHandle
是您班级中的内部实施细节,用于实施IDisposable
。您的班级用户不必了解此内部实施。 DI旨在为您的班级提供您的班级与之合作的外部实体。不要害怕将new
用于仅在您班级中使用的对象。
一本非常好的资源是书:http://www.growing-object-oriented-software.com/我无法在这里描述整本书,但这里有几个想法。他们谈论“价值观”和“对象”。
值是对固定数量建模的不可变实例。对象 ......使用可变状态来模拟他们的行为。
本书中描述的样式使用DI来连接彼此协作的“对象”Web,并使用模拟对象来测试这些协作。另一方面,在生产和测试代码中需要时,使用new
创建“值”,并将其作为参数和返回值传递。