请考虑以下代码:
class CategoryController
{
private $model;
public function __construct()
{
$this->model = new CategoryModel();
}
}
您将看到Controller依赖于模型。我听说这样做是不可取的,应该注入模型。
我质疑为什么。在我的情况下,我专门针对CategoryModel
构建了CategoryController
,并且我没有在课堂上看到这样的问题。我的意思是,无论如何,我无法注入那些不兼容的SomeOtherModel
......或者我可以吗?
使用依赖注入代替将其注入Controller似乎浪费代码。
因此,有没有理由在这里使用DI?
答案 0 :(得分:1)
实际上在那个例子中,最大的问题是什么呢?!没有任何方法只是一个对象持有者没有任何方法得到它!?
是的,我知道,这仅仅是一个例子,但问题就是这个问题,在那个例子中你不需要DI,实际上你根本不需要这个课程!
@Mark Baker说,如果没有DI / IoC,你就不能轻易测试,因为它已经被严格扫描了。如果你花一些时间来阅读有关测试的内容,对于这种情况也需要Mockery
使用依赖注入代替将其注入Controller似乎浪费代码。
如果您没有为您做过DI的事情,那么很容易让对象从构造函数传递或制作默认对象,在您的示例中将是: 使用CategoryModelInterface;
class CategoryController
{
private $model;
public function __construct(CategoryModelInterface $categoty = null)
{
$this->model = $category
? $category
: new CategoryModel();
}
}
通过这种方式,您不会浪费太多时间,而且如果/可能/您可能会进行一些测试,或者将模型完全更改为另一个,那么实际上可以做到这一点。
答案 1 :(得分:0)
我认为你不需要DI。但是Mark Baker's comment关于测试是有效的。但是你可以通过对模型使用getter方法来解决这个问题。然后可以在测试中模拟该方法:
class CategoryController
{
private $model;
public function __construct()
{
...
}
public function getModel() {
if(!$this->model) {
$this->model = new CategoryModel();
}
return $this->model;
}
}