Angular 2:如何在应用程序中强制一个可注射对象成为单体

Angular 2:如何在应用程序中强制一个可注射对象成为单体,angular,service,singleton,injectable,Angular,Service,Singleton,Injectable,我的应用程序中有一个@Injectable服务,它作为提供者添加到AppModule中。我想确保我的开发团队中没有人将其注入到任何其他模块中。一个实例就足够了,它有一些复杂的逻辑,我不想运行两次。有什么想法吗 我知道DI在angular 2中是如何工作的,所以像“确保它仅作为应用程序模块中的提供者添加”这样的回答不会有帮助( 请注意,如果服务提供给AppModule以外的任何其他应用程序,我希望它在生成或运行时产生某种错误。Angular为每个提供程序维护一个实例 确保只提供一次服务,DI将确保

我的应用程序中有一个
@Injectable
服务,它作为提供者添加到
AppModule
中。我想确保我的开发团队中没有人将其注入到任何其他模块中。一个实例就足够了,它有一些复杂的逻辑,我不想运行两次。有什么想法吗

我知道DI在angular 2中是如何工作的,所以像“确保它仅作为应用程序模块中的提供者添加”这样的回答不会有帮助(


请注意,如果服务提供给AppModule以外的任何其他应用程序,我希望它在生成或运行时产生某种错误。

Angular为每个提供程序维护一个实例

确保只提供一次服务,DI将确保应用程序中只有一个实例

如果您在组件({…,providers:[…]})上提供服务,那么实例的数量将与组件实例的数量相同

如果您仅在
AppModule
providers
或导入到
AppModule
的模块的
providers
中提供服务,则整个应用程序将只有一个实例:

@NgModule({
提供者:[……],
进口:[……]
})
导出类AppModule{}
一个陷阱是延迟加载的模块。如果模块是延迟加载的,那么提供的提供程序将导致创建另一个实例,因为延迟加载的模块有自己的DI根范围。 对于延迟加载的模块,实现
forRoot()
,并在
forRoot()
中添加应为应用程序范围单例的提供程序,但不在
提供程序中,并将其导入
AppModule

@NgModule({
提供者:[……],
导入:[LazyLoadedModuleWithSingltonProvider.forRoot()]
})
导出类AppModule{}
更新

为了防止实例化一个服务的多个实例,您可以使用类似

@Injectable()
导出类MyService{
私有静态instanceCounter=0;
私有instanceNumber=instanceCounter++;
构造函数(){
如果(this.instanceNumber>0){
抛出“MyService必须保持为单例,但创建了多个实例”;
}
}
}
另一种方法是将单例服务移动到
CoreModule
,并防止将此模块导入
AppModule

只有根AppModule应该导入CoreModule。如果延迟加载的模块导入它,则会发生错误


我在问题中提到,这并不能回答问题。如果我的团队中的一个开发人员将此服务作为提供者添加到任何其他模块中,将有多个服务实例。我想强制它在构建时或至少在运行时产生错误。你是对的。我在回答时不知怎的忘记了这一点:-/.I upd这是我的答案,Angular没有提供任何信息。