将非单例服务注入到Angular中的非单例服务中
如果我想将一个非单例服务注入到Angular中的另一个非单例服务中,该怎么办 假设我有一个组件a,它使用像这样的服务a将非单例服务注入到Angular中的非单例服务中,angular,dependency-injection,Angular,Dependency Injection,如果我想将一个非单例服务注入到Angular中的另一个非单例服务中,该怎么办 假设我有一个组件a,它使用像这样的服务a @component({ selector: "componentA", providers: [ServiceA] }) export class ComponentA { constructor(private serviceA: ServiceA) {} } 现在,ServiceA也依赖于ServiceB,所以我需要注入它 @Injectable() exp
@component({
selector: "componentA",
providers: [ServiceA]
})
export class ComponentA {
constructor(private serviceA: ServiceA) {}
}
现在,ServiceA也依赖于ServiceB,所以我需要注入它
@Injectable()
export class ServiceA {
constructor(private serviceB: ServiceB) {}
}
如何/在何处申报我的服务B?在模块中?那样的话,那会是单身吗?
如果我将它添加到ComponentA中的提供者中,它可以正常工作,但是我需要在ComponentA中知道ServiceA依赖于ServiceB,这在我看来并不好
谢谢 在提供服务的范围内,服务始终是单例的,因此如果在模块中提供B,则使用该模块的每个人都将是相同的单例。我认为您需要在服务A中直接使用喷油器来按自己的方式进行
大致来说,请参见,除非您在
@Injectable()
中有中提供的选项,否则Angular不会将该服务视为单例。您可以参考文档了解其工作原理的详细信息:
您将遇到的问题是,如果您只是:
@Injectable()
export class ServiceB {
constructor() {}
}
它将在尝试将ServiceB注入ServiceA时抛出错误,因为它没有提供程序。现在,为了解决这个问题,通常需要将{providedIn:'root'}
添加到ServiceB的@Injectable()
。这将创建服务B作为应用程序范围的单例服务
当您使用@Component({providers:[]})
时,它将仅为该组件创建一个实例。但你不能为了服务而这么做
您可能会问,为什么@Injectable()
没有像@Component()
那样的提供程序
选项?Angular团队不想这样做的原因有很多,请参阅此github问题以了解更多信息
TLDR:
为了向您提供解决此问题的方法,您可以保持简单并避免使用Angular的DI。如果您想控制您使用的实例,您可以自己做:
@Injectable()
export class ServiceA {
constructor(private serviceB: ServiceB = new ServiceB()) {}
}
或
- 将Angular的DI与
@NgModule()
和/或@Component()
提供程序
阵列一起使用
@Injectable({providedIn:})
()
编辑:根据@minigeek的建议,使用中提供的您可以使用任何使每个惰性模块获得自己的服务实例。这似乎是一个非常有效的问题。。。因此,如果能知道人们为什么投票否决它,那就太好了。(我非常赞成禁止否决票!)好吧,你为什么不想一开始就有一个单身服务?@BunyaminCoskuner一个有状态的服务也许?不再是Angular 11了。providedin:每个modukeRight创建的任何实例,但仍然是每个(惰性)模块一个服务。这可能回答了这个问题,因此为什么要包含指向提供的In选项的链接。明白了!。。是的,你可以在回答中加上这个