Таким образом, у нас есть контейнер, поставщики услуг и, с инверсией управления, мы можем делать такие вещи, как:
public function __construct(CarServiceInterface $carService)
{
}
И все решается красиво, потому что где-то еще …
$container->bind(CarServiceInterface::class, function ()
{
return new CarService();
});
Допустим, автосервис зависит от человеческого сервиса. Затем…
$container->bind(CarServiceInterface::class, function (Container $container)
{
return new CarService($container->make(HumanServiceInterface::class);
});
Эй, это работает. Здорово.
Но вдруг людям НУЖНЫ автомобили, и человеческая служба построена так:
$container->bind(HumanServiceInterface::class, function (Container $container)
{
return new HumanService($container->make(CarServiceInterface::class);
});
Вуаля, взаимозависимость.
Как это решить?
Является ли это следствием недостатка в дизайне?
Спасибо!
Я думаю, что это будет называться «Круговые зависимости» (см. Вот подробнее об этом).
В ответе говорится, что сделать это невозможно, и что единственный способ использовать циклическую зависимость — это использовать установку с помощью сеттера вместо обычной инъекции с помощью конструктора.
Других решений пока нет …