gpt4 book ai didi

php - 依赖注入(inject)混淆

转载 作者:搜寻专家 更新时间:2023-10-31 20:44:58 25 4
gpt4 key购买 nike

我一直在阅读有关依赖注入(inject)的内容,但我发现的示例对我来说只是糟糕的代码,所以我的主要问题是我认为这是糟糕的代码是正确的,还是我误解了它的目的,我的示例是否更好?

class Photo {
protected $db;
public function __construct()
{
$this->db = DB::getInstance();
}
}

所以这是糟糕的代码,依赖注入(inject)的建议是:

class Container {
protected $db;
public static newPhoto()
{
$photo = new Photo;
$photo->setDB(static::$db);
$photo->setConfig();
$photo->setResponse();
return $photo;
}
}
$photo = Container::newPhoto();

但如果我错了,请纠正我,我们刚刚构建了一个类,它的唯一职责是构建另一个类,这似乎毫无意义,而且我们正在使用静态方法,这显然是一个非常糟糕的主意。

我确实看到了一个好处,但令我惊讶的是,它没有被提及,那就是我们现在可以使用 setter 独立测试 Photo 类,而在第一个示例中我们不能。

这样的事情对我来说更有意义:

class Photo {
protected $db;
protected $config;
protected $response;
public function __construct($dbConn=null,$config='123',$response=true)
{
if(is_null($dbConn))
$this->db = DB::getInstance();
else
$this->db = $dbConn;
...etc
}
}
$photo = new Photo($dbConn);

该类自行构建,不需要实际调用静态方法,如果使用值,则可以使用虚拟数据测试该类,否则它会退回到默认值(这似乎是 Container 的唯一要点)类),并且与 Container 相比,依赖关系仍然有些明显。

最佳答案

依赖注入(inject)模式的目标是解耦一起工作的对象的构建方式。在您的示例中,知道如何构造数据库实例不是 Photo 类的关注点,而只是使用数据库实例来实现其目标。

您已经注意到的明显优势是在测试中,如果您只想测试照片功能,您可以轻松地通过模拟数据库实例。但是您也可以考虑连接池,例如,容器有一个数据库实例池,并将其中一个实例传递给您的 Photo 对象以完成其工作。当照片生命周期结束时,数据库实例将返回到池中并在其他地方使用。

可以使用带有参数、 setter 、注释(至少在 Java 中)甚至 XML 配置文件的构造函数来实现此模式。在注释或 XML 配置文件的情况下,容器将解析该信息,创建所需的适当对象并将它们注入(inject)客户端类。

您在 C1 和 C2 处描述的是一个工厂类,它公开用于获取 Photo 实例的静态方法。这是在 Java 的许多地方使用的非常常见的模式。

关于php - 依赖注入(inject)混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14407378/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com