有没有人对依赖注入有一个很好的比喻?

时间:2009-01-08 14:39:48

标签: dependency-injection

我已经阅读了很多关于依赖注入的文章以及观看过很多视频,但我仍然无法理解它。有没有人有类似的解释呢?

我观看了敏捷秋播的第一部分,仍然有点困惑。

12 个答案:

答案 0 :(得分:64)

<强> 类比 ?我会给它一个打击......你的CD播放器立体声是没用的,上面没有带音乐的CD ......(这取决于CD)。如果他们用CD已经制作了CD播放器,它会很快变得无聊......

所以他们构建它们,这样你就可以将CD(它依赖的CD)“注入”到播放器中。这样你每次都可以注入一个不同的行为,并根据你注入的行为获得“不同”的行为(音乐)。

唯一的要求是CD必须 兼容 ,且播放器定义的 接口 。 (你不能在1992年的CD播放器中播放蓝光光盘。)

答案 1 :(得分:7)

我能想到的最好的比喻就是聘请机械师。

没有依赖注入,你雇用一名机械师,机械师带来自己的工具。他可能有糟糕的工具,他可能有很棒的工具,当他应该使用插座时他可能会使用管钳。只要他完成工作,你就不知道,也可能不关心。

通过依赖注入,您聘请了一名机械师,并为他提供了他希望他完成工作的工具。您可以选择您认为最适合您工作的工作的工具。

答案 2 :(得分:2)

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

让我们从头开始。

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

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

IoC是通过当今“面向对象世界”中的功能或“方法”来实现的。

“依赖注入”现在意味着相同,但不是“方法”,做某事,而是“对象”,保存数据

数据不再是持有它的对象的一部分。它在运行时“注入”对象。留在好莱坞,想想一个电影明星,打高尔夫球来谈论生意,但为了保持体形,她渴望自己,最大限度地减少肌肉重量,因此她一次只能携带一个俱乐部。

所以,在高尔夫球场上,她的比赛很大程度上取决于她所携带的一个俱乐部。

幸运的是,有一些球童,一次带着很多俱乐部,并且知道在什么时候使用什么俱乐部。现在她独立于携带高尔夫球杆的有限可能性。 “不要考虑穿着具体的俱乐部,我们都知道它们并在合适的时间给你正确的。”

电影明星是对象,高尔夫球杆是对象的成员。这是依赖注入。

答案 3 :(得分:1)

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

就像身体一样,当医学需要某种东西(它需要的一种成分)时,你可以将它注射到体内。

答案 4 :(得分:1)

在2003年的JavaPolis演讲中(slides),JonTirsén&amp; AslakHellesøy对Girl物体有一个有趣的比喻,需要Boy亲吻。我似乎记得BoyFactory有时被称为“夜总会”,但这不在幻灯片中。

答案 5 :(得分:1)

另一个类比:让我们说你是一名开发人员,无论何时你喜欢直接从市场上订购计算机科学书籍 - 你都知道卖家和他们的价格。事实上,您的公司可能有一个首选卖家,您可以直接与他们联系。所有这一切都运行良好但可能是新的卖家现在提供更好的价格,你的公司想要改变'首选'卖家。

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

现在考虑我们介绍两者之间的新步骤,公司里有一个“图书馆”官员,你必须通过他来获取书籍。虽然存在新的依赖关系,但您现在可以免受卖方的任何更改:卖方更改付款方式或卖方本人已更改,您现在只需向图书管理员下订单并为您获取图书。

答案 6 :(得分:1)

来自 Head First Design Patterns

  

请记住,代码应该像晚上的莲花一样关闭(改变),然后像早晨的莲花一样打开(延伸)

可以通过注入在其他类中定义的行为来配置启用DI的对象。原始对象结构没有变化以创建许多变体。注入可以通过在其构造函数中请求其他worker-classes来显式化,或者在Python等动态语言中使用monkeypatching时可以不那么明显。

使用Person类的类比,你可以采用一个基本的人类框架,传递一组器官,并观察它的演变。该人并不直接知道器官是如何工作的,但他们的行为确认了预期的界面并影响了所有者的身心表现。

答案 7 :(得分:1)

魔术师的sleight of hand!您可能认为自己看到的内容可能会被秘密操纵或替换。

答案 8 :(得分:1)

生活充满了依赖注入类比:

  • 打印机 - 墨盒
  • 数字设备 - 电池
  • 信 - 邮票
  • musician - instrument
  • 公交车司机
  • 疾病 - 避孕药

答案 9 :(得分:1)

控制反转的本质(其中依赖注入是一种实现)是将对象的使用与其管理分开。

我使用的类比/示例是引擎。发动机需要燃料运转,即燃料不足。但是,发动机不能对其所需的燃料负责。它只是“询问”燃料,并提供(通常通过汽车中的燃油泵)。

当你看起来太深时,类比会开始打破,因为发动机不需要燃料,它是由某种管理元件给出的,比如ECU。有人可能能够将ECU与容器进行比较,但我不确定这是多么有效。

答案 10 :(得分:0)

您的项目经理要求您编写应用程序。

到目前为止,您可以根据自己的职业经历编写一些代码,但这不太可能是您的PM想要的。

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

如果您被告知源存储库位于何处,那就更好了。

如果你被告知技术平台是什么,那就更好了。

如果你被告知何时需要这样做,那就更好了。

等。

答案 11 :(得分:0)

我认为一个很好的比喻是一个六岁的乐高乐器。

你希望你的物体像乐高积木一样。每一个都独立于其他所有,但提供了一个清晰的界面,可以将它们连接到其他人。将它们连接在一起时,只要它们具有匹配的界面,您确切地将哪两块砖挂在一起并不重要。

你的依赖注入框架就像六岁了。他遵循指示(即您的配置文件,注释等)以特定方式将特定砖块连接在一起以制作特定模型。

当然,由于砖块的界面非常通用,它们可以通过多种不同的方式组合在一起,因此很容易想出新的指令集,六岁的孩子可以使用这些指令来完全不同模型用同样的砖块。