angular - Angular 6 依赖注入工厂服务不是单例的
问题描述
我有两个模块 AppModule 和lazyLoadModule。我从 Appmodule 延迟加载lazyLoadModule 的地方。我想与延迟加载的模块共享我的提供程序引用。我创建了如下 SharedProviderModule 并使用 SharedProviderModule.forRoot() 在 AppModule 中导入:
import { NgModule, APP_INITIALIZER, ModuleWithProviders } from '@angular/core';
import { CounterService } from './counter.service';
@NgModule({
})
export class SharedProviderModule {
static forRoot(): ModuleWithProviders {
return {
ngModule: SharedProviderModule ,
providers: [ CounterService
{
provide: APP_INITIALIZER,
useFactory: appConfigFactory,
deps: [CounterService],
multi: true
},
]
}
}
}
根据参考博客提供者应该有两个模块的单个实例,但现在对于延迟加载的模块,提供者的新实例正在启动。我使用 SharedProviderModule 中的工厂提供程序覆盖了一些值,这些值未反映在延迟加载的模块中。是我忘记做的事吗?
解决方案
您的延迟加载模块将自动访问在应用程序中注册的所有提供程序。当您的延迟加载模块导入一个模块时,forRoot
它实际上会再次注册这些提供程序,从而导致您的问题。
你不应该有一个包含提供者的共享模块,除非你不希望它们成为单例。如果您的AppModule
模块和延迟加载的模块都需要提供程序,则在您的模块中注册或导入它,AppModule
它将随处可用。
推荐阅读
- android - Android recyclerview 不会立即观察数据,直到我在短时间内刷新或观察使用处理程序
- amazon-ec2 - Global Accelerator+EC2 如何配置EC2进行健康检查?
- javascript - 如何在 socket.io 4.x 版中获取有关套接字的一些信息
- html - 如何使用级联下拉列表中的最后一个选择作为 src 变量
- javascript - TypeError:无法读取未定义的 React Framer Motion API 的属性“位置”
- javascript - Javascript:scrollIntoView() 与 scrollIntoViewIfNeeded()
- javascript - nivo 图表线仅出现部分
- visual-studio-code - VS Code Jupyter Notebook 看起来与发行说明不同
- java - SqlExceptionHelper:错误:语法错误(近似位置:“用户”)
- laravel - Laravel:在字符串上调用带有()的成员函数