Dependency injection 有人对依赖注入有很好的类比吗?

Dependency injection 有人对依赖注入有很好的类比吗?,dependency-injection,Dependency Injection,我已经读了很多关于依赖注入的文章,也看了很多视频,但我仍然无法理解它。有人有好的类比来解释它吗 我看了《敏捷之秋》的第一部分,仍然有点困惑。类比?我要打它一下。。。如果没有带音乐的CD,您的CD播放器立体声将毫无用处。。。(这取决于CD)。如果他们制造的CD播放器中已经有CD,它会很快变得很无聊 因此,他们构建它们,以便您可以将CD(它所依赖的CD)“注入”到播放机中。这样,您每次可以注入不同的一个,并根据您注入的对象获得“不同”的行为(音乐) 唯一的要求是CD必须与播放机定义的界面兼容。(你不

我已经读了很多关于依赖注入的文章,也看了很多视频,但我仍然无法理解它。有人有好的类比来解释它吗

我看了《敏捷之秋》的第一部分,仍然有点困惑。

类比?我要打它一下。。。如果没有带音乐的CD,您的CD播放器立体声将毫无用处。。。(这取决于CD)。如果他们制造的CD播放器中已经有CD,它会很快变得很无聊

因此,他们构建它们,以便您可以将CD(它所依赖的CD)“注入”到播放机中。这样,您每次可以注入不同的一个,并根据您注入的对象获得“不同”的行为(音乐)

唯一的要求是CD必须与播放机定义的界面兼容。(你不能在1992年的CD播放机中播放蓝光光盘。)

也许可以关注“注入”部分?当我看到这个术语时,我想到了注射器。将组件的依赖关系推送到组件的过程可以被认为是注入组件


就像身体一样,当它需要某种药物(它需要的一种成分)时,你可以把它注射到身体中。

我能想到的最好的类比就是雇佣一名技工

没有依赖注入,你雇佣一个技工,技工自带工具。他可能有糟糕的工具,他可能有很棒的工具,当他应该使用套筒时,他可能正在使用管钳。你不知道,也可能不在乎,只要他把工作做完


通过依赖注入,你雇佣了一名技工,并为他提供了你希望他使用的工具。你可以选择你认为是最好或最合适的工具来为你雇佣他做的工作。

你的项目经理要求你写一个应用程序。 你可以根据目前为止的工作经验编写一些代码,但这不太可能是你的首相想要的

如果你的PM依赖项为你注入了一个应用程序的规范,那就更好了。现在,您的代码将与他给您的规范相关

最好告诉您源存储库在哪里

如果有人告诉你技术平台是什么就更好了

如果有人告诉你什么时候需要你做这件事会更好


等等

在他们2003年的JavaPolis演示()中,Jon Tirsén&Aslak Hellesøy与一个需要男孩接吻的
女孩
物体进行了一个有趣的类比。我似乎记得,
男孩工厂有时被称为“夜总会”,但幻灯片中没有这一点。

另一个类比:假设你是一名开发人员,只要你愿意直接从市场上订购计算机科学书籍,你就知道卖家及其价格。事实上,你的公司可能有一个首选卖家,你可以直接与他们联系。所有这些都很好,但可能是一个新的卖家现在提供更好的价格,您的公司想改变“首选”卖家

此时,您必须进行以下更改-更新联系人详细信息(以及其他内容),以便使用新卖家。你还是直接下订单


现在我们来介绍一个新的步骤,在公司里有一个“图书馆员”,你必须经过他才能拿到书。虽然有一种新的依赖关系,但你现在对卖家的任何变化都免疫:要么卖家改变了付款方式,要么卖家自己也改变了,你现在只需向图书管理员下订单,他就可以为你买书

将其视为“控制反转”模式的实现。我想,你的问题是,你太习惯了,你没有意识到事情就这么简单

让我们从头开始

在早期,程序通过代码遵循给定的路径。被调用函数的顺序由程序员给出

在交互式程序中,例如,大多数是任何程序,您不能说在什么时候调用哪个函数。只需看看GUI或网站。你不能说,在什么时候点击了什么按钮或链接。因此,对正在发生的事情的“控制”不再是在程序中,而是在外部源中。“控制”已经颠倒。功能不再是“表演”,而是“倾听”。想想好莱坞的原则:“不要打电话给我们,我们打电话给你”。监听器是实现这种模式的一个很好的例子

IoC是在当今“面向对象世界”中通过函数或“方法”实现的

“依赖注入”现在的意思是相同的,但不适用于“方法”,它做某事,而适用于“对象”,它保存数据

数据不再是保存它的对象的一部分。它在运行时被“注入”到对象中。为了留在好莱坞,想想一个电影明星,打高尔夫球来谈论生意,但为了保持身材,她蹲下来,尽量减少肌肉重量,因此她一次只能拿一根棍子

因此,在高尔夫球场上,她的比赛将严重依赖于她携带的一根球杆

幸运的是,这里有球童,一次带着很多球杆,而且知道在什么时候使用什么球杆。现在,她独立于携带高尔夫球杆的有限可能性。“别想穿水泥球杆,我们都知道,在合适的时间给你合适的。”

电影明星是对象,高尔夫俱乐部是对象的成员。这就是依赖项注入。

来自头先设计模式:

记住,代码应该像晚上的莲花一样关闭(更改),而像早上的莲花一样打开(扩展)

可以通过注入在其他类中定义的行为来配置启用DI的对象。原始的对象结构不存在