【发布时间】:2014-07-27 09:32:13
【问题描述】:
我已经使用Dice PHP DI container 有一段时间了,就注入依赖项的简单性而言,它似乎是最好的。
class A {
public $b;
public function __construct(B $b) {
$this->b = $b;
}
}
class B {
}
$dice = new \Dice\Dice;
$a = $dice->create('A');
var_dump($a->b); //B object
但是,当你必须使用直接相互依赖的对象时,由于无限循环,最终的结果是服务器错误。
例子:
class A {
public $b;
public function __construct(B $b) {
$this->b = $b;
}
}
class B {
public $a;
public function __construct(A $a) {
$this->a = $a;
}
}
Dice 的作者说没有办法从 A 或 B 类构造对象。如:
- “A”对象需要存在“B”对象才能创建
- 但“B”对象需要“A”对象存在才能创建
作者说,此限制涉及所有 DI容器!
问题:
在不更改初始代码的情况下很好地解决这个问题的最佳解决方案是什么?谁能提供一个使用其他 DI 容器的示例,什么时候可以运行 示例代码 没有笨重解决方法?
【问题讨论】:
-
花点时间完全忘记容器。您可以自己创建这些对象中的任何一个吗?你已经创建了一个循环依赖,它不能解决它不是容器的错。
-
@Jon 这不是容器的错,是的!但是,如果我从其中一个对象中删除其中一个依赖项,那么它们就可以正常工作。我需要从 B 中使用 A 和 B 同时依赖于 A 的微不足道的使用的问题。我无法很好地解决这个问题。 (我不只是在寻找解决方案)。你真的可以在这里做什么?
-
将 A 的重要和不重要的功能分成两个独立的实体听起来像是一个计划。可能当前版本的 A 职责太多?
-
@Jon 如果我这样做,那么我的项目结构将开始失去意义。你可以看到它有什么职责的基本概念。 github.com/TomBZombie/Dice/issues/7#issue-35102964
-
我可以看到类名,但这并不能说明什么。为什么Session需要Language,Language需要Session?
标签: php dependency-injection circular-dependency di-containers