【发布时间】:2012-01-03 10:58:20
【问题描述】:
我正在尝试找出 PHP 中依赖注入的最佳实践。
问题:我必须将子类的所有依赖项都注入到父类中吗?我在组合关系方面使用术语“父”和“子”。
我的犹豫是因为我发现自己给父类提供了各种依赖项,以便它可以将它们传递给依赖的子类。
编辑:
下面是我所说的更具体的例子。 MyClassA 不需要数据库连接对象或记录器。但是,DoSomething 确实需要这些对象。获取数据库连接和记录到DoSomething 实例的最佳方法是什么?为了单元测试,我不想使用单例对象或全局对象。此外,此示例仅用于类。如果有 3 个或 4 个,而第 3 个或第 4 个需要一些对象实例,但前 2 个或 3 个不需要,该怎么办? MyClassA 是否只是将对象传递给下一个,等等?
class MyClassA {
protected $_doSomethingObject;
public function doSomething()
{
return $this->_doSomethingObject()->doSomethingElse();
}
public function setDoSomethingObject($doSomethingObject)
{
$this->_doSomethingObject = $doSomethingObject;
}
}
class DoSomething {
protected $_logger;
protected $_db;
public function doSomethingElse()
{
$this->_logger->info('Doing Something');
$result = $this->_db->getSomeDataById();
return $results;
}
public function setLogger($logger)
{
$this->_logger = $logger;
}
public function setDBConection($db)
{
$this->_db = $db;
}
}
我在下面展示的示例是最好的方法吗?如果是这样,那么最好的方法就是向后工作......?
$logger = new Logger();
$db = new DBConnection();
$doSomething = new DoSomething();
$doSomething->setLogger($logger);
$doSomething->setDBConnection($db);
$a = new MyClassA();
$a->setDoSomething($doSomething);
【问题讨论】:
-
大多数情况下,这些子对象不是注入到父对象中了吗?如果是这样,您首先要在将这些对象注入父对象之前注入它们的依赖项。你有什么简单的具体例子吗?
-
我添加了一些伪代码来查看。感谢您的回复!
-
有得墨忒耳法则这样的东西。阅读它。