Angular外部模块服务实例未自动创建相关问题咨询
核心结论
你理解得完全正确:仅在模块的providers数组中注册服务,Angular不会自动创建它的实例。服务的单例实例只会在**首次被某个组件/服务请求(注入)**时才会被创建。
为什么你的NewService构造函数没执行?
你的NewService虽然在ExternalModule的providers里注册了,但整个应用中没有任何组件或服务在构造函数中声明依赖它——Angular没有收到“需要这个服务”的信号,所以不会主动去实例化它,构造函数里的console.log自然不会输出。
结合Angular文档的解释
你引用的Angular v5文档内容:
The providers array tells Angular to create a single, shared instance of
HeroServiceand inject into any class that asks for it.
这段话的重点是后半句:inject into any class that asks for it(注入到任何请求它的类中)。也就是说,Angular只会在有类明确请求这个服务时,才会创建并注入这个单例实例——没有请求,就不会实例化。
如何让NewService在应用加载时就执行构造函数?
有两种常用方法可以实现:
方法1:在启动组件中注入服务
直接在AppComponent的构造函数中注入NewService,应用启动时AppComponent会被初始化,触发服务实例化:
import { Component } from '@angular/core'; import { NewService } from './external/new.service'; @Component({ selector: 'app-root', templateUrl: './app.component.html', styleUrls: ['./app.component.css'] }) export class AppComponent { constructor(private newService: NewService) {} // 注入服务,触发实例化 }
方法2:使用APP_INITIALIZER强制初始化
如果需要在应用启动阶段就执行服务的初始化逻辑(不仅仅是构造函数),可以使用Angular的APP_INITIALIZER令牌,让Angular在启动时就实例化服务:
修改ExternalModule的代码:
import { NgModule, APP_INITIALIZER } from '@angular/core'; import { CommonModule } from '@angular/common'; import { NewService } from './new.service'; // 定义初始化函数,依赖NewService function initializeNewService(newService: NewService) { return () => { // 这里可以添加服务的初始化逻辑,比如调用服务的方法 return Promise.resolve(); }; } @NgModule({ imports: [CommonModule], providers: [ NewService, { provide: APP_INITIALIZER, useFactory: initializeNewService, deps: [NewService], // 声明依赖NewService,Angular会先实例化它 multi: true // 允许多个初始化器 } ], declarations: [] }) export class ExternalModule { }
这样Angular在启动过程中会调用这个初始化函数,而函数依赖NewService,所以会自动实例化服务,构造函数就会执行。
内容的提问来源于stack exchange,提问作者Senal

