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

When does a service get created by dependency injection

我有一个 angular 服务,其构造函数中包含一些初始化代码。这段代码是什么时候调用的,即服务是什么时候创建的?

取自 official docs:

When Angular discovers that a component depends on a service, it first checks if the injector has any existing instances of that service. If a requested service instance doesn't yet exist, the injector makes one using the registered provider, and adds it to the injector before returning the service to Angular.

When all requested services have been resolved and returned, Angular can call the component's constructor with those services as arguments.

所以好像一个服务只有在第一次需要的时候才会实例化。

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

亲自测试一下

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

直到第一个组件注入它,通过下面link。

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

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

如果你在模块上引用,服务 运行 组件之前的构造函数需要,

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

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

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