第一次遇到控制反转 (IoC) 时可能会非常混乱。
( Inversion-of-ControlIoC)模式是关于提供任何类型的callback(控制反应),而不是直接行动(换句话说,反转和/或将控制重定向到外部处理程序/控制器)。( Dependency-InjectionDI)模式是 IoC 模式的一个更具体的版本,旨在从代码中移除依赖项。
Inversion-of-Control
callback
Dependency-Injection
每个DI实现都可以考虑IoC,但不应该调用它IoC,因为实现依赖注入比回调更难(不要通过使用通用术语“IoC”来降低产品的价值)。
DI
IoC
对于 DI 示例,假设您的应用程序有一个文本编辑器组件,并且您想提供拼写检查。您的标准代码如下所示:
public class TextEditor { private SpellChecker checker; public TextEditor() { this.checker = new SpellChecker(); } }
我们在这里所做的创建了TextEditor和之间的依赖关系SpellChecker。在 IoC 场景中,我们将改为执行以下操作:
TextEditor
SpellChecker
public class TextEditor { private IocSpellChecker checker; public TextEditor(IocSpellChecker checker) { this.checker = checker; } }
在第一个代码示例中,我们正在实例化SpellChecker( this.checker = new SpellChecker();),这意味着TextEditor该类直接依赖于SpellChecker该类。
this.checker = new SpellChecker();
SpellChecker在第二个代码示例中,我们通过在 的构造函数签名中创建依赖类来创建抽象TextEditor(而不是在类中初始化依赖)。这允许我们调用依赖项,然后将其传递给 TextEditor 类,如下所示:
SpellChecker sc = new SpellChecker(); // dependency TextEditor textEditor = new TextEditor(sc);
现在创建TextEditor类的客户端可以控制SpellChecker使用哪个实现,因为我们将依赖项注入到TextEditor签名中。