Я создаю многоразовую библиотеку в PHP, которая будет использоваться несколькими внутренними приложениями (некоторые веб-нет, некоторые). Я использую инжекцию зависимости конструктора в основном для своих классов, например, для внедрения классов Repository в классы бизнес-логики:
namespace \Company\Project\BusinessLogic;
class MyComplexBusinessWorkflow
{
private $_repository;
public function __construct(IMyEntityRepository $repository)
{
$this->_repository = $repository
}
...
}
Так с Игральная кость Я хотел бы иметь что-то вроде этого, который вводит по умолчанию для библиотеки IMyEntityRepository
реализация:
$my_complex_workflow_instance = $dice->create('MyComplexBusinessWorkflow');
вместо:
$my_complex_workflow_instance = new MyComplexBusinessWorkflow(new MyEntityMySQLRepository(new MysqlConnectionWrapper()));
Я в порядке встраивания конкретной библиотеки контейнеров DI в код библиотеки, но не знаю, как управлять экземпляром контейнера ($dice
в коде выше) сам.
Не получил ответ, поэтому предоставьте мое «решение». Я реализовал отдельный класс Builder для создания экземпляра DI-контейнера.
Код, который будет использовать библиотеку, будет зависеть от конкретного контейнера, это может быть устранено интерфейсом. К сожалению, разные DI-контейнеры работают по-разному, так что это не полная абстракция.
В комментариях я указывал на эту интересную инициативу по объединению DI-контейнеров в PHP: https://github.com/container-interop/container-interop
Других решений пока нет …