Я большой поклонник внедрения зависимостей, но что-то меня беспокоит, и мне было интересно, может ли кто-нибудь дать мне объяснение:
Невозможно создать две службы, которые зависят друг от друга, потому что мы получим исключение «Циклическая ссылка». Я думаю, что все, кто использует symfony2, сталкивались с этой ошибкой.
Хотя я очень хорошо понимаю эту ошибку, я иногда сталкиваюсь с ней, потому что с большим количеством сервисов возникает сложность... и, возможно, также потому, что проектирование/оценка сервисов непросты.
Поэтому мне было интересно узнать об основной причине этой ошибки:
- Это для того, чтобы защитить нас от потенциальной серьезной ошибки проектирования? Если это так, не могли бы вы привести пример того, что серьезного может произойти, если две зависимые службы могут «жить вместе»?
- Это чисто техническое? т.е. потому что невозможно вызвать оба конструктора. Если это основная причина, почему бы не решить ее, заставив конструкторы служб быть пустыми и иметь метод инициализации?
I.e.:
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);
Я почти уверен, что есть что-то, чего я не понял в глубине. Так может ли кто-нибудь объяснить мне, почему нам не позволяют создавать циклические ссылки в контейнере?
Спасибо