我有一些类,例如那些概述数据库表结构的类或那些概述应用程序配置的类,它们在整个程序的执行过程中根本不会改变状态。我目前将这些类作为单例,希望检索信息的类请求类实例(例如,来自公共getInstance()方法),然后继续检索他们想要的信息。虽然这有效,但我希望在配置方面允许更多的模块化,这就是我被卡住的地方。
我的主要目标是允许使用模块化配置进行更轻松的调试,同时仍然保持代码可读性。我不确定如何在不包含Yet Another Singleton(tm)的情况下允许交换配置以进行调试,使用配置设置的类可以从中检索正确的配置实例。
这适用于PHP Web应用程序,但没有标记为因为我猜测解决方案很可能与语言无关。
编辑:为了澄清我的问题,即使依赖注入对我的问题的回答感到痒痒,让我提供一个(可能是过于简化的)示例。
假设我有一个PHP的Mysqli类的包装器,它将简单地使用在Config单例中识别的任何连接信息......
class Mysql {
// ...
private $mysqli;
public function __construct() {
$conf = Config::getInstance(); // Get the configuration
$this->mysqli = new Mysqli(
$conf->getHost(),
$conf->getUsername(),
$conf->getPassword()
);
// ...
}
// ...
}
在此示例中,Mysql类仅接受Config中包含的设置,并且除了Config中包含的配置外,不能使用任何配置。在这个例子中,简单地通过主机/用户名/密码/其他任何构造函数可能更有意义,但是然后它使用Mysql类从Config单例中检索它,并且问题在许多中再次出现更多课程。因为它最终总是从Config中检索依赖项,所以不可能通过此设置轻松尝试不同的设置。
从我在一些地方阅读的内容,包括这里的精彩评论,似乎依赖注入是我最好的选择。对于未来的潜在读者,关于PHP的依赖注入的一篇很好的文章我发现here,以及对概念的简要介绍(用Java)here。
答案 0 :(得分:1)
这是依赖注入的一个主要方法。想法是在运行时注入一个类的实例。在测试期间,您将注入具有相同接口的其他内容。它可以是虚拟类,模拟对象,也可以是具有预期状态的测试创建的常规实例。