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

本文关键字:注入 我应该 SafeHandle 实例 接口 IDisposable 依赖 | 更新日期: 2023-09-27 18:05:58

根据MSDN,实现IDisposable接口的最佳方法是使用SafeHandle类的实例。

在给定的示例中,它们有以下行;

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和依赖注入时,这是正确的事情吗?还是我走得太远了?(例如,是否可以实例化某些类而不是注入它们,或者我是否应该像瘟疫一样避免使用"new"?)

我知道我的例子有问题(例如,你没有义务传递一个SafeHandle实例,只有一个IDisposable实例)。

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

您不应该使用DI向您的类提供SafeHandleSafeHandle是类中的内部实现细节,它用来实现IDisposable。类的用户不需要知道这个内部实现。DI旨在为您的类提供与您的类协作的外部实体。不要害怕对只在你的类中使用的对象使用new

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

值是对固定数量建模的不可变实例。对象…使用可变状态来模拟它们随时间变化的行为。

这本书中描述的风格使用DI来连接一个相互协作的"对象"网络,并使用模拟对象来测试这些协作。另一方面,在生产和测试代码中需要时,使用new创建"值",并将其作为参数和返回值传递。