问题描述
我正在开发一个带有一些单例服务的库,导入库的应用程序和库中的组件都应该使用这些服务。 我做了什么:
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 库和应用程序之间共享单例服务?
解决方法
对我有用的是
- 执行
forRoot()
方法AND - 使用
providedIn: 'platform'
声明服务
在没有其他的情况下只做其中一个似乎并不适合我。
我的另一个注意事项是它可能是 app.module.ts 中模块的顺序。如果在 CoreServicesModule 之前导入 LibraryComponentModule,则还不会提供 LibraryComponentModule 所需的提供程序。