什么是控制反转?
控制反转(或IoC)在第一次遇到时会相当混乱。
控制反转(IoC)和依赖注入(DI)模式都是关于从您的代码中移除依赖关系。
例如,假设你的应用程序有一个文本编辑器组件,并且你想提供拼写检查。 你的标准代码看起来像这样:
public class TextEditor {
private SpellChecker checker;
public TextEditor() {
this.checker = new SpellChecker();
}
}
我们在这里完成的工作创建了TextEditor
和SpellChecker
之间的依赖关系。 在一个IoC场景中,我们会做这样的事情:
public class TextEditor {
private IocSpellChecker checker;
public TextEditor(IocSpellChecker checker) {
this.checker = checker;
}
}
在第一个代码示例中,我们实例SpellChecker
( this.checker = new SpellChecker();
),这意味着该TextEditor
直接类依赖于所述SpellChecker
类。
在第二个代码示例中,我们通过在TextEditor
构造函数签名中使用SpellChecker
依赖类(不是初始化类中的依赖项)来创建抽象。 这允许我们调用依赖关系,然后将它传递给TextEditor类,如下所示:
SpellChecker sc = new SpellChecker; // dependency
TextEditor textEditor = new TextEditor(sc);
现在,创建TextEditor
类的客户端可以控制要使用哪个SpellChecker
实现,因为我们正在向TextEditor
签名注入依赖项。
这只是一个简单的例子,Simone Busoli有一系列很好的文章详细解释了它。
控制反转就是你在程序回调时得到的东西,比如像gui程序。
例如,在旧的学校菜单中,您可能会:
print "enter your name"
read name
print "enter your address"
read address
etc...
store in database
从而控制用户交互的流程。
在一个图形用户界面程序或其他,而不是我们说
when the user types in field a, store it in NAME
when the user types in field b, store it in ADDRESS
when the user clicks the save button, call StoreInDatabase
因此,现在控制被反转...而不是以固定顺序接受用户输入的计算机,用户控制输入数据的顺序以及数据何时保存在数据库中。
基本上,任何带有事件循环,回调或执行触发器的东西都属于这个类别。
什么是控制反转?
如果你遵循这些简单的两个步骤,你已经完成了控制的反转:
根据您用于实施的技术/语言,每种步骤都有几种可能的技术。
-
控制反转(IoC)的反转部分是令人困惑的事情; 因为倒置是相对的术语。 理解IoC的最好方法是忘掉那个词!
-
例子
上一篇: What is Inversion of Control?
下一篇: Should an MVC Controller and View have a 1 to 1 relationship?