我一直在研究一项在ZendFramework2.0中包含服务定位器和依赖注入容器的提案,我遇到的一个问题是试图向不熟悉这些概念的开发人员解释基本概念——或者不熟悉这些概念的先入之见我提出的用例。
在一两周前和我妻子谈论这件事时,我意识到我需要一个她能理解的类比;我基本上是把她当作我的橡皮鸭。结果证明这是个好主意,因为它给了我一些很好的类比。
外出就餐
类比是这样的:你走进一家汉堡店,你饿了。
- 依赖注入就像从菜单上点菜——但要指定诸如“我想用波塔贝拉蘑菇代替肉饼,谢谢”之类的东西。菜单上列出的汉堡肉饼。
- 服务定位就像点餐时有替代品,而让服务员完全忽略替代品;您可以得到菜单上的内容,仅此而已。
现在,谈到ZendFramework的第1版发布时,我们真的一无所获。我们的情况更像是自助餐或厨房——你拿一点这个,拿一点那个,然后组装你自己的汉堡。这是更多的工作。
坦率地说,我很懒惰,喜欢我的晚餐……如果我想要任何替代品,我也想要那些。
获取成分
与我交谈过的许多开发人员似乎认为DI有点太“神奇”了——他们担心他们会失去对应用程序的控制:他们不知道在哪里设置依赖项。
有两点需要注意:
- 你,开发者,预先定义依赖关系
- 如果你不从容器中拉出对象,你负责
关于第二点,一些开发人员似乎认为有了DIcontainer,依赖项就会神奇地注入到每个对象中。但事实并非如此。如果您使用普通的PHP:
$o = new SomeClass();
您将获得一个新实例,就像往常一样,只配置了您传递给构造函数的任何参数或调用它的方法。只有当您从DI容器中检索对象时,您的依赖注入才会发生;如果这样做,您始终可以检查DI配置(可以是编程的或通过配置文件)以确定配置了哪些依赖项。
基本上,这就像用新鲜磨碎的牛腰肉制作自己的汉堡肉饼和从In-N-Out订购AnimalStyle之间的区别。
我现在完成了
您最喜欢的这些概念的思考方式是什么?