Zend Di vs ServiceManager依赖注入容器

时间:2012-11-06 18:52:57

标签: zend-framework2 zend-servicemanager

当我们DI时,ServiceManager是什么以及它的用例是什么?

它们似乎相似,因为在zend-dizend-servicemanager的配置文件中,我们可以设置一些选项,例如aliasesinvokables

我正在尝试更好地了解这些组件背后发生的事情,而且文档没有给我足够的信息。

您能告诉我有什么不同之处,以及何时应该使用Di代替ServiceManager

3 个答案:

答案 0 :(得分:15)

Zend \ DI依赖于魔法,就像反射一样,在服务管理器使用用户提供的工厂时检测和注入依赖关系。这是主要区别。

由于复杂性,调试和性能问题,社区不赞成使用SM。 它应该对RAD有好处,但你需要高于平均水平的知识才能正确使用它。

另一方面,SM有相当冗长和明确的布线,您可以在一年后打开代码并轻松弄清楚发生了什么。

答案 1 :(得分:6)

Zend\Di负责将类连接在一起,而使用Zend\ServiceManager时,您必须手动连接并为要实例化的每个类编写工厂闭包。

Zend\ServiceManager速度要快得多,因为它不依赖慢Reflection API。另一方面,为具有数百个类的大型应用程序编写闭包变得非常繁琐。随着应用程序的增长,保持关闭是最新的将变得更加棘手。

为了解决这个问题,我编写了一个名为ZendDiCompiler的Zend Framework 2模块。它依赖于Zend\Di来扫描您的代码并自动生成工厂代码来实例化您的类。您可以充分利用这两个组件:Zend\Di的强大功能和Zend\ServiceManager的效果。

我在ZendDiCompiler的文档中付出了相当多的工作,并且还提供了一些简单且更高级的用法示例。

答案 2 :(得分:0)

基本上差异如下:

  • Zend\ZerviceManager =工厂驱动的IoC容器
  • Zend\Di =自动连接IoC实施

Zend\Di已针对第3版进行了重构。它的行为现在比v2更加可靠和可预测,并且它旨在无缝集成到zend-servicemanager中以提供自动布线功能(不再有奇怪的魔力)。由于它使用PHP的反射api来解决依赖关系,因此它比工厂驱动的方法慢。因此,版本3附带一个AoT编译器来创建一个预先解析的Injector,它省略了Reflection的使用。另一个好处:生成的工厂也可以直接与Zend\ServiceManager一起使用。

有两个组件使用AoT的指南:https://zendframework.github.io/zend-di/cookbook/aot-guide/