Контейнеры для инъекций 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/