Angular学习笔记-使用工厂和值声明提供器

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_41012753/article/details/85233546

提供器的声明方式,常用的有3种

  1. 使用类:useClass
    { provide: MyService, useClass: MyMockService }
  2. 使用工厂:useFactory
    使用工厂进行注入,就需要写一个返回任意对象的函数。
  3. 使用值:useValue
    {provide:‘API_URL’,useValue:‘http://my.api.com/v1’}

demo

编写一个工厂函数,根据随机数实例化服务1:StockService或服务2:Stock2Service

//app.module.ts
providers: [
  {provide:StockService,useFactory:()=>{
    let dev = Math.random() > 0.5;
    if(dev){
        return new StockService();
    }else{
        return new Stock2Service();
    }
  }},AnotherstockService]

因为之前StockService服务的构造函数中有注入其他服务AnotherstockService,所以在实例化时,需要传入实例化的参数

providers: [
  {provide:StockService,useFactory:()=>{
    let logger = new AnotherstockService();
    let dev = Math.random() > 0.5;
    if(dev){
        return new StockService(logger);
    }else{
        return new Stock2Service(logger);
    }
  }},AnotherstockService]

接着,为了使我们的工厂参数中let logger = new AnotherstockService();与AnotherstockService解耦,可以使用deps属性

providers: [
  {provide:StockService,useFactory:(logger:AnotherstockService)=>{
    let dev = Math.random() > 0.5;
    if(dev){
        return new StockService(logger);
    }else{
        return new Stock2Service(logger);
    }
  },deps:[AnotherstockService]},AnotherstockService]

deps是个数组,对应useFactory中匿名函数的参数,如:deps中的第一个参数AnotherstockService,angular会找到名为AnotherstockService的token,实例化后赋值给useFactory匿名参数中的logger。

因此,省略了let logger = new AnotherstockService();

我们还可以增加个使用值的提供器

providers: [
  {provide:StockService,useFactory:(logger:AnotherstockService,isdev)=>{
    if(isdev){
        return new StockService(logger);
    }else{
        return new Stock2Service(logger);
    }
  },deps:[AnotherstockService,'IS_DEV']},AnotherstockService,{provide:'IS_DEV',usevalue:true}]

在上方例子中,我们增加了值声明方式{provide:‘IS_DEV’,value:true},同时在工厂函数的deps中使用名为 ‘IS_DEV’ 的token,并赋值给匿名函数中的第2个参数isdev

猜你喜欢

转载自blog.csdn.net/weixin_41012753/article/details/85233546
今日推荐