2

Я создаю многоразовую библиотеку в PHP, которая будет использоваться несколькими внутренними приложениями (некоторые некоторые из них не являются). Я использую инъекции зависимостей конструктора в основном для моих классов, например, инъекционной мои Repository классов в бизнес-логике классов:Как использовать контейнер DI в библиотеке многократного использования?

namespace \Company\Project\BusinessLogic; 

class MyComplexBusinessWorkflow 
{ 
    private $_repository; 

    public function __construct(IMyEntityRepository $repository) 
    { 
     $this->_repository = $repository 
    } 

    ... 
} 

Так с Dice я хотел бы иметь что-то вроде этого, которое впрыснуть по умолчанию для реализации библиотеки IMyEntityRepository:

$my_complex_workflow_instance = $dice->create('MyComplexBusinessWorkflow'); 

вместо:

$my_complex_workflow_instance = new MyComplexBusinessWorkflow(new MyEntityMySQLRepository(new MysqlConnectionWrapper())); 

Я нормально с вложением частности DI контейнера Весов ry в мой библиотечный код, но не уверен, как управлять экземпляром контейнера ($dice в коде выше).

+1

Не совсем ответ, но немного родственный: есть [контейнер-Interop] (https://github.com/container -interop/container-interop), который обеспечивает стандарт, который реализуют некоторые контейнеры. Это позволяет использовать контейнер, не привязывая себя к конкретной реализации. Может быть, это даст вам некоторые идеи. –

+0

Выглядит очень интересно, может быть, вы знаете об аналогичной инициативе на других языках? – artvolk

+0

Да, есть пара JSR, которые охватывают инъекцию зависимостей (так Java здесь). Кроме того, что я не знаю. Мы нажимаем контейнер-interop на PHP-FIG, чтобы он стал PSR, все еще работающий. –

ответ

1

Не получил ответа, поэтому предоставьте мое «решение». Я применил отдельный класс Builder для создания экземпляра контейнера DI.

Код, который будет использовать библиотеку, будет зависеть от конкретного контейнера, это может быть отстранено интерфейсом. К сожалению, разные контейнеры DI работают по-разному, так что это не полная абстракция.

В комментариях я указал на эту интересную инициативу по объединению контейнеров DI в PHP: https://github.com/container-interop/container-interop

Смежные вопросы