我目前正在研究一个依赖注入容器,我遇到了很多不同类型的容器(Pimple,Orno / di,Laravel的......),我打算做一些接近Pimple的事情。但我还有一个问题,如果我使用setter和getter进行DI,那么在依赖类的构造函数中注入“default dependencies”是否正确?让我举个例子:
所以这是我的例子:
<?php
class Dependency
{
public function print($str)
{
echo $str;
}
}
class Dependent
{
private $_dependency;
public function __construct()
{
$this->_dependency = new Dependency;
}
public function setDependency(Dependency $dep)
{
$this->_dependency = $dep;
return $this;
}
public function depPrint($str)
{
$this->_dependency->print($str);
return $this;
}
}
这样,用户代码可以在不知道其依赖性的情况下直接使用该类:
$instance = new Dependent;
$instance->depPrint('Hello world');
或者如果用户代码需要该类使用另一个依赖项,它可以这样做:
$instance = new Dependent;
$instance->setDependency(new Dependency)
->depPrint('Hello world');
我觉得它很方便,因为在测试中你可以用mock类替换依赖项,并且用户代码不必知道有关类依赖项的任何信息。我发现最大的缺点是它仍然会创建与默认依赖项的耦合,但是这可以通过检查类是否存在而轻松修复,如果它不存在,则默认情况下不要注入任何内容。那么,这个系统是否有任何缺点,我应该使用它还是应该使用其他东西?
提前谢谢。
答案 0 :(得分:0)
你可以把这两件事结合起来:
public function __construct($dep = null)
{
if (is_null($dep)) {
$this->_dependency = new Dependency;
} else {
$this->_dependency = $dep;
}
}