当我们有ServiceManager的时候,DI是做什么的,它的用例是什么?
它们看起来很相似,因为在zend-di和zend-servicemanager的配置文件中,我们都可以设置一些选项,比如aliases和invokables。
我试图更好地了解这些组件在幕后发生了什么,但文档没有给我足够的信息。
您能告诉我有什么区别吗?什么时候我应该用Di而不是ServiceManager
发布于 2012-11-07 05:04:53
当服务管理器使用用户提供的工厂时,Zend\DI依靠像反射这样的魔术来检测和注入依赖项。这是主要的区别。
由于复杂性、调试和性能问题,Di在社区中有点过时,取而代之的是SM。它应该对RAD有好处,但你需要高于平均水平的知识才能正确使用它。
另一方面,SM有非常冗长和明确的连接,你可以在一年后打开你的代码,很容易弄清楚发生了什么。
发布于 2013-03-10 04:29:13
Zend\Di负责将类连接在一起,而使用Zend\ServiceManager则必须手动连接,并为要实例化的每个类编写工厂闭包。
由于不依赖于速度较慢的Reflection API,Zend\ServiceManager的速度要快得多。另一方面,为包含数百个类的大型应用程序编写闭包变得非常单调乏味。随着应用程序的增长,使闭包保持最新将变得更加棘手。
为了解决这个问题,我编写了一个名为ZendDiCompiler的Zend Framework2模块。它依赖于Zend\Di来扫描您的代码,并自动生成工厂代码来实例化您的类。您可以充分利用这两个组件:Zend\Di的强大功能和Zend\ServiceManager的性能。
我在ZendDiCompiler的文档中做了相当多的工作,还提供了一些简单和更高级的用法示例。
发布于 2018-02-26 18:55:39
基本的区别是:
Zend\ZerviceManager =出厂驱动的ContainerZend\Di implementation=自动装配IoC IoC
Zend\Di在版本3中进行了重构,它的行为现在比v2更可靠、更可预测,它被设计为无缝地集成到zend-servicemanager中,以提供自动布线功能(不再有奇怪的魔力)。因为它使用PHP的反射api来解析依赖项,所以它比工厂驱动的方法要慢。因此,版本3附带了一个AoT编译器,用于创建省略反射使用的预解析注入器。另一个好处是:生成的工厂也可以直接与Zend\ServiceManager一起使用。
对于同时使用这两个组件的AoT,有一个指南:https://zendframework.github.io/zend-di/cookbook/aot-guide/
https://stackoverflow.com/questions/13257453
复制相似问题