避免在Symfony2和x27中使用循环引用;什么是依赖注入?

避免在Symfony2和x27中使用循环引用;什么是依赖注入?,symfony,dependency-injection,circular-reference,Symfony,Dependency Injection,Circular Reference,我是依赖注入的忠实粉丝,但有些事情困扰着我,我想知道是否有人能给我一个解释: 不可能创建相互依赖的两个服务,因为我们将得到一个“循环引用”异常。我认为每个使用symfony2的人都遇到了这个错误 虽然我非常理解这个错误,但我有时会遇到它,因为有很多服务,会带来复杂性。。。此外,可能还因为设计/确定服务规模并不容易 因此,我想知道这个错误的根本原因: 这是为了保护我们的潜在严重设计错误?如果是这样的话,你能给我举个例子,说明如果两个相互依赖的服务可以“生活在一起”,会发生什么严重的后果吗 这纯粹是

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

不可能创建相互依赖的两个服务,因为我们将得到一个“循环引用”异常。我认为每个使用symfony2的人都遇到了这个错误

虽然我非常理解这个错误,但我有时会遇到它,因为有很多服务,会带来复杂性。。。此外,可能还因为设计/确定服务规模并不容易

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

  • 这是为了保护我们的潜在严重设计错误?如果是这样的话,你能给我举个例子,说明如果两个相互依赖的服务可以“生活在一起”,会发生什么严重的后果吗
  • 这纯粹是技术问题?也就是说,因为不可能同时调用两个构造函数。如果这是根本原因,为什么不通过强制服务构造函数为空并使用init方法来解决呢 即:

    然后实例化这两个服务:

    $service1 = new MyService1();
    $service2 = new MyService2();
    $service1->init($service2);
    $service2->init($service1);
    
    我很确定有些事情我还没有深入理解。有人能解释一下为什么我们不能在容器中创建循环引用吗


    谢谢

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

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

    见网站


    因为service1->init方法将接收未完全初始化的服务。当您尝试使用部分初始化的服务时,会发生不好的事情。很抱歉,我不相信这个论点。因为在init方法中,您将处于与构造函数中相同的状态。。。Symfony2开发人员可以创建一个抽象服务类,强制实现该方法。。。我不认为这是特别危险的。那么,如果a依赖于b,b依赖于c,c又依赖于a和b,会发生什么呢?我怀疑,在你与di多合作一点之后,你可能会改变看法。如果没有,那么提交一个补丁。Symfony集团鼓励外部帮助。我认为这在一般情况下并不难实施。但我认为还有另一个原因没有这样做。这可能是一个“最佳实践”原因,而不是技术原因。这就是为什么我在这里问。。。为了更好地理解……我想我已经理解了这一点。但我认为,即使组件A的构造函数的原型是_构造(ComponentBInterface$componentB),Symfony2服务配置也会注入componentB实现。在您的图表中没有问题,因为它很简单。让我举一个具体的例子:我有一个BasketHelper,它包含与订单相关的方法和一个CertificateHelper(它处理证书产品)。有些方法介于两者之间(即与订单和证书相关)。。。那么,我想我应该创建第三个服务,它依赖于这两个服务?
    $service1 = new MyService1();
    $service2 = new MyService2();
    $service1->init($service2);
    $service2->init($service1);