Zend Di vs ServiceManager依赖注入容器

use*_*441 13 zend-framework2 zend-servicemanager

DI我们有ServiceManager什么用途,用途是什么?

它们似乎与两者的配置文件类似zend-di,zend-servicemanager我们可以设置一些选项,如aliasesinvokables.

我试图通过这些组件更好地了解幕后发生的事情,而且文档没有给我足够的信息.

你能否告诉我有什么区别,什么时候应该用Di而不是ServiceManager

Xer*_*kus 15

当服务管理器使用用户提供的工厂时,Zend\DI依赖于魔法,如反射,来检测和注入依赖关系.这是主要的区别.

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

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

  • Xerkus,我会略微更新您未来阅读的答案.迪不是魔法和纯粹的反思.`Zend\Di`是一个强大的组件,但也非常复杂.您可以调整Di以使其与服务管理器一样快,但您需要将定义编译为看起来像服务管理器工厂的内容.Di是可插拔的,此时反射是定义的唯一"读者".计划中还有其他"读者",但由于复杂性,编写了一个服务管理器组件.这更加有利于完整的代码库切换到SM. (4认同)

aim*_*eld 6

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

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

为了解决这个问题,我编写了一个名为ZendDiCompiler的Zend Framework 2模块.它依赖于Zend\Di扫描您的代码并自动生成工厂代码来实例化您的类.您将获得两个组件中最好的组件:功能Zend\Di和性能Zend\ServiceManager.

我在ZendDiCompiler的文档中做了大量的工作,并提供了一些简单和更高级的用法示例.