Angular中“后台服务”实例化责任方及实现方式咨询
Angular 根注入后台服务的自动实例化问题
实例化责任方
Angular的依赖注入(DI)系统采用懒实例化规则:只有当某个服务被主动注入(比如在组件、其他服务的构造函数中声明依赖,或是通过inject()函数调用)时,DI容器才会创建该服务的实例。哪怕是用@Injectable({providedIn: 'root'})注册的根级别服务,也不会被DI容器自动实例化,必须有地方引用它才行。
实现后台服务自动实例化的方式
不需要非得在引导组件中显式注入,还有几种更合适的方案:
1. 利用APP_INITIALIZER初始化令牌
通过APP_INITIALIZER可以在应用启动阶段强制触发服务实例化,示例代码如下:
import { APP_INITIALIZER, Provider } from '@angular/core'; import { SwUpdateService } from './sw-update.service'; // 初始化函数,只要注入服务就会触发其构造函数 export function initSwService(service: SwUpdateService) { return () => Promise.resolve(); } // 定义初始化提供者 export const SW_INIT_PROVIDER: Provider = { provide: APP_INITIALIZER, useFactory: initSwService, deps: [SwUpdateService], multi: true };
把这个SW_INIT_PROVIDER加到AppModule的providers数组里,应用启动时就会自动创建SwUpdateService的实例。
2. 在已被引用的服务中注入
如果你的后台服务依赖某个已经被组件或其他服务使用的服务,直接在那个服务的构造函数里注入它,就能间接触发后台服务的实例化。
3. 在main.ts中手动获取实例
在应用引导完成后,通过DI容器手动获取服务实例,触发构造函数:
import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; import { AppModule } from './app/app.module'; import { SwUpdateService } from './app/sw-update.service'; platformBrowserDynamic().bootstrapModule(AppModule) .then(moduleRef => { // 手动获取服务实例,触发构造函数逻辑 moduleRef.injector.get(SwUpdateService); }) .catch(err => console.error(err));
关于文档示例的说明
官方文档里用引导组件注入的方式,主要是为了示例简洁直观,避免引入额外的初始化逻辑,方便新手快速理解Service Worker相关服务的核心用法,并非唯一实现方式。
内容的提问来源于stack exchange,提问作者maja
相关产品推荐
相关产品推荐

