gpt4 book ai didi

php - 服务定位器、依赖注入(inject)(和容器)和控制反转

转载 作者:行者123 更新时间:2023-12-03 00:39:54 27 4
gpt4 key购买 nike

我已经编程有一段时间了,但从来没有兴趣从理论上了解每个概念的含义,我可能正在使用各种编程概念,但我并不知道。

服务定位器:对我来说,指的是通过减少代码量来加快开发速度的捷径记录。一个问题是:定位器可以仅引用 namespace /类,还是我可以拥有变量注册表?

这是我的理解:

$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();

依赖注入(inject)(和依赖注入(inject)容器):在对象中注入(inject)对象,无论工厂模式如何,都可以更快地访问这些对象。还有 DI 容器?

这是我的理解:

$app = new System\Application(System\Config::load());

控制反转:不理解这个设计模式(或者理解但不知道我做的是不是IoC)

那么,理论上(最好有简单的例子),这些概念分别意味着什么?我是正确的,还是有什么问题/可以改进吗?

谢谢!

最佳答案

服务位置和依赖注入(inject)首先是为了解耦类,以便可以轻松地测试和更改它们。

当您将IoC容器注册解析部分与服务定位器进行比较时,>似乎是一样的。

您可以使用 IoC 容器作为服务定位器,这被​​认为是一种反模式。当您使用服务定位时,您始终必须在整个架构中主动调用服务定位器。因此,您可以解耦您的类,但另一方面,您可以将它们全部耦合到服务定位器。此外,使用服务定位器发现依赖关系更加困难,因为您隐藏了依赖关系。而使用依赖注入(inject)时,您可以使用构造函数注入(inject)将依赖关系设为“公共(public)”。

当您使用 IoC 容器时,您使用依赖注入(inject)(构造函数注入(inject)或属性注入(inject))。 IoC 容器现在能够通过查看构造函数参数来解析依赖关系图并创建整个依赖关系图。这称为 Autowiring 。服务定位器无法 Autowiring 依赖项。正如我已经提到的,您不必被迫使用 Autowiring ,您可以通过简单地直接调用每个类中的 IoC 容器来轻松使用 IoC 容器(如服务定位器),但您不应该!

另请参阅:https://stackoverflow.com/a/11319026/175399

enter image description here

关于php - 服务定位器、依赖注入(inject)(和容器)和控制反转,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10049940/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com