8.6 Provider的其他选项 - RLwu/angular-start GitHub Wiki
Provider的其他选项 引入TOKEN的另一个目的在于,Provider不一定需要是一个类。
值提供者/Value Provider
比如,你可以把应用的配置信息登记到注入器里,这样其他代码就可以在需要时直接注入了。 配置信息通常不是一个类,而是一个具体的JSON对象,我们可以在创建Privider对象 时,使用useValue来声明一个值提供者:
var cfg_provider = provide("APP_CONFIG",{
useValue : {title:'My Site'}
});
var injector = Injector.resolveAndCreate([cfg_provider]);
//使用
var cfg = injector.get("APP_CONFIG");
工厂提供者/Factory Provider
工厂提供者是工厂模式的实现。在创建Provider对象时,使用useFactory属性指定一个 工厂函数,它应当返回一个具体的对象。
var car_provider = provide("CAR",{
useFactory : function(){return new Car();}
});
var injector = Injector.resolveAndCreate([car_provider]);
//使用
var car = injector.get("CAR");
声明依赖项
一个Provider可能依赖于其他的Provider,因此,在创建Provider对象时,有时需要使用 deps属性来声明这一点,以便注入器能够首先创建这些依赖项,再实例化这个Provider:
class A{}
class B{}
class ABAB{
constructor(@Inject(A) a ,@Inject(B) b){...}
}
var injector = Injector.resolveAndCreate([
provide(A,{useClass:A}),
provide(B,{useClass:B}),
provide(C,{useClass:C,deps:[A,B]}
]);