Внедрение службы с использованием метода вместо конструктора

Скажем, у меня есть этот сервис и компонент. Я хотел бы использовать несколько экземпляров 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;
  }

}

это не скомпилируется, потому что я получаю эту ошибку:

введите здесь описание изображения

Есть ли способ внедрить новый экземпляр службы, используя метод вместо конструктора?


person Community    schedule 01.02.2018    source источник
comment
В чем причина попробовать это? Меняется ли ваш экземпляр MySillyService во время выполнения?   -  person erosb    schedule 01.02.2018
comment
Я хочу внедрить несколько экземпляров MySillyService, я не хочу повторно использовать один и тот же экземпляр. Имеет смысл?   -  person    schedule 02.02.2018
comment
@ConnorsFan имеет правильную идею   -  person    schedule 02.02.2018


Ответы (3)


Служба 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);
    }
}
person ConnorsFan    schedule 01.02.2018

Если вам действительно не нужно управление экземплярами Angular (отдельный экземпляр) или его внедрение зависимостей, вы можете создать просто простой класс. Затем вы можете создать и передать любое количество его экземпляров, которое вам нужно.

Я не думаю, что это распространенный метод ... но он должен работать.

person DeborahK    schedule 01.02.2018
comment
Я думаю, что у @ConnorsFan правильная идея, не уверен, что это лучшая практика, но он отвечает на вопрос, который я думаю - person ; 01.02.2018

Нет, нет. Но вы можете ввести несколько экземпляров, просто назвав их разными именами:

конструктор (частный myService1: dataService, частный myService2: dataService) {}

person David Anthony Acosta    schedule 01.02.2018
comment
да, проблема в том, что массив [1,2,3] на самом деле является массивом с динамическим размером, поэтому я не могу жестко запрограммировать конструктор таким образом - person ; 01.02.2018
comment
Ах хорошо. Попался. В таком случае я не знаю, как это сделать :( но теперь мне любопытно узнать! Lol - person David Anthony Acosta; 01.02.2018
comment
Думаю, у @ConnorsFan есть ответ - person ; 01.02.2018