【问题标题】:Dependency injection, how to inject "other" object?依赖注入,如何注入“其他”对象?
【发布时间】:2021-08-04 01:04:22
【问题描述】:

我总是听说它是硬编码的:

final class Dependency {}

class A
{
    private Dependency $dependency;

    public function __construct()
    {
        $this->dependency = new Dependency();
    }
}

好的,让我们使用依赖注入:

class A
{
    private Dependency $dependency;

    public function __construct(Dependency $dependency)
    {
        $this->dependency = $dependency;
    }
}

什么使它变得更好?除了Dependency,我什么都不能通过!

【问题讨论】:

  • 想象一下这个依赖有它自己的依赖。然后这些依赖项有它们自己的......你真的想要在一个特定类的构造函数中硬编码整个混乱吗?一旦另一个类具有相同的依赖关系,你想重复它吗?或者您更愿意让一个中心点(服务容器)负责这个实例化,将这些依赖项传递给构造函数?
  • 后一个给你向上转换到更通用类型的特权。例如,Parent p = new Child(); 是一种优势。
  • 或者暗示一个接口,允许你在给定的情况/环境中传递你需要的任何具体实现。

标签: php design-patterns dependency-injection


【解决方案1】:

最常见的设计是依赖是多态对象,即基类或接口。在这种情况下,依赖注入使您能够提供任何子类型,包括测试替身。

但即使Concrete Dependencies 也有一些优势。正如 cmets 所暗示的,依赖关系可能隐藏了它自己的大对象图。此外,构造函数注入使多个类可以共享一个实例,您可以将其注入到所有需要它的对象中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-26
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-26
    相关资源
    最近更新 更多