强制Angular 2子模块中的服务实例化(AngularJS运行块的替代方案)

Force service instantiation in Angular 2 sub-module (an alternative to AngularJS run block)

本文关键字:运行 AngularJS 方案 实例化 Angular 模块 服务 强制      更新时间:2023-09-26

我在子模块中有一个服务,它封装了一些第三方模块,实例化并初始化其服务,为在应用程序中使用做准备。

@Injectable()
class SubmoduleInitializerService {
    constructor (thirdPartyService: ThirdPartyService) {
      thirdPartyService.initialize(...);
      ...
    }
}
@NgModule({
    imports: [ThirdPartyModule],
    exports: [ThirdPartyModule],
    providers: [
        ThirdPartyService,
        SubmoduleInitializerService
    ]
})
class AppSubmodule {}

ThirdPartyService不是直接注入到应用程序中,而是被其他ThirdPartyModule单元使用,所以只要SubmoduleInitializerServiceThirdPartyService或父注射器在同一个注射器中注入,一切都很好:

export class AppComponent {
    constructor(
      /* DO NOT REMOVE! BAD THINGS HAPPEN! */
      submoduleInitializerService: SubmoduleInitializerService
    ) {}
    ...
}

它被证明是一个糟糕的模式,因为如果SubmoduleInitializerService既没有在类中也没有在模板中使用(已经意外删除过一次(,那么它为什么应该保留在AppComponent中注入还不清楚。

基本上AppSubmodule模块需要Angular 1.x angular.module(...).run(...)块的替代方案。

这里有什么选择?

APP_INITIALIZER(未记录(服务在Angular 2中相当好地扮演了AngularJS配置/运行块的角色(不包括异步初始化的特性(。

对于只是急切地实例化SubmoduleInitializerService的noop初始化块,它是:

@NgModule({
    imports: [ThirdPartyModule],
    exports: [ThirdPartyModule],
    providers: [
        ThirdPartyService,
        SubmoduleInitializerService,
        {
            provide: APP_INITIALIZER,
            useFactory: () => () => {},
            deps: [SubmoduleInitializerService],
            multi: true
        }
    ]
})
class AppSubmodule {}

由于APP_INITIALIZER是多提供程序,它允许每个应用程序具有多个初始化函数,这些函数遵循加载模块的顺序。

对于同步初始化,较短(可能更合适(的替代方案是将服务注入模块的构造函数:

@NgModule({
    imports: [ThirdPartyModule],
    exports: [ThirdPartyModule],
    providers: [
        ThirdPartyService,
        SubmoduleInitializerService
    ]
})
class AppSubmodule {
    constructor(sis: SubmoduleInitializerService) {}
}

正如这个答案中所解释的,APP_INITIALIZER也与config块共享一些特性,因为它用于在组件初始化之前配置服务,并且容易受到竞争条件的影响(例如,由于APP_INITIALIZER用于配置Router,将其注入另一个APP_INITIALIZER将导致循环依赖(。