这个问题在这里已有答案:
我目前正在涉及IoC容器主题的文章和问题,例如:
现在有些事情并没有让我感到明显。
据我所知,依赖注入(DI)最纯粹的形式如下,由我自己制定:
作为依赖于某些抽象服务的对象,我不必寻找这些具体的服务;当我自己的一个实例被创建时,或者很快就会提供给我的具体实例。
这将DI直接与服务定位器形成对比,因为我重新制定:
作为依赖于某些抽象服务的对象,我知道有人可以打电话给我,他可以为我提供这些具体的服务;当我需要它时,我会问他们一个具体的例子。
我目前对DI容器的理解是这样的:
作为DI容器,我知道我需要创建的具体服务类,以及每个类,每个类需要哪些抽象服务;因此,我将创建这些服务的实例并提供它们的依赖项。
由于理解上的冲突,我现在没有发现IoC容器的明显内容。根据我正在阅读的文章,它看起来像:
val x = IoC.resolve<IMyDependency>()
);由于DI容器不需要具体服务就知道DI容器存在,因此它们不能是相同的概念。
在阅读StackOverflow的问题和答案时,这将是我的理解你能清楚这种困惑吗?
你问题中的“容器”和“概念”这两个词让你感到困惑。容器不是一个概念。这只是一个工具。但是Inversion Of Control和Dependency Injection是概念和原则,即使没有任何容器也可以使用它们。
Inversion of control是一种设计原则,其中计算机程序的定制编写部分从通用框架接收控制流。实际上,任何框架都是控制反转的一个例子。因此,ASP MVC是控制反转的一个例子。
Dependency Injection是更广泛的控制反转技术的一种形式。这只是Inversion Of Control的一个特例。 Andpendency Injection不是Dependency Injection容器。您可以在应用程序中使用依赖注入,而无需任何依赖注入容器。
但是为了减少手动工作量,我们通常使用容器,我们通常将其称为DI容器或IoC容器。所以DI容器和IoC容器是同义词,但DI容器在这里是一个更精确的术语。
但是Inversion Of Control和Dependency Injection不是同义词。依赖注入是控制反转的特例。