我遇到了一些关于依赖注入的问题,希望能够澄清一下。首先要提到的是我实现的一个依赖注入容器(DIC),它能够使用ReflectionClass通过构造函数注册和解析依赖项。
$container = new DiC;
$container->register('session', 'CSession');
$container->register('response', 'CResponse');
$container->register('model', 'CSomeModel');
$container->register('view', 'CSomeView');
$container->register('controller', 'CSomeController');
一个依赖的控制器:
class CSomeController extends CController
{
public function __construct(CSomeModel $model, CSomeView $view)
{
// assign arguments here
}
}
现在控制器可以通过DIC来实例化:
$controller = $container->resolve('controller');
我喜欢这种方法,因为它是自动化和描述性的,但是CController类依赖于特定的CSomeModel、CSomeView类,这是不好的。MVC三元组应该独立实例化,例如我不能将COtherView传递给CSomeController。
我的第二个想法是注入DIC:
class CSomeController extends CController
{
public function __construct(DiC $dic)
{
// resolve dependencies through $dic
}
}
这个方法使得DiC对象成为全局变量,许多人认为这不是实施依赖注入的正确方式。是否有第三种方式能够消除两种方法的弱点呢?
DiC
类吗? - Matt Kantor