使用接口的工厂方法的Angular2依赖项注入
我尝试使用Angular2依赖项注入,但收到以下错误消息: 错误NG2003:类“PaymentService”的参数“service”没有合适的注入令牌 app.module.ts-使用工厂方法的提供程序使用接口的工厂方法的Angular2依赖项注入,angular,angular-dependency-injection,Angular,Angular Dependency Injection,我尝试使用Angular2依赖项注入,但收到以下错误消息: 错误NG2003:类“PaymentService”的参数“service”没有合适的注入令牌 app.module.ts-使用工厂方法的提供程序 @NgModule({ declarations: [ AppComponent ], imports: [ BrowserModule ], providers: [ PaypalPayment, CardPayment, {
@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),一切正常。但是在那里有一个接口是很常见的
在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。在您的例子中,接口被认为是基本的,因此它需要这个装饰器。