13

DI当我们有的时候,它的用途和用例是什么ServiceManager

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

我试图更好地了解这些组件在幕后发生的事情,但文档没有给我足够的信息。

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

4

3 回答 3

15

Zend\DI 依靠魔法(如反射)来检测和注入依赖项,而服务管理器使用用户提供的工厂。这是主要区别。

由于复杂性、调试和性能问题,Di 在社区中有点弃用,转而支持 SM。它应该对 RAD 有好处,但您需要高于平均水平的知识才能正确使用它。

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

于 2012-11-06T21:04:52.750 回答
6

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

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

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

我在ZendDiCompiler的文档中做了很多工作,并且还提供了一些简单且更高级的使用示例。

于 2013-03-09T20:29:12.833 回答
-1

基本上区别如下:

  • 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/

于 2018-02-26T10:55:39.497 回答