使用接口的工厂方法的Angular2依赖项注入

使用接口的工厂方法的Angular2依赖项注入,angular,angular-dependency-injection,Angular,Angular Dependency Injection,我尝试使用Angular2依赖项注入,但收到以下错误消息: 错误NG2003:类“PaymentService”的参数“service”没有合适的注入令牌 app.module.ts-使用工厂方法的提供程序 @NgModule({ declarations: [ AppComponent ], imports: [ BrowserModule ], providers: [ PaypalPayment, CardPayment, {

我尝试使用Angular2依赖项注入,但收到以下错误消息:

错误NG2003:类“PaymentService”的参数“service”没有合适的注入令牌

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文件中的接口“Payment”替换为它的一个实现(PaymalPayment或CardPayment),一切正常。但是在那里有一个接口是很常见的

  • git克隆
  • cd di通过接口问题
  • npm安装
  • ng发球

  • payment.service.ts中

    更新构造函数

    //import { Inject } from '@angular/core';
    
    constructor(@Inject(Payment) private service: Payment)
    

    payment.service.ts中

    更新构造函数

    //import { Inject } from '@angular/core';
    
    constructor(@Inject(Payment) private service: Payment)
    

    您的版本正在运行。非常感谢您的回复。但是你知道我的版本有什么问题吗?我甚至在Ari Lerner的书中找到了一个例子,但他的版本也不起作用。当然,不客气。为了在构造函数中注入服务,服务类型应修饰为@Injectable(),这通常在使用“ng g s”CLI命令时完成。在您的情况下,您试图注入类型为Payment的服务,而Payment没有装饰为@Injectable(),因此您应该通过@injection()手动注入。如果你发现答案是有益的,不要忘记把答案标记为已接受:)我同意你关于decorator的看法,但这里有一个例外。如果我没有创建“Payment”(它是一个接口)的实例,并且我在那里注入了一些东西,那么为什么我要用“Injectable()”来装饰呢。如果您只是用基类替换接口(没有decorator),它将非常好地工作。据我所知,这与你的回答背道而驰。我说得对吗?所以这里的主要秘密是,为什么它适用于“类支付”,而不适用于“接口支付”。。。无论如何,感谢您的努力和解释。@InjectDecorator仅用于注入原语。基本类型有number、string、boolean、bigint、symbol、null、undefined或object。在您的情况下,接口被认为是基本的,因此它需要这个装饰程序。您的版本正在运行。非常感谢您的回复。但是你知道我的版本有什么问题吗?我甚至在Ari Lerner的书中找到了一个例子,但他的版本也不起作用。当然,不客气。为了在构造函数中注入服务,服务类型应修饰为@Injectable(),这通常在使用“ng g s”CLI命令时完成。在您的情况下,您试图注入类型为Payment的服务,而Payment没有装饰为@Injectable(),因此您应该通过@injection()手动注入。如果你发现答案是有益的,不要忘记把答案标记为已接受:)我同意你关于decorator的看法,但这里有一个例外。如果我没有创建“Payment”(它是一个接口)的实例,并且我在那里注入了一些东西,那么为什么我要用“Injectable()”来装饰呢。如果您只是用基类替换接口(没有decorator),它将非常好地工作。据我所知,这与你的回答背道而驰。我说得对吗?所以这里的主要秘密是,为什么它适用于“类支付”,而不适用于“接口支付”。。。无论如何,感谢您的努力和解释。@InjectDecorator仅用于注入原语。基本类型有number、string、boolean、bigint、symbol、null、undefined或object。在您的例子中,接口被认为是基本的,因此它需要这个装饰器。