Внедрение зависимостей Angular2 фабричным методом с использованием интерфейса - PullRequest
0 голосов
/ 28 марта 2020

Я пытаюсь использовать внедрение зависимостей Angular2, но получаю следующее сообщение об ошибке:

ошибка NG2003: нет подходящего токена внедрения для параметра 'service' класса 'PaymentService'

app.module.ts - провайдер с фабричным методом

@NgModule({
  declarations: [
    AppComponent
  ],
  imports: [
    BrowserModule
  ],
  providers: [
    PaypalPayment,
    CardPayment,
    {
      provide: PaymentService,
      useFactory: () => {
        return new PaymentService(new PaypalPayment());
      }
    }
  ],
  bootstrap: [AppComponent]
})
export class AppModule {
}

payment.service.ts - сервис инъекционных платежей

@Injectable()
export class PaymentService {

  constructor(private service: Payment) {
  }

  pay(amount: number) {
    console.log('Payment Service -> pay(...) is running');
    this.service.pay(amount);
  }
}

payment.interface.ts, card-payment.ts, paypal-payment.ts файлы

export interface Payment {
  pay(amount: number);
}

@Injectable()
export class CardPayment implements Payment {
  pay(amount: number) {
    console.log('Paid by card. Amount=', amount);
  }
}

@Injectable()
export class PaypalPayment implements Payment {
  pay(amount: number) {
    console.log('Paid via Paypal. Amount=', amount);
  }
}

Примечание: Все работает нормально, если я заменяю интерфейс «Платеж» в файле PaymentService с одной из его реализаций (PaymalPayment или CardPayment). Но это довольно распространенный случай, когда есть интерфейс.

Полный исходный код здесь

  1. git клон https://github.com/karenmargaryan/di-via-interfaces-issue
  2. cd di-via-interfaces-issue
  3. npm установка
  4. ng serve

1 Ответ

0 голосов
/ 28 марта 2020

В payment.service.ts :

Обновление конструктора

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

constructor(@Inject(Payment) private service: Payment)
...