提供者是 DI 创建实例或获取需要传递给构造函数或使用injector.get(..)
.
providers: [
MyService // short form for
{ provide: MyService, useClass: MyService },
// create instance of `MyServiceMock` when `MyService` is requested
{ provide: MyService, useClass: MyServiceMock },
// redirect to a provider for `MyService` (^^^ use this one on the previous line)
{ provide: MyServiceMock, useExisting: MyService },
// custom code to create an instance
{ provide: MyService, useFactory: (a, b) => new MyMockService(a, b), deps: [Http, new Inject('foo')]},
{ provide: 'foo', useValue: 'bar' }
]
(传递给的值provide: ...
是查找提供者的令牌。另一个参数是用于创建实例的策略)
当 DI 创建一个类的实例时,它会读取创建实例所需的类的构造函数参数或deps
提供程序的参数,以确定它需要传递给该构造函数以创建该实例的值。
@Inject(...)
然后它搜索与这些必需参数值匹配的提供程序(通过构造函数参数的类型,或使用装饰器分配给构造函数参数的标记。
@Injectable()
class MyService {}
@Component(...)
class MyComponent {
constructor(private myService:MyService) {}
}
当 Angular 需要一个MyComponent
实例时,它会从 DI 请求它,为了让 DI 创建一个实例,它需要一个实例MyService
才能将它传递给构造函数。DI 查找提供程序MyService
并创建一个实例,或者如果之前已经创建了一个,则重新使用这个。
注册提供者的位置定义了将哪个实例或值传递给构造函数。
在此示例中,将注入组件提供程序的一个实例。
如果组件没有该providers: [MyService]
行,则将@NgModule()
注入来自提供者的实例:
@NgModule({
...
providers: [MyService],
})
@Component({
providers: [MyService],
})
class MyComponent {
constructor(private myService:MyService) {}
}
每个子组件都有自己的注入器,它是父组件注入器的子注入器。创建组件时,DI 在组件注入器中查找提供者,然后在父组件注入器中查找提供者,...,up too AppComponent
,然后在@MgModule()
注入器中查找。第一个具有所需令牌提供程序的注入器用于获取实例。这意味着在哪里提供提供者很重要。如果您将提供程序添加到组件,您将获得所提供服务的尽可能多的实例,因为存在组件实例。如果您只添加一个提供程序,@NgModule(...) class AppModule{}
那么整个应用程序中将只有一个实例。
延迟加载的模块增加了一些额外的复杂性。查看文档以获取更多详细信息。