我已经编程有一段时间了,但从来没有兴趣从理论上了解每个概念的含义,我可能正在使用各种编程概念,但我并不知道。
服务定位器:
对我来说,指的是通过减少代码量来加快开发速度的捷径记录。一个问题是:定位器可以仅引用名称空间/类,或者我可以拥有变量注册表吗?
以下是我对它的理解:
$locator = new ServiceLocator()
$locator->set('app', new System\Application());
$locator->set('db', new System\Pdo());
// Get the objects
$locator->get('db')->connect();
$locator->get('app')->run();
依赖注入(和依赖注入容器):
在对象中注入对象,无论工厂模式如何,都可以更快地访问这些对象。还有 DI 容器?
以下是我对它的理解:
$app = new System\Application(System\Config::load());
控制反转:
不理解这个设计模式(或者理解但不知道我做的是不是IoC)
那么,理论上(最好有简单的例子),这些概念分别意味着什么?我是对的,还是有什么问题/可以改进吗?
Thanks!
服务位置和依赖注入首先是为了解耦类,以便可以轻松地测试和更改它们。
当你比较register and resolve的一部分国际奥委会容器 with a 服务定位器 it seems是一样的。
您可以使用 IoC 容器作为服务定位器,这被认为是一种反模式。当您使用服务定位时,您始终必须在整个架构中主动调用服务定位器。因此,您可以解耦您的类,但另一方面,您可以将它们全部耦合到服务定位器。此外,使用服务定位器发现依赖关系更加困难,因为您隐藏了依赖关系。而使用依赖注入时,您可以使用构造函数注入将依赖关系设为“公共”。
当您使用 IoC 容器时,您使用依赖注入(构造函数注入或属性注入)。 IoC 容器现在能够通过查看构造函数参数来解析依赖关系图并创建整个依赖关系图。这就是所谓的自动连线。服务定位器无法自动装配依赖项。
正如我已经提到的,您不必被迫使用自动装配,您可以通过简单地直接调用每个类中的 IoC 容器来轻松地使用 IoC 容器,就像服务定位器一样,但你不应该!
也可以看看:https://stackoverflow.com/a/11319026/175399
![enter image description here](https://i.stack.imgur.com/zTMoJ.png)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)