我有一些依赖注入的问题,我想澄清一下。首先要提到的是我实现的依赖注入容器(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对象全局化,很多人认为这不是实现DI的方式。
是否有第三种方法可以消除两种方法的弱点?
答案 0 :(得分:1)
我认为这两种方法都是相关的。如果您希望在第一种方法中更灵活,可以将构造函数更改为将父类作为依赖项。然后可以注入从该父类继承的每个对象。即。
class CSomeModel extends AbstractCModel {}
class CSomeOtherModel extends AbstractCModel {}
public function __construct(AbstractCModel $model, AbstractCView $view) {}
如果您需要访问工厂,第二种方法是合适的。即如果您需要访问同一对象的多个实例。
答案 1 :(得分:1)
如果您正在寻找“自动接线”,请切换到接口并实施具体的型号/视图/等。针对该接口的类。这样你就可以用反射来配对双方。
拥有一种在容器级别显式指定依赖关系的机制也是有意义的。