可能重复:
依赖地狱——如何将依赖传递给深度嵌套的对象?
在围绕强依赖注入构建的系统中,我想知道如何处理这样的人为情况:
<?php
class LogWriter
{
public function write(Log $log)
{
echo $log->getMessage();
}
}
class Log
{
private $message;
public function setMessage($message)
{
$this->message = $message;
}
public function getMessage()
{
return $this->message;
}
}
class Logger
{
private $writer;
public function __construct(LogWriter $writer)
{
$this->writer = $writer;
}
public function write($message)
{
// Here is the dependency
$log = new Log();
$log->setMessage($message);
$this->writer->write($log);
}
}
Logger::write() 方法创建一个 Log 实例,并将其传递给 log writer。我的直觉告诉我这是一个糟糕的方法,从现在开始一个月后,我将追踪一个与之相关的错误,并且我可能想在测试期间将 Log 类切换为其他东西。
但是如何避免呢?唯一想到的是将 Log类型传递给 Logger 构造函数,并将我的 Logger 类更改为:
class Logger
{
private $writer;
private $log_type;
public function __construct(LogWriter $writer, $log_type)
{
$this->writer = $writer;
$this->log_type = $log_type;
}
public function write($message)
{
$log = new $this->log_type();
$log->setMessage($message);
$this->writer->write($log);
}
}
然后像这样创建一个新的 Logger 实例:
$log_writer = new LogWriter();
$logger = new Logger($log_writer, "Log");
但这感觉有点骇人听闻。那么你如何处理这样的微依赖呢?
注意:我以日志记录类为例,我并不是在寻找解决这个确切问题的方法。我可能只会使用数组而不是 Log 类。
编辑:在更复杂的情况下,我可能会将依赖注入容器传递给 Logger 类,并使用它来创建 Log 的实例,但这对于简单的 logger 类来说似乎过于复杂。