DI
当我们有的时候,它的用途和用例是什么ServiceManager
?
它们看起来很相似,因为在两者的配置文件中zend-di
,zend-servicemanager
我们可以设置一些选项,例如aliases
和invokables
。
我试图更好地了解这些组件在幕后发生的事情,但文档没有给我足够的信息。
你能告诉我有什么区别,什么时候应该使用Di
而不是ServiceManager
?
DI
当我们有的时候,它的用途和用例是什么ServiceManager
?
它们看起来很相似,因为在两者的配置文件中zend-di
,zend-servicemanager
我们可以设置一些选项,例如aliases
和invokables
。
我试图更好地了解这些组件在幕后发生的事情,但文档没有给我足够的信息。
你能告诉我有什么区别,什么时候应该使用Di
而不是ServiceManager
?
Zend\DI 依靠魔法(如反射)来检测和注入依赖项,而服务管理器使用用户提供的工厂。这是主要区别。
由于复杂性、调试和性能问题,Di 在社区中有点弃用,转而支持 SM。它应该对 RAD 有好处,但您需要高于平均水平的知识才能正确使用它。
另一方面,SM 有相当冗长和明确的接线,您可以在一年后打开您的代码并轻松找出发生了什么。
Zend\Di
负责将您的类连接在一起,而Zend\ServiceManager
您必须手动连接并为要实例化的每个类编写一个工厂闭包。
Zend\ServiceManager
速度要快得多,因为它不依赖于慢反射 API。另一方面,为具有数百个类的大型应用程序编写闭包变得非常乏味。随着应用程序的增长,使闭包保持最新将变得更加棘手。
为了解决这个问题,我编写了一个名为ZendDiCompiler的 Zend Framework 2 模块。它依赖于Zend\Di
扫描您的代码并自动生成工厂代码来实例化您的类。您可以充分利用这两个组件:. 的功能Zend\Di
和性能Zend\ServiceManager
。
我在ZendDiCompiler的文档中做了很多工作,并且还提供了一些简单且更高级的使用示例。
基本上区别如下:
Zend\ZerviceManager
= 工厂驱动的 IoC 容器Zend\Di
= 自动装配 IoC 实现Zend\Di
在版本 3 中进行了重构。它的行为现在比 v2 更加可靠和可预测,并且它旨在无缝集成到 zend-servicemanager 中以提供自动连接功能(不再是奇怪的魔法)。因为它使用 PHP 的反射 API 来解决依赖关系,所以它比工厂驱动的方法慢。因此版本 3 带有一个 AoT 编译器来创建一个预解析的注入器,它省略了反射的使用。另一个好处:生成的工厂也可以Zend\ServiceManager
直接使用。
有一个使用 AoT 和两个组件的指南:https ://zendframework.github.io/zend-di/cookbook/aot-guide/