我理解依赖注入(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/