我有一个类,它依赖于3个类,所有3个类都有其他依赖的类。目前,我正在使用容器类来构建所有必需的类,将它们相互注入并返回应用程序。
容器的简化版本如下所示:
class Builder
{
private $_options;
public function __construct($options)
{
$this->_options = $options;
}
public function build()
{
$cache = $this->getCache();
$response = $this->getResponse();
$engine = $this->getEngine();
return new Application($cache,$response,$engine);
}
public function getResponse()
{
$encoder = $this->getResponseEncoder();
$cache = $this->getResponseCache();
return new Response($encoder,$cache);
}
// Methods for building each object
}
我不确定这是否会被归类为FactoryMethod或DI Container。他们似乎都以同样的方式解决了同样的问题 - 他们构建对象并注入依赖关系。这个容器有一些更复杂的构建方法,比如加载观察者并将它们附加到可观察对象。
工厂应该做所有的构建(加载扩展等),DI容器应该使用这些工厂注入依赖项吗?这样,子包,如Cache,Response等,每个都可以拥有自己的专用工厂。
答案 0 :(得分:3)
DI Container绝对是工厂,但它是一家通用工厂。
但是,如果您通过要求它在每次需要时为您创建依赖项而以基于拉取的方式使用它,那么您将使用Service Locator anti-pattern。那只是一个通用工厂,实际上与DI没什么关系。
真正依赖注入顾名思义,基于推送。您使用简单的模式(如构造函数注入)编写所有代码,并使用DI容器在应用程序的Composition Root中一次性解析整个依赖关系图,并将所有依赖关系注入其各自的使用者。