什么是控制反转?

控制反转(或IoC)在第一次遇到时会相当混乱。

  • 它是什么?
  • 它解决了什么问题?
  • 什么时候适合,什么时候不适合?

  • 控制反转(IoC)和依赖注入(DI)模式都是关于从您的代码中移除依赖关系。

    例如,假设你的应用程序有一个文本编辑器组件,并且你想提供拼写检查。 你的标准代码看起来像这样:

    public class TextEditor {
    
        private SpellChecker checker;
    
        public TextEditor() {
            this.checker = new SpellChecker();
        }
    }
    

    我们在这里完成的工作创建了TextEditorSpellChecker之间的依赖关系。 在一个IoC场景中,我们会做这样的事情:

    public class TextEditor {
    
        private IocSpellChecker checker;
    
        public TextEditor(IocSpellChecker checker) {
            this.checker = checker;
        }
    }
    

    在第一个代码示例中,我们实例SpellCheckerthis.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-to-do部分) - 提高事件(何时做)
  • 接口。 组件客户端(当要做的部分) - 组件接口实现(做什么部分)
  • xUnit固定。 安装程序和TearDown(做什么的部分) - xUnit框架在开始时调用安装程序,最后调用TearDown(何时做)
  • 模板方法设计模式。 模板方法当做 - 部分 - 原始子类实现什么部分
  • COM中的DLL容器方法。 DllMain,DllCanUnload等(做什么的部分) - COM / OS(何时做)
  • 链接地址: http://www.djcxy.com/p/5115.html

    上一篇: What is Inversion of Control?

    下一篇: Should an MVC Controller and View have a 1 to 1 relationship?