angular - Angular 依赖注入查找和模块注入器层次结构
问题描述
据我了解,每个 Angular 模块都有自己的注入器。
但是,在编译期间,所有模块都合并为一个。
关于导入模块的最大困惑是开发人员认为他们建立了层次结构。假设导入其他模块的模块成为其导入的父模块可能是合理的。然而,事实并非如此。所有模块在编译阶段合并。因此,导入的模块和导入的模块之间没有层次关系。
因此,如果模块之间没有任何层次关系,则不清楚来自所有合并模块的注入器如何形成模块注入器层次结构?- 如果在一个根模块中声明所有服务也是一样的 - 在这种情况下,层次关系是什么?
更新 1: 来自 Daniel Perales 提供的链接如下:
Angular 确实将所有模块服务提供者合并到一个 AppModule 工厂中,该工厂“返回包含所有合并提供者的模块定义”。
因此,看起来模块注入器层次结构中的顶级元素是 AppModule 工厂,以下元素是延迟加载模块的注入器定义。
有什么想法吗?
解决方案
Angular DI 是一个非常复杂的主题,它的完成方式已经随着版本的变化而演变。在现代 Angular 中,使用“在根目录中提供”的语法来提供服务以允许摇树并避免陷阱是一个安全的选择,并且只有在某些特定情况下,才能在模块或组件的提供者数组中手动执行。
这里有两篇关于这个主题的好文章:
https://indepth.dev/what-you-always-wanted-to-know-about-angular-dependency-injection-tree
推荐阅读
- python - 如何插入到html表的特定列
- javascript - 一次将单个对象导出到 JSON 文件中的对象数组
- c++ - C26451 算术溢出访问 CStringArray 中的项目
- c# - 是否有必要仅在定义指向它的指针的同一行中使用`stackalloc`?
- mono - 单声道结果中的 Web 服务调用“System.Net.WebException:请求超时”和“System.ObjectDisposedException:无法访问已处置的对象”
- kubernetes - 在 helm 中的 yaml 字符串序列中转义空格字符
- php - SOAP 请求与 SOAPClient 一起工作,但在 PHP 中不工作
- c# - WPF AvalonDock LayoutChanged 和 LayoutChanging MVVM
- mysql - 这些空格之间有什么区别?
- ios - 使用 SwiftUI 使列表滚动到底部