给定一个类:
class Container
{
public function getServiceX()
{
create and return it
}
public function setServiceX ($obj)
{
}
}
它存储对象的实例。你可以把它看作一个工厂。实际行动:
public function addTitle()
{
Container::getServiceX()->doIt();
}
他们说它不好,因为它是“全局性的”。但对象可以改变,因此它满足 DI - 但会伤害 LoD。 如果这很糟糕,那么好的解决方案是什么?如何确保一个类到达serviceX?
最佳答案
本质上,这是一个服务定位器或服务工厂。您甚至可以将其称为依赖项注入(inject)容器。这本身就很好。事实上这很棒。它的问题是你静态地调用它!您应该将依赖项注入(inject)容器注入(inject)到您的类中:
class Foo {
protected $container;
public function __construct(Container $container) {
$this->container = $container;
}
public function addTitle() {
$this->container->getServiceX()->doIt();
}
}
现在,您已经完全依赖注入(inject)并解耦了。
通过静态耦合调用,您仍然可能会遇到最初试图通过依赖注入(inject)容器避免的情况。如果您需要使用服务 X 注入(inject)一个类,并使用配置稍有不同的服务 X 实例注入(inject)第二个类,但您静态调用只能保存服务 X 的一份副本的同一个容器,该怎么办?您可以通过解耦对容器的静态调用并允许注入(inject)不同配置的容器来解决此问题。
关于Php,为什么 "global container"不好,如何避免?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32441201/