php - 依赖注入(inject)容器与注册表模式

标签 php oop design-patterns dependency-injection

我理解依赖注入(inject)原则是关于解耦代码的。不是在类中创建新的实例,而是注入(inject)它们,从而使它们 松耦合。

现在,如果我必须传递一组将在整个应用程序中通过多个类使用的对象,我可以创建一个容器(通常称为依赖注入(inject)容器)。

这正是我正在做的,因为我必须传递一个配置对象、一个记录器对象、一个翻译器对象等,它们将在我的应用程序的多个类实例中使用。我通过几个类传递整个容器,即使并非所有类都需要访问容器内的所有对象。这让我想到了以下问题:如果我创建一个全局注册表并将对象放在那里,然后像 Registry::getInstance()->get('logger'); 一样检索它们,有什么区别? ?无论我使用全局注册表还是依赖项容器,类实例都可以访问容器或注册表中的所有对象,即使它们不需要查看/访问所有对象也是如此。

结论:如果我沿着我的类或全局注册表传递依赖项注入(inject)容器,有什么区别?

最佳答案

Note: sometimes people use Registries by different names. The common ones that i have seen as: Locator, Context and System.

使用全局注册表会导致您的代码绑定(bind)到所述注册表的类名。这意味着您无法独立测试您的代码。注册表的设置方式对您说谎:您永远不知道需要哪个实例。

It is quite common for people to confuse DI Containers with Registries.

DI 容器不是您注入(inject)到类中的东西。相反,它是对工厂的增强:它确定类 Foo 需要在构造函数中注入(inject) Bar 的实例。然后,根据设置,它要么获取 Bar 的新实例,要么使用现有实例来提供所述依赖性。

  • 在一个简单的工厂中,您通常必须对将被注入(inject)的依赖项进行硬编码。在这种情况下,工厂可以构建什么,受到类构造函数的“足迹”的限制。

  • 当factory用作DI容器时,它可以生产出具有各种依赖关系的实例。在此设置中,您的工厂专注于构建与某些特定命名空间(或其他高级)逻辑类组相关联的实例。

关于php - 依赖注入(inject)容器与注册表模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17142644/

相关文章:

php - 模拟 pdo 对象会产生简单的参数错误

php - 设置全局 PHP-CURL 上传和下载速度限制?

python - 禁止在 collections.defaultdict 中添加键

php - oop PHP 多个构造函数

java - 随着 Java8 接口(interface)中默认方法的出现,类适配器现在可以在 Java 中使用

java - `final` 上的 `class Singleton` 和 `private` 上的 `Singleton()` 是否彼此冗余?

php - 如何使用 xml-rpc 在 odoo 中插入 one2many 值

php - 如何使用php连接两个不同服务器上的两个数据库

java - 为什么更喜欢变量的 getter 和 setter 方法而不是将其公开?

php - 依赖注入(inject) : pulling required components when they are actually needed