什么是控制倒置?这与依赖注入有什么关系?

时间:2011-02-18 03:22:20

标签: design-patterns dependency-injection inversion-of-control

  

可能重复:
  Difference between Dependency Injection (DI) & Inversion of Control (IOC)
  Inversion of Control < Dependency Injection

嘿,这是Scott Hanselman interview question。我总觉得这个问题很难回答。 可能是这个问题的一部分可以在堆栈上回答,但总的来说这非常重要。

除了DI,我还想了解其他形式的IoC。

有人可以用一些实时的例子来解释我。

由于

2 个答案:

答案 0 :(得分:13)

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

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

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

import org.apache.http.client.HttpClient;


public class TwitterClient {

    private HttpClient httpClient;

    public TwitterClient(HttpClient httpClient){
        this.httpClient = httpClient;
    }
}

每当你在你的代码中创建一个TwitterClient时,你还必须创建一个HttpClient并将其传入。由于这将是相当繁琐的,有一些框架可以使它更容易,但正如我所提到的,它完全有可能做到这一点手动。本文涉及手册DI - http://googletesting.blogspot.com/2009/01/when-to-use-dependency-injection.html,事实上,某些Google产品的早期版本完全围绕手动DI构建。

这里的好处是你可以交换实现,所以如果你想传入一个存根的客户端进行单元测试,那很容易。否则,就没有真正的方法来对这样的类进行单元测试。

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

答案 1 :(得分:6)

对于一次采访,我会简短地说,控制的反转是通过将执行顺序与正在执行的实际业务规则分开来将组件彼此分离的能力。一个例子是MVC应用程序,一个调用几个控制器的视图,不关心控制器将做什么,而是控制它们执行的顺序。

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

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