Design patterns 什么是控制反转?这与依赖注入有什么关系?

Design patterns 什么是控制反转?这与依赖注入有什么关系?,design-patterns,dependency-injection,inversion-of-control,Design Patterns,Dependency Injection,Inversion Of Control,可能的重复项: . 我总是觉得这个问题很难回答。 也许这个问题的一部分可以在堆栈上得到回答,但总的来说,这是非常重要的 我还想知道国际奥委会除了直接投资以外的其他形式 有人能给我解释一些实时的例子吗 感谢您的采访,我想简单地说,控制反转是通过将执行顺序与正在执行的实际业务规则分离来将组件彼此分离的能力。例如,在MVC应用程序中,视图调用多个控制器,不关心控制器将做什么,而是控制它们的执行顺序 依赖项注入使用接口在类之间进行调用,只有在运行时才会指定实际的类(例如在配置XML文件中)。DI允许在

可能的重复项:

. 我总是觉得这个问题很难回答。 也许这个问题的一部分可以在堆栈上得到回答,但总的来说,这是非常重要的

我还想知道国际奥委会除了直接投资以外的其他形式

有人能给我解释一些实时的例子吗


感谢您的采访,我想简单地说,控制反转是通过将执行顺序与正在执行的实际业务规则分离来将组件彼此分离的能力。例如,在MVC应用程序中,视图调用多个控制器,不关心控制器将做什么,而是控制它们的执行顺序

依赖项注入使用接口在类之间进行调用,只有在运行时才会指定实际的类(例如在配置XML文件中)。DI允许在更细粒度的级别上进行测试。它通过从测试中隔离bug来帮助维护


它们的相似之处在于依赖项注入使用控制反转来允许代码调用接口,而不必关心实际的实现类,只关心接口。依赖项注入允许(从示例中)视图控制接口调用的顺序,而不关心实际使用的类。

依赖项注入不是IoC的一种形式。控制反转是一种与DI完全无关的模式,除了它们通常在某种框架中一起使用这一事实,这导致人们认为它们是相同的东西,而实际上它们不是

依赖项注入仅仅意味着通过构造函数或一系列设置器将类的依赖项注入其中,而不是在类中实例化它们。它可以在没有任何类型的IoC容器的情况下完全手动完成

手动DI的一个非常简单的例子是:

import org.apache.http.client.HttpClient;


public class TwitterClient {

    private HttpClient httpClient;

    public TwitterClient(HttpClient httpClient){
        this.httpClient = httpClient;
    }
}
无论何时在代码中创建TwitterClient,都必须创建一个HttpClient并将其传入。由于这将是相当乏味的,有一些框架使其更容易,但正如我所提到的,完全可以手动完成。本文涉及手动DI-,事实上,一些Google产品的早期版本完全是围绕手动DI构建的

这里的好处是,您可以交换实现,因此,如果您想为了单元测试目的而传入一个存根客户机,这很容易。否则,就没有真正的方法对这样的类进行单元测试


IoC意味着您拥有某种框架,可以控制应用程序的生命周期。不涉及DI的IoC的一个很好的例子就是控制Cocoa应用程序生命周期的任何Cocoa apple框架。您实现了某些方法,这些方法在应用程序生命周期的某些点被调用。这就是为什么它是“好莱坞原则”,你不叫框架,框架叫你。

。解释了它们的不同之处。@duffymo,@Robert Harvey,对不起,伙计们,它们不是。@duffymo不,它们根本不一样,它们只是倾向于一起使用。面试问题的重点是要弄清楚谁真正知道它们是什么,因为它们被广泛使用,而且通常很少被理解。也因为面试官喜欢迂腐:-)重复:不仅迂腐,而且误导。来自(依赖注入Prasana2009)“控制权倒置这一短语相当模糊,意味着责任的一般性倒置,这是非特定的……在常用情况下,依赖关系注入器通常被称为IoC容器。为了清晰起见,在本书的其余部分,我将放弃IoC这个词及其邪恶的表亲IoC容器。“你能用.net或java术语解释一下国际奥委会吗。我不熟悉苹果的框架,这是一个非常普遍的概念。这意味着,您部署代码的框架控制着代码的生命周期,而不是您的代码控制自己的生命周期。在这种情况下,容器负责创建和初始化应用程序,并控制哪个应用程序处理哪个请求。应用程序容器可能不是人们认为的IoC,但它是……我不会说DI与IoC完全无关。国际奥委会使用直接投资来实现其目标。IoC不需要框架。@Robert Harvey IoC不需要使用DI。时期句号。大多数时候,情况并非如此。它在Spring和类似Spring的框架中一起使用,因此人们经常将两者混为一谈。事实上,它们是两个独立的东西,这是像这样的面试问题的要点(可能更多的是因为它很容易提问,而不是因为它显示了实际有用的知识)。我第一次看到这个词是在Martin Fowler的网站上,他的例子实际上依赖于一个窗口工具包,没有任何地方提到DI。