DI:使用哪种方法

时间:2019-03-31 09:46:36

标签: php dependency-injection

这是简单Data类的简化版本:

class Data
{

    public function __construct(string $key, string $value, int $ttlInSeconds)
    {
        $this->key          = $key;
        $this->value        = $key;
        $this->ttlInSeconds = $ttlInSeconds;
    }

    protected function getExpiration()
    {
        $dateHelper = new DateHelper();
        return $dateHelper->getCurrentTimestamp() + $this->ttlInSeconds;
    }
}

如您所见,DateHelper具有明显的依赖性,它基本上是一组日期获取器和操纵器方法。 现在,提到的Data类已在代码中广泛使用。通过构造函数设置DateHelper当然是我要选择的第一个选项!如果我这样做的话,我的代码将易于测试,但使用起来将更加困难和丑陋。 不仅如此,无论使用此简单Data类的任何类都具有完全相同的要求,这意味着DateHelper也将出现在许多其他类的构造函数中。什么更丑。 我想到的其他解决方案是:

  1. 使用服务定位器。但这会使测试变得更加困难,有时会造成混淆
  2. 使用setter方法将DateHelper设置为对象,这只会覆盖已实例化的对象
  3. 在构造函数中具有此依赖关系,但默认值为null。如果未设置,构造函数将实例化它

最后2个解决方案几乎相同,我更喜欢3.点。 但是我不会说这两种解决方案都很方便。 另外一个重要的信息是我不想去自动装配。

我真的不想发动关于“可用性与可测试性”的争论,只是想知道这里是否要遵循任何经验法则。

0 个答案:

没有答案