为什么要注入依赖项?

时间:2012-06-30 17:13:25

标签: dependency-injection inversion-of-control ioc-container

假设我正在使用IoC容器,为什么我的类型必须具有注入的依赖关系?为什么每个类型都不能假设容器存在并只检索它自身所需的依赖项?后一种方法有哪些缺点?

我知道属性注入,但我不希望这个建议作为答案,即使它确实存在更复杂类型的长参数列表构造函数。这并不会节省您最终需要输入/维护的代码。哦,我更愿意将依赖关系设为readonly / final(个人偏好)。

所以这是C#中构造函数注入的典型示例:

public class Calculator
{
    private readonly IAdder _adder;
    private readonly ISubtractor _subtractor;
    private readonly IMultiplier _multiplier;
    private readonly IDivider _divider;

    public Calculator(IAdder adder, ISubtractor subtractor,
                      IMultiplier multiplier, IDivider divider)
    {
        _adder = adder;
        _subtractor = subtractor;
        _multiplier = multiplier;
        _divider = divider;
    }
}

这就是我宁愿做的事情:

public class Calculator
{
    private readonly IAdder _adder;
    private readonly ISubtractor _subtractor;
    private readonly IMultiplier _multiplier;
    private readonly IDivider _divider;

    public Calculator()
    {
        _adder = Container.Get<IAdder>();
        _subtractor = Container.Get<ISubtractor>();
        _multiplier = Container.Get<IMultiplier>();
        _divider = Container.Get<IDivider>();
    }
}

我想在答案出来时保留一份利弊清单:

赞成

  • 清理构造函数,因为类型不需要“污染”具有依赖关系的构造函数。这不是一个大问题,因为计算器在其构造函数中除了依赖项之外没有任何东西,但想象它确实如此。例如。 public Calculator(Mode mode, bool UseDigitGrouping)
  • 当依赖项的依赖项发生更改时,客户端代码不会中断。
  • 维护较少的代码。

CONS:

  • 将来更难改变IoC容器。
  • 目前还不清楚类型的依赖关系是什么。

1 个答案:

答案 0 :(得分:1)

  

假设我正在使用IoC容器,为什么我的类型必须具备   注入所有依赖项?为什么每种类型都不能假设   容器存在,只是检索它所需的依赖项   本身?这有什么缺点?

我能想到的几个原因,你提到了一个:

  • 不再明白你的班级有哪些依赖关系,如果有的话
  • 该类将假定对容器的隐藏依赖性,最差的类型(假设它存在为全局或静态可访问)

您担心在依赖项的依赖项更改时调整代码的容易程度是有效的;这对IoC来说是一个非常强大的论据(让容器自动为你做这件事;只要它能够满足所有依赖关系,就不会有任何破坏)。