根據MSDN,實現IDisposable接口的最佳方式包括使用SafeHandle類的一個實例。當試圖正確使用依賴注入和IDisposable接口時,我應該注入一個SafeHandle實例嗎? C#
在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中實例化它。這將允許我傳遞一個模擬並聲明Dispose方法在SomeDisposableClass實例調用其Dispose()方法的情況下被調用。
這是使用TDD和依賴注入時要做的正確事情,還是我把事情做得太過分? (即可以實例化某些類而不是注入它們,還是應該避免像瘟疫一樣的「新」?)
我知道我的示例存在問題(例如,您沒有義務傳入SafeHandle實例,只有一個IDisposable實例)。
爲什麼你認爲你應該注入句柄,而不是在課堂上創建它?這與TDD有什麼關係? – stuartd
我對TDD的理解是,除非我有一個失敗的測試,否則我不能編寫代碼,我應該只寫最少量的代碼來通過測試。如果我堅持這一點,那麼我看不到我如何創建句柄,因爲我不能寫一個測試來斷言句柄被創建。 –