[Прежде чем начать, позвольте мне сказать, что я в основном программист на Java - всего лишь немного знаний PHP. Но я просто стараюсь, чтобы получить наиболее важные понятия по всему без конкретики языка]
Dependency Injection основан на две части кода:.
- Строительство
- Execution
В его самая экстремальная форма, нет операторов new
, которые можно найти в разделе «Выполнение». Все они перемещаются в конструкцию. (На практике это будет уменьшено.)
Вся конструкция происходит - в части конструкции. Он создает график объектов, необходимых для выполнения снизу вверх. Итак, давайте предположим, что необходимо построить A:
- А зависит от B, и
- B зависит от C.
Затем
- С строится в первую очередь.
- Затем B сконструирован с параметром C в качестве параметра.
- Затем A строится с B как параметр.
Таким образом, C не должен передаваться как параметр конструктора A. Этот небольшой пример недостаточно иллюстрирует, насколько это уменьшает количество объектов, которые необходимо передать, до довольно небольшого номер.
Сам инжектор зависимостей не должен передаваться в часть выполнения. Это одна из основных ошибок, которые каждый (включая меня) пытается сделать, когда они впервые вступают в контакт с ДИ. Проблема в том, что это полностью размывает линии между строительством и исполнением. Другой способ сказать, что это нарушит Law of Demeter. Или в шаблоне говорят: он в конечном итоге «деградирует» шаблон «Зависимость впрыска» к шаблону «Локатор службы». Это спорный вопрос, действительно ли это деградация, но в любом случае обычно это не очень хорошая идея, чтобы злоупотреблять Dependency Injector как Service Locator.
Таким образом, всякий раз, когда вам нужно предоставить один из ваших построенных объектов возможность создавать другие объекты во время выполнения, вместо передачи инжектора зависимостей вы будете передавать только простые Провайдеры (термин, используемый каркасом Java DI Guice). Это довольно простые классы, которые могут создавать только определенный объект. Они имеют сходство с фабрикой.
Сначала попробуйте передать необходимые зависимости непосредственно к конструктору.
Итак, подведем итог:
- Строить объекты снизу вверх.
- Выполнять только несколько зависимостей, необходимых для создания объекта.
- Как только вы закончите, начните выполнение.
- Во время выполнения вы все равно можете получать вновь созданные объекты с помощью Провайдеров.
Но не принимайте это слишком далеко: Простые объекты все еще могут быть созданы без поставщика :-)
И теперь, все, что вам нужно сделать, это перевести этот материал в качестве коду. Возможно, другие могут помочь вам с несколькими примерами PHP.
Приложение: Немного больше о Поставщиков
Как уже отмечалось выше, понятие «Provider» (специализированный завод) немного специфичны для рамок Java DI Guice. Эта структура может автоматически создавать Провайдера для любого типа объекта. Однако эта концепция, как правило, полезна для DI. Единственное различие заключается в том, что без помощи Guice или аналогичной структуры вам придется сами писать Провайдеры, но это довольно просто:
Предположим, что B зависит от C.
- Если B просто необходим один фиксированный экземпляр C, то вам не нужен провайдер - вы можете просто построить B с аргументом конструктора С.
- Если B необходимо создать несколько экземпляров C во время выполнения , тогда просто напишите класс под названием
CProvider
с помощью метода get()
, который может создать новый экземпляр C. Затем передать экземпляр CProvider
в конструктор B и сохранить Поставщик в поле экземпляра B. Теперь B может вызвать cProvider.get()
когда ему нужен новый экземпляр C.
Провайдеры часть Строительного кода, поэтому вам разрешено использовать new C(...)
! С другой стороны, они не являются частью кода исполнения, поэтому у вас не должно быть никакой логики выполнения.
CProvider
может быть передан, конечно, в несколько конструкторов. Вы также можете написать несколько версий CProvider1
, CProvider2
, ... - где каждый может создавать разные версии объектов C с различными свойствами. Или вы просто создаете экземпляр CProvider
несколько раз с разными аргументами.
Проницательный, спасибо за объяснение. Я знаю о шаблоне Locator Service, и это не то, что я пытаюсь выполнить. Не могли бы вы немного рассказать об использовании провайдеров? – Andre
Добавлено добавление. Дайте мне знать, если вам нужна дополнительная информация. –
Большое спасибо за помощь. В основном мне нужно пройти по требуемым провайдерам для каждой многопоточной зависимости. Это в основном шаблоны Factory, но специфические для создания объектов для целей (могут быть различные классы, примером могут быть выходные драйверы) и вернуть их в зависимый класс. Похоже на увеличение сложности: D – Andre