【问题标题】:Injecting a service using a method instead of the constructor使用方法而不是构造函数注入服务
【发布时间】:2018-02-01 19:52:59
【问题描述】:

假设我有这个服务和组件。我想使用多个 MySillyService 实例。

@Injectable()
export class MySillyService {

}

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.scss']
})


export class AppComponent {

  vals: Array<MySillyService>;

  constructor() {

    this.vals = [1,2,3].map(v => {
       return this.getSillyService();
    });

  }

  @Inject(MySillyService)
  getSillyService(mss: MySillyService){
    console.log('getting mss...');
    return mss;
  }

}

这将无法编译,因为我收到此错误:

有没有办法使用方法而不是构造函数来注入服务的新实例?

【问题讨论】:

  • 尝试这个的原因是什么?您的 MySillyService 实例是否在运行时发生变化?
  • 我想注入多个 MySillyService 实例,我不想重复使用同一个实例。有意义吗?
  • @ConnorsFan 有正确的想法

标签: angular angular5


【解决方案1】:

Injector 服务可用于使用方法注入服务:

import { Injector } from '@angular/core';

export class AppComponent {

    vals: Array<MySillyService>;
    mySillyService: MySillyService;

    constructor(private injector: Injector) {
       this.vals = ['some','dynamic','array'].map(v => this.getSillyService());
    }

    getSillyService() {
       return this.injector.get(MySillyService);
    }

    injectAnotherInstance() {
       this.mySillyService = this.injector.get(MySillyService);
    }
}

【讨论】:

    【解决方案2】:

    如果你真的不需要 Angular 的实例管理(单个实例)或其依赖注入,你可以只创建一个简单的类。然后,您可以创建并传递您需要的实例数量。

    我不认为这是一种常见的技术......但它应该可以工作。

    【讨论】:

    • 我认为@ConnorsFan 有正确的想法,不确定这是否是最佳实践,但它回答了我认为的问题
    【解决方案3】:

    不,没有。但是你可以通过命名不同的东西来注入多个实例:

    constructor(private myService1: dataService, private myService2: dataService) { }

    【讨论】:

    • 是的,问题在于[1,2,3] 数组实际上是一个动态大小的数组,所以我不能像这样对构造函数进行硬编码
    • 啊,好吧。明白了。在那种情况下,我不知道该怎么做:(但现在我很想知道!哈哈
    • 我认为@ConnorsFan 有答案
    猜你喜欢
    • 2018-09-27
    • 2020-06-03
    • 2018-03-05
    • 2015-04-22
    • 1970-01-01
    • 2020-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多