我一直在阅读依赖注入和 DI 容器。但是,我无法理解这个概念。
DI 容器如何知道“控制器”依赖于“加载器”并在“控制器”之前加载“加载器”?
我看到它的方式是它需要某种配置文件来跟踪依赖关系,如果是这样,它不是更容易编写:
// Controller
function __construct() {
$this->load = new \Framework\Core\Loader;
}
我一直在阅读依赖注入和 DI 容器。但是,我无法理解这个概念。
DI 容器如何知道“控制器”依赖于“加载器”并在“控制器”之前加载“加载器”?
我看到它的方式是它需要某种配置文件来跟踪依赖关系,如果是这样,它不是更容易编写:
// Controller
function __construct() {
$this->load = new \Framework\Core\Loader;
}
是的,DIC 需要预先配置,无论是在一些配置文件中,还是通过将工厂闭包堆叠在一起或通过注释源代码。
是的,在 ctor 中创建实例更容易,但这将消除 DI 的所有好处,因为您不再注入依赖项。
另请注意,您不需要 DIC 即可进行 DI。DI 只是通过构造函数、setter 或 using 方法在代码中注入依赖项的行为。
只是为了完成戈登所说的:
是的,DIC 需要预先配置,无论是在一些配置文件中,还是通过将工厂闭包堆叠在一起或通过注释源代码。
这里最简单/最快的方法是注释,看看这个例子:
class Loader {
//...
}
class MyController {
/**
* @Inject
* @var Loader
*/
private $loader;
public indexAction() {
// You can use $this->loader
}
}
在这个例子中,依赖(加载器)已经通过注解注入:代码清晰易读,不需要编写任何配置文件。这是 IMO 最简单的解决方案。
如果您对这种方法感兴趣,我以PHP-DI为例,这是一个使用注释的依赖注入框架(我在此工作)。