1.工厂方法提供器声明 useFactory
providers: [
{ provide:StockService,
useFactory:(logger:LoggerService)=>{
//let logger=new LoggerService(); //耦合性
let dev=Math.random()>0.5;
if(dev){
return new StockService(logger);
}else{
return new AnotherStockService(logger);
}
},
deps:[LoggerService] //可将声明的提供器LoggerService传给工厂构造方法
}
,LoggerService
],
工厂方法提供器无论你调用几次,只会实例化一次,stock和stock2都使用了StockService这个提供器,所以二者显示的数据都是一样,使用的实例化对象始终是第一次实例化的
2.值对象提供器声明 useValue
providers: [
{ provide:StockService,
useFactory:(logger:LoggerService,isDev)=>{
//let logger=new LoggerService(); //耦合性
let dev=Math.random()>0.5;
console.log(isDev);
if(dev){
return new StockService(logger);
}else{
return new AnotherStockService(logger);
}
},
deps:[LoggerService,"IS_DEV_ENV"] //一一对应工厂方法的参数
}
,LoggerService,
{provide:"IS_DEV_ENV",useValue:false}
],
3.将LoggerService也用工厂方法声明
providers: [
{ provide:StockService,
useFactory:(logger:LoggerService,isDev)=>{
//let logger=new LoggerService(); //耦合性
let dev=Math.random()>0.5;
console.log(isDev);
if(dev){
return new StockService(logger);
}else{
return new AnotherStockService(logger);
}
},
deps:[LoggerService,"IS_DEV_ENV"] //一一对应工厂方法的参数
}
,
{provide:LoggerService,useFactory:()={...}}
,
{provide:"IS_DEV_ENV",useValue:false}
],