我正在创作一个棱角库.它包含一个服务,该服务运行库正常工作所需的构造函数中的初始化逻辑.我已经使用静态forRoot()
方法设置了库模块,如下所示:
@NgModule({
imports: [CommonModule],
})
export class LibModule {
static forRoot(
config?: Partial<LibConfig>,
): ModuleWithProviders<LibModule> {
return {
ngModule: LibModule,
providers: [{ provide: MY_LIB_CONFIG, useValue: config }],
};
}
// This is necessary, so the service is constructed, even if the service is never injected
constructor(private myLibService: MyLibService) {}
}
注意注入lib服务的构造函数.如果没有构造函数,服务初始化逻辑将仅在库使用者注入服务时运行,这不是我想要的.应该始终构建服务.这对我来说很好.
现在我想提供一个更加独立友好的provideMyLib()
功能.以下是我到目前为止实现的内容:
export function provideMyLib(config?: Partial<LibConfig>): EnvironmentProviders {
return makeEnvironmentProviders([
{ provide: MY_LIB_CONFIG, useValue: config },
]);
}
总的来说,它工作得很好,但这里也存在同样的问题,服务只有在使用者注入它时才会被构造.我试图解决的问题是:
- 将服务添加到提供程序数组-未构造服务
- 在
provideMyLib()
函数中使用inject()
函数->;错误:inject
必须在注入上下文中运行 - 创建自定义注入器并使用它注入服务-&>可以工作,但我的服务需要是单例的
- 未构建使用
{ provide: MyLibService, ... }
->服务变体的服务
我还研究了Angular 存储库中各种provide*
个函数的实现,没有发现任何东西.我如何实现我的提供函数?