8.4 Provider 服务提供者 - RLwu/angular-start GitHub Wiki

Provider - 服务提供者

我们在前一节中,为了便于理解,有意含糊了一点。

下面的示例代码中,resolveAndCreate()的依赖项参数,其各个成员是什么类型?

var injector = Injector.cresolveAndCreate([A,B,C]);

看起来也许是:A代表class A,B代表class B,C代表class C。

也对,也不对。

事实上,依赖项是一个Provider对象,上面示例展开形式是:

var injector = Injector.cresolveAndCreate([
    new Provider(A,{useClass:A}),
    new Provider(B,{useClass:B}),
    new Provider(C,{useClass:C})
    ]);

在Angular2中,注入器的依赖项总是一个Provider对象,当使用类作为提供者时, 可以直接简写为类的名称,框架会自动转化为Provider对象。

Provider构造函数的第一个参数被称为TOKEN,可以理解为在注入器中,这个提供 者的唯一标识,当我们使用Inject注解进行注入声明时,使用的就是这个TOKEN。

因此,Inject(A)中的A也不是指class A,而是一个TOKEN而已。我们可以换个 字符串做TOKEN:

var injector = Injector.cresolveAndCreate([
    new Provider("AAA",{useClass:A}),
    new Provider("BBB",{useClass:B}),
    new Provider("CCCC",{useClass:C})
    ]);

现在,要获得A类的实例就应当使用get("AAA")了,而注入A类的实例,就变成这样了:

class XYZ{
    constructor(@Inject("AAA") a){...}
}

如果你不喜欢使用new,也可以使用provide()函数,它的参数与Provider类的构造 函数一样,并且直接返回一个Provider对象:

var injector = Injector.cresolveAndCreate([
    provide("AAA",{useClass:A}),
    provide("BBB",{useClass:B}),
    provide("CCCC",{useClass:C})
    ]);