Zend Di vs ServiceManager контейнеры для внедрения зависимостей

Что такое DI и каков его случай использования, когда мы имеем ServiceManager?

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

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

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

3 ответа

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

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

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

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

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

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

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

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

  • Zend\ZerviceManager = Заводской контейнер IoC
  • Zend\Di = Автоматическая реализация IoC

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

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

Другие вопросы по тегам