库和应用程序之间共享的 Angular 单例服务

问题描述

我正在开发一个带有一些单例服务的库,导入库的应用程序和库中的组件都应该使用这些服务。 我做了什么:

1) 使用 CoreServicesModule 方法创建一个 forRoot。在该示例中,该方法采用在其中一些服务中使用的 environment 参数。

export class CoreServicesModule {
    constructor(@Optional() @SkipSelf() parentModule?: CoreServicesModule) {
        if (parentModule) {
            throw new Error('CoreServicesModule is already loaded. Import it in the AppModule only');
        }
    }

    public static forRoot(environment: any): ModuleWithProviders<CoreServicesModule> {
        return {
            ngModule: CoreServicesModule,providers: [
                BaseSingletonService,BaseSingletonService2,{
                    provide: 'environment',useValue: environment
                }
            ]
        };
    }
}

2) 在应用程序中,我在组件的构造函数中注入了服务。我在声明此组件的CoreServicesModule中包含了LibraryComponentModule

import { BaseSingletonService } from "@myorg/library/src/library/services";
@Component({
  selector: "library-component",templateUrl: "./library-component.component.html",styleUrls: ["./library-component.component.scss"],})
export class LibraryComponent {
  constructor(private baseSingletonService: BaseSingletonService) {}
}

3) 在应用程序的 app.module.ts 中导入 CoreServicesModule

@NgModule({
    imports: [
      //...
    CoreServicesModule.forRoot(environment)
  ],providers: [],declarations: [
  ],bootstrap: [AppComponent]
})
export class AppModule {}

在应用程序内部,一切都按预期工作。但是,当我使用 library-component 时,出现 NullInjectorError: No provider for BaseSingletonService 错误。我错过了什么?您如何在 Angular 库和应用程序之间共享单例服务?

解决方法

对我有用的是

  1. 执行forRoot()方法AND
  2. 使用 providedIn: 'platform'
  3. 声明服务

在没有其他的情况下只做其中一个似乎并不适合我。

我的另一个注意事项是它可能是 app.module.ts 中模块的顺序。如果在 CoreServicesModule 之前导入 LibraryComponentModule,则还不会提供 LibraryComponentModule 所需的提供程序。