如何在服务中使用提供者?

我需要使用一个服务的多个实例。

通常,当我在组件中使用此服务的一个实例时,我会这样写:

@Component({
    selector: 'one-component',
    providers: [provide("token1", {useClass: Service})],
    template: `
        <h1>App</h1>
    `
})
export class OneComponent {
    constructor(@Inject('token1') service:Service) {}
}

但是现在我需要在Service2中使用这个服务,我这样写:

export class Service2 {
    constructor(@Inject('token1') service:Service) {}
}

如您所知,它显示:

没有提供者

因为Service2没有providers: [provide("token1", {useClass: Service})] 。 但是我可以在哪里添加它,因为它没有@Component

谢谢


目前不支持以这种方式配置服务,目前还没有计划添加支持https://github.com/angular/angular/issues/5622


我不认为甘特的答案在这里完全正确。 如果我正确理解了洪波苗的问题,这可以“轻松”实现。 如果您想在每次注入时获得服务的新实例,则必须使用useFactory而不是useClass提供程序配置。

然后,如果你得到一个没有提供错误"token1"Service2 ,那是因为它没有在右侧注射器,兄弟姐妹或父母配置OneComponent ,其中... Service2注入。

编辑:

为此,您必须在根组件(例如)中定义ServiceService2提供程序。 在这种情况下,所有人都将共享相同的服务实例。

如果要在每个组件中使用不同的实例,请在组件级别定义提供程序,这些服务正在使用中。

@Component({
  providers: [Service, Service2],
  // Other config props
})
export class RootComponent {
}

@Component({
  // Config props
})
export class OneComponent {
  constructor(public service: Service) {}
  methodx() {
    this.service...
  }
}

@Component({
  // Config props
})
export class TwoComponent {
  constructor(public service: Service2) {}
  methodx() {
    this.service...
  }
}

@Injectable()
export class Service2 {
  constructor(public service: Service) {
  }
}

使用@Inject('StringToken')不是你所做的最好的事情,也不是推荐的方法。 改为使用Type标记(如上面的代码中所做的那样)。

资源:

  • http://blog.thoughtram.io/angular/2015/05/18/dependency-injection-in-angular-2.html
  • http://blog.thoughtram.io/angular/2015/09/17/resolve-service-dependencies-in-angular-2.html

  • 我已经通过在app.module.ts的提供程序数组中声明这两个服务来纠正此错误(将服务B用于服务A)。

    @NgModule({
        declarations: [...],
        imports:      [...],
        providers:    [
            ServiceA,
            ServiceB,
        ],
        bootstrap:    [...],
    })
    
    链接地址: http://www.djcxy.com/p/32509.html

    上一篇: How to use providers in a service?

    下一篇: How to run commands on same TCL shell using Python