假设您的所有类都将通过 DI 容器调用。
首先是一个小对比案例:如果你去商店买一条裤子,那么你在几个时刻都在使用 DI。例如,你不必告诉你需要什么尺寸,帮助你的人有专业知识就可以找到。您将不得不说出您想要什么样的裤子,商店的人会根据您的意愿为您提供一些裤子(或让您知道这是不可能的)。一个不是 DI 的例子是所有这些裤子来自哪里的问题的答案。对于进入商店的顾客来说,这个问题的答案完全无关紧要。它永远不会成为进入商店的理由,那里需要一条特定类型的裤子。你可以问某种类型的未指定的问题,你会得到准确的答案。这就是DI的核心。如何完成与您无关,也与您无关。但你不能问什么。例如,你不能在布店买面包。这些问题必须与特定的 DI 主题(界面)相关。
Pimple 是一个关联数组。它不是 DI - 容器。据您所知,DI - 容器会返回一个接口,DI - 容器知道要加载哪个实现。让我给你一个例子,向你展示 Pimple 不是 DI 容器的地方。你在商店里,你选择了一条裤子,你想买它。现在你要付钱了。如何?那又是DI。对您来说没问题,您有几种可用的交易方法,您将选择一种。系统将如何回答你并不感兴趣:你什么也不说,拿起你的钱包开始付款。
在 Pimple 中,您必须选择用于付款的对象。客户将不得不说“我需要付款对象”。在真正的 DI - 容器中,您只需以合法的方式(界面行为)交出钱,并且基于输入数据,DI - 容器将知道选择哪个实现(现金、信用卡、万事达卡)。您不必为此担心。如果您仍然需要担心这一点,为什么称它为依赖注入?Pimple 是最好的服务定位器,但要使用 DI,您必须使用接口。否则就没有什么可隐藏的,没有依赖注入。:-)
所以,不要将 Pimple 用于 DI。它不是 DI - 容器。如果你打算使用 Pimple(它可以很好地组织你的课程),那么不要称它为 DI。它充其量是一个服务定位器,但它并没有使用接口隐藏实现。因此它不能是DI。
尝试组织你的代码库。不同类的作用是什么?哪些课程需要 DI?我建议您仅将 DI 用于执行功能要求的类。当您回到商店的案例时:商店人员直接与客户沟通的所有功能。不是为了实现如何走到后端试图找到另一条裤子。不是关于如何打开或关闭商店的过程。但是对于如何欢迎客户并询问某人想要什么样的裤子是肯定的。在您的应用程序中:是否有直接用于与应用程序访问者交互的接口/类,您能否创建某种类型的合同来描述交互?这就是那个 DI - 容器的设计。我不会到处使用 DI。DI 会带来性能损失和维护问题。您使用的 DI 越多,您将拥有的层数越多,您就越不知道在哪里发生了什么。最好在最有利的地方使用 DI,也就是最有可能实现更改但调用者不知道接口已更改,调用者也不对此类更改感兴趣的地方。如果您以此为指导,那么您能否区分哪些类通过 DI - 容器隐藏,哪些类不隐藏。最好在最有利的地方使用 DI,也就是最有可能实现更改但调用者不知道接口已更改,调用者也不对此类更改感兴趣的地方。如果您以此为指导,那么您能否区分哪些类通过 DI - 容器隐藏,哪些类不隐藏。最好在最有利的地方使用 DI,也就是最有可能实现更改但调用者不知道接口已更改,调用者也不对此类更改感兴趣的地方。如果您以此为指导,那么您能否区分哪些类通过 DI - 容器隐藏,哪些类不隐藏。