惰性模块是否创建根注入器的子注入器

Does lazy module create child injector of a root injector

假设我有以下延迟加载的 LazyModule 和在其中声明的 LazyComponent

@NgModule({
    declarations: [LazyComponent],
    providers: [LazyModuleService],
})
export class LazyModule { ...


@Component({
    selector: 'my-lazy',
    providers: [LazyComponentService]
})
export class LazyComponent { ...

我的理解是加载 LazyModule 时 angular 将从 rootInjector 为该模块创建一个子注入器,如下所示:

var lazyModuleInjector = rootInjector.resolveAndCreateChild([LazyModuleService]);

然后像这样为 LazyComponent 创建子注入器:

var lazyModuleInjector = lazyModuleInjector.resolveAndCreateChild([LazyComponentService]);

所以最终注入器树是这样的:

是否正确?

是的,这是正确的。这不是故意的,而是因为注入器在创建后是只读的。 因为懒加载的模块是后加载的,所以它的提供者不能添加到应用程序根提供者中,因为这个已经被密封了。 这就是为什么他们为延迟加载模块引入了一个新的根作用域。

如果你想要延迟加载模块提供的提供者的全局提供者(单例),在延迟加载模块中实现 forRoot() 并在那里提供全局提供者,然后只将提供者导入应用程序根范围imports: [LazyModule.forRoot()].