这个例子的完整源代码:git
import { Component, OnInit, Injectable, Injector } from '@angular/core'; @Injectable() class UsefulService { constructor(){ console.log("Useful Service is created"); } } @Injectable() class NeedsService { constructor(public service: UsefulService) { console.log("NeedsService is created"); } } const injector = Injector.create({ providers: [{ provide: NeedsService, deps: [UsefulService] }, { provide: UsefulService, deps: [] }] }); console.log(' true or false?' , injector.get(NeedsService).service instanceof UsefulService); @Component({ selector: 'manual_di', template: '<p>Manual DI </p>' }) export class ManualDIComponent implements OnInit { constructor() { } ngOnInit(): void { } }
由实现源代码可见,Angular NgModule providers 元数据支持 name 参数:github
NeedsService 的依赖服务是 UsefulService,维护在 deps 数组里:typescript
观察最后返回的 injector 实例里,到底包含了哪些数据:数组
injector records 属性包含了 Providers NeedsService 和 UsefulService 两条记录,可是 value 为空,由于是惰性加载。ide
直到应用代码显式调用 injector.get 获取 providers 实例时,hydration 才会发生:spa
本文所有源代码能够在这个 commit 里找到。调试
更多Jerry的原创文章,尽在:"汪子熙":code