好的,我读了一些有关DI的文章和帖子,现在尝试在我正在研究的旧项目中申请我编写的新代码。
假设我已经有“用户”和“帖子”,现在我想添加“注释”,它对每个帖子的每个用户都是唯一的。
我可以轻松地将DI知识应用于基本的Note
类:
class Note{
private $db;
private $_id = null;
private $_userId = null;
private $_postId = null;
private $_text = null;
public function __construct($db){
$this->db = $db;
}
// Bunch of setUserId\GetUserId etc. methods
public function save(){
// Do some db queries to save\update\create DB row
}
}
但是我不仅要创建新的笔记,还想批量查询现有笔记(即“当前用户的所有笔记”)。
在没有DI的情况下,我该如何做-在Note
类中创建静态方法:
/**
* @return array|Note
*/
static public function getUserNotes($userId)
{
// Do db query, fetch notes row,
// create Note objects from them and return an array of Note objects
}
用法非常简单:$userNotes = Note::getUserNotes(123);
但是我应该如何用DI呢?从语义上讲,我不能再将此方法放入Note
类中。我可能会想到的唯一一件事-创建额外的类
class NotesFetcher{
private $db;
public function __construct($db){
$this->db = $db;
}
public function getUserNotes($userId){
// Do some db queries to query DB and create array
}
}
然后它的用法是:
$db = new Db(...);
$notesFetcher = new NotesFetcher($db);
$userNotes = $notesFetcher->getUserNotes(123);
这是我应该遵循的正确方法吗?我感觉很多代码和额外的类,而不是一行。我可以肯定地看到了测试的好处,但是当您意识到需要2个额外的类(在某些时候还包括Dependency Container)和3个额外的代码行(而不是超级简单的调用$userNotes = Note::getUserNotes(123);
)时,它仍然在某种程度上使人沮丧。