Я пытаюсь использовать внедрение зависимостей 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). Но это довольно распространенный случай, когда есть интерфейс.
Полный исходный код здесь
- git клон https://github.com/karenmargaryan/di-via-interfaces-issue
- cd di-via-interfaces-issue
- npm установка
- ng serve