当我尝试正确使用依赖注入和IDisposable接口时,我应该注入一个SafeHandle实例吗? C#

时间:2016-09-07 13:09:11

标签: c# .net dependency-injection tdd idisposable

根据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实例)。

1 个答案:

答案 0 :(得分:1)

您不应该使用DI为您的班级提供SafeHandleSafeHandle是您班级中的内部实施细节,用于实施IDisposable。您的班级用户不必了解此内部实施。 DI旨在为您的班级提供您的班级与之合作的外部实体。不要害怕将new用于仅在您班级中使用的对象。

一本非常好的资源是书:http://www.growing-object-oriented-software.com/我无法在这里描述整本书,但这里有几个想法。他们谈论“价值观”和“对象”。

  

值是对固定数量建模的不可变实例。对象   ......使用可变状态来模拟他们的行为。

本书中描述的样式使用DI来连接彼此协作的“对象”Web,并使用模拟对象来测试这些协作。另一方面,在生产和测试代码中需要时,使用new创建“值”,并将其作为参数和返回值传递。