Angular重构遇NG0200:ApplicationRef DI循环依赖 无显式循环的诱因是什么
Angular NG0200 非显式循环依赖触发原因
以下是静态检测无法识别、容易触发该报错的常见场景:
- 服务重复声明:从报错栈可以定位到问题触发自
config.ts第7行的Config服务工厂,如果你同时在@Injectable({providedIn: 'root'})和某模块/组件的providers数组中声明了该服务,多注入器实例初始化时如果服务依赖Router、HttpClient这类和ApplicationRef绑定的全局服务,就会触发隐性循环。 - APP_INITIALIZER初始化顺序异常:如果你用
APP_INITIALIZER提前加载Config配置,工厂函数直接注入了依赖ApplicationRef的服务,或是Config服务本身间接引用了必须等ApplicationRef初始化完成才能实例化的类(比如注入了ViewContainerRef的公共弹窗服务、路由守卫实例),就会出现初始化阶段的循环依赖,这类依赖属于运行时动态产生,不会被静态扫描到。 - 懒加载模块跨注入器引用:如果Config服务被懒加载模块注入,同时懒加载模块内的某个服务又被根模块中
ApplicationRef依赖的服务引用,跨注入器的实例解析顺序异常也会触发该报错,同样不属于显式的代码循环引用。 - 第三方库隐性依赖:如果你引入的Angular第三方库(状态管理库、全局UI配置类组件库等)内部依赖
ApplicationRef,而你的Config服务注入了该第三方服务,同时第三方服务初始化又需要读取你自定义的Config配置,会形成跨库的循环依赖。 - 自定义注入令牌配置错误:如果你在Config服务中注入了自定义令牌,而该令牌的提供者在根模块中又依赖了
ApplicationRef,也会触发该报错。
快速排查方案
你可以先把Config服务构造函数中的依赖注入改为惰性调用,比如在需要调用依赖的方法内再用inject()函数获取实例,或是用forwardRef包裹注入的服务,验证是否为初始化顺序导致的问题。
内容的提问来源于stack exchange,提问作者Daniel Kucal
相关产品推荐
相关产品推荐

