避免在Symfony2的依赖注入中使用循环引用?

时间:2015-12-14 11:01:12

标签: symfony dependency-injection circular-reference

我是依赖注入的忠实粉丝,但有些事困扰我,我想知道是否有人可以给我一个解释:

不可能创建两个相互依赖的服务,因为我们将获得一个"循环参考"例外。我想每个使用symfony2的人都遇到了这个错误。

虽然我非常理解这个错误,但我有时会遇到它,因为有很多服务,复杂性......而且,也许是因为设计/调整服务并不容易。

因此,我想知道这个错误的根本原因:

  1. 这是为了保护我们潜在的严重设计错误?如果是这种情况,你能不能给我一个例子,说明如果两个相关的服务能够和他们一起生活会发生什么严重的事情"?
  2. 这纯粹是技术性的?即因为无法调用两个构造函数。如果这是根本原因,为什么不通过强制服务构造函数为空并具有init方法来解决它?
  3. 即:

    class MyService1{
    
       private $service2;
    
       public function __construct(){ //empty constructor
          ...
       }
    
       protected function init(MyService2 $service2, ...){
          $this->service2 = $service2;
       }
    
    }
    
    class MyService2{
    
       private $service1;
    
       public function __construct(){ //empty constructor
          ...
       }
    
       protected function init(MyService1 $service1, ...){
          $this->service1 = $service1;
       }
    
    }
    

    然后实例化两个服务:

    $service1 = new MyService1();
    $service2 = new MyService2();
    $service1->init($service2);
    $service2->init($service1);
    

    我非常确定有些东西我没有深入理解。那么有人可以解释为什么我们被阻止在容器中创建循环引用吗?

    谢谢

1 个答案:

答案 0 :(得分:3)

理想情况下,您的服务将遵循依赖性倒置原则。

也就是说,高级组件将依赖于低级组件,而不是相反的方式。此外,为了获得更高的内聚力,这种依赖性将通过抽象或接口来实现。

请参阅this question from the Programmers SE网站。

enter image description here