Контейнеры для инъекций Zend Di vs ServiceManager

Что такое DI и каков его прецедент, когда у нас есть ServiceManager?

Они кажутся похожими, поскольку в файлах конфигурации для zend-di и zend-servicemanager мы можем настроить некоторые параметры, такие как aliases и invokables.

Я пытаюсь лучше понять, что происходит за кулисами с этими компонентами, и документация не дала мне достаточной информации.

Не могли бы вы рассказать мне, в чем разница, и когда я должен использовать Di вместо ServiceManager?

Ответ 1

Zend\DI полагается на магию, как и на размышления, для обнаружения и ввода зависимостей, в то время как диспетчер сервиса использует предоставленные пользователем фабрики. Это главное отличие.

Ди вроде устарели в сообществе в пользу SM из-за сложности, отладки и проблем с производительностью. Это должно быть хорошо для RAD, но вам нужно более среднего знания, чтобы правильно использовать его.

С другой стороны, SM имеет довольно многословную и ясную проводку, вы можете открыть свой год кода и легко понять, что происходит.

Ответ 2

Zend\Di заботится о том, чтобы объединить ваши классы вместе, тогда как с Zend\ServiceManager вы должны вручную Zend\ServiceManager проводки и писать фабричное закрытие для каждого класса, который вы хотите создать.

Zend\ServiceManager намного быстрее, поскольку он не полагается на медленный API Reflection. С другой стороны, писать закрытие для больших приложений с сотнями классов становится очень утомительным. Удовлетворение ваших закрытий будет сложнее, так как ваше приложение растет.

Чтобы решить эту проблему, я написал модуль Zend Framework 2 под названием ZendDiCompiler. Он использует Zend\Di для сканирования вашего кода и автоматического создания заводского кода для создания экземпляров ваших классов. Вы получаете лучшее из обоих компонентов: мощность Zend\Di и производительность Zend\ServiceManager.

Я приложил немало работы в документацию ZendDiCompiler, а также некоторые простые и более продвинутые примеры использования.

Ответ 3

В основном разница заключается в следующем:

  • Zend\ZerviceManager= Контейнер IoC с фабричным управлением
  • Zend\Di= реализация IoC для Autowiring

Zend\Di был обновлен для версии 3. Его поведение теперь более прочное и предсказуемое, чем v2, и оно предназначено для бесшовной интеграции в zend-servicemanager для обеспечения возможностей автоматической проводки (не более странная магия). Поскольку он использует apf refusion для решения зависимостей, он медленнее, чем подход, основанный на заводе. Поэтому версия 3 поставляется с компилятором AoT для создания предварительно разрешенного инжектора, который не позволяет использовать Reflection. Дополнительное преимущество: сгенерированные фабрики также могут использоваться непосредственно с Zend\ServiceManager.

Существует руководство по использованию AoT с обоими компонентами: https://zendframework.github.io/zend-di/cookbook/aot-guide/