Dependency injection 什么';“的目的是什么?”;货柜;在一个;国际奥委会集装箱;?

Dependency injection 什么';“的目的是什么?”;货柜;在一个;国际奥委会集装箱;?,dependency-injection,inversion-of-control,ioc-container,Dependency Injection,Inversion Of Control,Ioc Container,可能重复: 使用IoC(或依赖项注入,DI)确实有助于创建可重用组件。据称,DI在测试类方面也有好处 但是,IoC/DI本身并没有将容器带到桌面上的目的是什么?由于涉及到成本,因此最好能够知道成本何时变得合理。IOC系统中的“容器”是包含如何解决依赖关系映射的组件。例如,它知道当请求IFoo接口的依赖项时,它将解析为FooImpl 您通常必须在某个地方执行这些映射。通过配置文件、注释或其他运行时组件 您通常会从这样的容器中获得所有分辨率。它有时也被称为内核。我认为您需要保持术语清晰: IoC是

可能重复:

使用IoC(或依赖项注入,DI)确实有助于创建可重用组件。据称,DI在测试类方面也有好处

但是,IoC/DI本身并没有将容器带到桌面上的目的是什么?由于涉及到成本,因此最好能够知道成本何时变得合理。

IOC系统中的“容器”是包含如何解决依赖关系映射的组件。例如,它知道当请求IFoo接口的依赖项时,它将解析为FooImpl

您通常必须在某个地方执行这些映射。通过配置文件、注释或其他运行时组件


您通常会从这样的容器中获得所有分辨率。它有时也被称为内核。

我认为您需要保持术语清晰:

IoC是控制反转,这是系统的主流由应用程序核心之外的东西处理的原理。也就是说,有各种各样的容器来协调执行,还有封装业务逻辑的应用程序代码。这篇文章给出了很好的解释

DI是依赖项注入,它的思想是,一个代码单元不更新其依赖项,而是从稳定该单元的代码中获取它们。再说一遍


将这两者结合起来意味着拥有一个中央化的、倒置的、负责恢复一切和解决依赖关系的系统。无论中央化代码做什么,这都是IoC/DI容器。您可以自己编写,也可以使用现成的版本。

依赖项注入通过将依赖项连接方式移动到应用程序中的单个位置(即启动路径)来帮助您的代码保持可维护性。这很好,因为这个组合根(就像应用程序中的其他所有东西一样)只有一个职责

当您的应用程序发展壮大时,您将看到类本身并不会变得更加复杂(当遵循这些原则时)。但是,组合根将很快变得庞大和复杂,特别是在使用装饰器添加行为和按约定注册等操作时

这就是DI容器发挥作用的地方。虽然坚实的原则可以帮助您设计灵活且可维护的应用程序,但DI容器可以帮助您保持组合根目录的可维护性。这是它唯一的目的。使用容器所做的一切都可以在没有容器的情况下完成,但这通常会导致大量重复的样板代码,难以阅读和维护


同样,DI容器的唯一目的是使组合根目录可维护。

容器的职责是管理实例。

对我来说,容器就像一个桶,所有接口的实现都在其中,当IOC需要解决依赖关系时,它就陷入了困境。什么时候在您自己的代码之外解决依赖关系变得更容易?你怎么知道你什么时候需要这个容器?我遵循“屁股痛”的规则。只要有一个容器,比没有容器更痛苦。我添加了一个。无论您是在代码中还是在xml文件中,组合根不是都会变得大而复杂吗?我会尽可能避免使用xml配置,因为它很难看,而且没有编译时支持。好的应用程序设计有助于保持合成根目录(CR)的简单。例如,在围绕和设计业务层时,您将看到几乎所有内容都可以由容器自动注册。当您的CR变得复杂时,请查看您的设计,开始使用DI容器或交换容器。Wikipedia关于IoC的文章指出,“依赖注入是实现控制反转的主要方法”。容器似乎不属于IoC的范畴?