假设我正在使用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:
答案 0 :(得分:1)
假设我正在使用IoC容器,为什么我的类型必须具备 注入所有依赖项?为什么每种类型都不能假设 容器存在,只是检索它所需的依赖项 本身?这有什么缺点?
我能想到的几个原因,你提到了一个:
您担心在依赖项的依赖项更改时调整代码的容易程度是有效的;这对IoC来说是一个非常强大的论据(让容器自动为你做这件事;只要它能够满足所有依赖关系,就不会有任何破坏)。