Oop 如何使用IoC容器??我不知道';我不明白

Oop 如何使用IoC容器??我不知道';我不明白,oop,dependency-injection,ioc-container,Oop,Dependency Injection,Ioc Container,以下是我目前所知道的: DI让我可以构建可重用的、单元可测试的组件 DI是冗长的,因为它要求我显式地设置依赖项(通过构造函数或方法。尽管如此,我仍然不理解接口注入)。这就是为什么需要容器或服务定位器 容器比服务定位器好,因为类不需要知道它的存在 但我发现了这些问题: 有些类现在将依赖于容器?如果我没有像我的服务文件中描述的那样为每个类使用默认配置,一些类将需要调用容器来重新配置所需的对象 在本幻灯片的第79页,Fabien Povertier说,容器并不能管理所有对象,只管理具有单个实例(

以下是我目前所知道的:

  • DI让我可以构建可重用的、单元可测试的组件

  • DI是冗长的,因为它要求我显式地设置依赖项(通过构造函数或方法。尽管如此,我仍然不理解接口注入)。这就是为什么需要容器或服务定位器

  • 容器比服务定位器好,因为类不需要知道它的存在

但我发现了这些问题:

  • 有些类现在将依赖于容器?如果我没有像我的服务文件中描述的那样为每个类使用默认配置,一些类将需要调用容器来重新配置所需的对象

  • 在本幻灯片的第79页,Fabien Povertier说,容器并不能管理所有对象,只管理具有单个实例(但不是单个实例)的对象。我现在更糊涂了

非常感谢您的帮助。=)

有些类现在将依赖于容器

不,这就是为什么使用依赖注入而不是服务位置

在本幻灯片的第79页


见第82页,它说“不同于模型对象”。老实说,我从来没有这样解释过(“只有一个实例的对象(!=Singleton)”要么是错误的,要么是非常特定于PHP的,它一般不适用于依赖注入或IoC+DI容器),但我打赌他试图解释的是,容器通常管理类似服务的东西,与模型不同。

如果它们不依赖于容器,那么它们如何使用非默认配置(即:运行时定义的设置)创建子对象?@HappyDeveloper:所有连接和配置都由容器完成。单个类接收依赖项和配置。是的,我知道,但这只适用于默认对象创建。如果在程序执行的某个点(在子对象的子对象的方法中),出于某种原因,我需要一个DB_缓存依赖项,而不是文件_缓存,该怎么办?我需要打电话给警察Container@HappyDeveloper:否,如果组件需要某个服务的不同实现,则取决于容器配置来提供正确的实现。1-容器读取配置文件2-容器连接所有内容3-我的应用程序继续执行,并且在某个点执行“if”语句,并创建A或B的实例。4-Container预测了未来,所以B(我想要的)已经连接好了?此外,有时我可能希望避免实例化(A或B的eiter)。我认为这行不通