何时通过依赖项注入创建服务

时间:2019-08-29 09:09:54

标签: angular angular-dependency-injection

我有一个角度服务,在其构造函数中包含一些初始化代码。该代码何时调用,即何时创建服务?

  • 已经在某个模块中提供了服务吗?
  • 还是直到第一个组件注入它?

3 个答案:

答案 0 :(得分:4)

取自official docs

  

当Angular发现某个组件依赖于服务时,它将首先检查注入程序是否具有该服务的任何现有实例。如果请求的服务实例尚不存在,则注入器使用注册的提供者创建一个实例,并将其添加到注入器中,然后再将服务返回到Angular。

     

所有请求的服务已解决并返回后,Angular   可以使用这些服务作为参数来调用组件的构造函数。

因此,似乎只有在第一次需要服务时才实例化该服务。

实际上,Angular甚至可以识别该服务是否永远不会被使用,如果不需要(从herehere获取),可以将其从构建中删除。

亲自测试

一个简单的测试来验证这是将console.log放入组件和依赖于它的服务中以查看调用顺序。

答案 1 :(得分:2)

在第一个组件注入之前,请通过链接下方的箭头进行查找。

当Angular创建组件类的新实例时,它通过查看构造函数参数类型来确定组件需要哪些服务或其他依赖项。

https://angular.io/guide/architecture-services

答案 2 :(得分:1)

如果您在模块上进行引用,则服务会在组件需要之前运行构造函数,

@NgModule({
  providers: [
  TestService],
 ...
})

如果您在组件上进行引用,则服务会为该组件创建一个新实例

@Component({
  selector:    'app-xpto',
  templateUrl: './xpto.html',
  providers:  [ TestService ]
})