2012-11-06 9 views
13

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

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

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

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

+0

Существует хорошее обсуждение контейнеров в целом на http://www.php-fig.org/psr/psr-11/meta/ – Dennis

+0

современный совет кажется «не использовать DI или SM» самостоятельно, если они уже не являются частью вашей структуры. Zend использует Factory-based Service Manager (который по существу является ограниченным контейнером DI), где вы должны позаботиться о том, чтобы * не * вводить какой-либо контейнер в любой из ваших собственных классов, но вы можете использовать контейнер как часть настройки вашего заявление. т. е. в Zend вы можете использовать средства самой структуры для настройки того, как ваши зависимости подключены. Некоторые недавние примеры приведены здесь: https://docs.zendframework.com/tutorials/getting-started/database-and-models/ – Dennis

ответ

15

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

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

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

+1

Это хороший ответ, я помню, что с самого начала использовал DI, и я бы не стал использовать его , – DrBeza

+0

означает ли это, что я могу отказаться от использования di и sm, будет делать работу? – user1650441

+0

Точно, как указал Xerkus. Di-Stuff в значительной степени считается лишенным, DI-Containers просто слишком сложны. ServiceManager решает одну и ту же проблему ядра более удобным для пользователя способом. – Sam

6

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

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

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

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

0

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

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

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

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

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

  • Нет связанных вопросов^_^