5

在对非 DI 系统进行编程时,一直困扰着我的一个比喻是“一个人在玩他/她的玩具”。人是对象,人的玩具是对象创建、存储、初始化和操作的任何东西。当玩具达到某种状态时,它们可以发送事件,但它们对使用它们的人一无所知;它们只是带有构成其接口的控制开关的小黑匣子。该人可以监听来自玩具的事件并通过操纵它们的界面做出响应。这个人可以用他/她的玩具做他/她想做的任何事情,但他/她可能不应该去干预他们的内脏,因为它们可能会破裂。

DI 对我的比喻造成的破坏是,它把玩具变成了有意识的存在,知道它们的主人,使用它们的人。玩具可以操纵这个人,但这个人不知道它们是如何工作的,甚至不在乎。该人只是拥有玩具并期望玩具操纵他/她以使玩具自己满意。

怎么回事??听起来很可怕!!
他们用来思考 DI 系统如何工作的一个好的心理隐喻是什么?

4

8 回答 8

11

想想一个绅士和他的管家。管家(DI 框架)根据需要向绅士提供他需要的任何服务(外部依赖项)(还有一些,比如早晨的咖啡,在“初始化”时 :-));绅士(你的班级)只是消费服务而不关心它们来自哪里,只要它们满足他的要求(实现某些接口)。

或者如果你想让它更接近你的隐喻,你的班级是孩子,DI 框架是妈妈,而玩具是其他组件。孩子不在乎玩具是从哪里来的,只要她能按照自己喜欢的方式玩就行。

于 2009-10-10T17:54:17.943 回答
3

SOLID励志图片是一个很好的来源。

依赖注入原理的隐喻

于 2009-10-10T18:01:56.947 回答
2

从我的角度来看,就你的比喻而言,DI 和非 DI 之间的区别在于非 DI 系统,每个人都制作自己的玩具——他们必须知道如何制作它们,而且他们只能使用他们制作的玩具。使用 DI,这个人使用他们给的玩具。他们不知道如何制作它们,但是只要他们知道玩具的行为方式,他们就可以玩任何给他们的玩具。

于 2009-10-10T17:53:03.237 回答
2

乐高积木。

将乐高积木视为一种软件组件,它公开一个或多个接口(顶部的小凸起)并具有一个或多个设置器或构造函数参数(底部的孔)。

当您购买一盒乐高积木时,积木不会预先组装(硬接线)。它们是独立的组件。然后,您通过将接口(凸块)连接到设置器/构造器(孔)来组装它们(连接它们)。每个块直接对其他块一无所知。组装它们需要块以外的东西 - 那是你(或 main() 或 Spring 配置文件等)。

我知道......这有点崩溃,因为乐高积木在很大程度上有一个统一的界面 - 但它对我有用:-)

于 2009-10-10T17:57:26.563 回答
2

我用电脑系统。你有一个系统块,你(一个 DI)连接到它一个显示器、一个键盘和一个鼠标。系统块只知道显示器是 DVI 设备,但并不关心它到底是哪台显示器。它知道如何使用 USB 鼠标,但不知道也不关心它是光学鼠标还是滚珠鼠标。

你 - DI 框架。
系统块 - 是正在服务的系统。
监视器/鼠标/键盘 - DI(您)向系统块提供的服务。

于 2009-10-10T17:59:34.220 回答
1

玩具没有意识。他们只是让人们将一些绳子系在钩子上,当某些事情发生时,钩子会转动,绳子就会被拉上,所以这个人知道发生了什么事。

于 2009-10-10T17:50:00.213 回答
1

有人告诉我的一个 DI 隐喻是将其与 CD 播放器相关联。播放器不在乎你放入了什么CD;但是,您注入播放器的每张 CD 都会根据播放器的要求提供不同的功能。

于 2009-10-10T18:00:23.063 回答
0

这都是关于武士和武器的。尝试检查 ninject:http ://ninject.org/ 。转到“参观道场”角色以获得有趣的隐喻。不确定这是否是您的意思,但它仍然很有创意。

于 2009-10-10T17:55:51.013 回答