Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将非单例服务注入到Angular中的非单例服务中_Angular_Dependency Injection - Fatal编程技术网

将非单例服务注入到Angular中的非单例服务中

将非单例服务注入到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

如果我想将一个非单例服务注入到Angular中的另一个非单例服务中,该怎么办

假设我有一个组件a,它使用像这样的服务a

@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选项的链接。明白了!。。是的,你可以在回答中加上这个