如何全局注册自定义注入提供者以解决Angular模块循环依赖问题?
Angular大应用懒加载模块的依赖注入令牌配置问题
基础背景
我们可以使用Angular的@Injectable装饰器,让服务在整个应用中支持依赖注入——此时服务类本身会被用作注入令牌,注入该服务的代码必须知晓这个类。
我们也可以基于任意注入令牌定义注入提供者,但这类提供者只能传递给新创建的嵌套注入器。
问题场景与当前进展
我负责的大型Angular应用包含约250个业务领域模块,均为按需懒加载;团队有150名开发者,分多个小组各负责若干模块,每个模块的服务必须保留在对应模块内(否则模块拆分就失去意义,最终会形成臃肿的共享模块)。
大量模块需要注入其他模块的服务,这导致了TypeScript层面的循环引用:
我已通过提取服务接口的方式解决循环引用:将每个服务的接口放到先于业务模块编译的共享接口模块中,结构如下(实际注入的是基于接口类型的注入令牌):
但现在卡在了最后一步:该在何处以及如何为这些令牌定义静态提供者?
- 位置困惑:是不是要把所有提供者都合并到UI根节点组件的
providers数组中,尽量靠近根注入器? - 实现难点:共享模块无法访问业务模块的服务类,不能在共享模块中定义提供者;而业务模块是懒加载的,我无法确定它们的加载时机,也没法在业务模块内配置这些提供者。
目前我能想到的唯一方案是:独立搭建一套支持懒加载的自定义依赖注入系统,然后在一个最后编译但最先加载的顶层模块中,注册所有令牌与对应懒加载服务类的映射关系。
内容的提问来源于stack exchange,提问作者F-H
相关产品推荐
相关产品推荐

