Вам нужно использовать абстрактный класс вместо интерфейса для "IStrategy". Потому что Angular не поддерживает интерфейс как токен для инъекции. (https://angular.io/guide/dependency-injection-providers#non -класс-зависимости ). После этого вы можете указать в поставщиках модуля, как показано ниже
{ provide: IStrategy, useClass: MinusStrategy }
После этого CalculatorService будет использовать MinusStrategy для внедрения в любой компонент в этом модуле, который внедрил службу.
export abstract class IStrategy {
abstract calculate(a,b): number;
}
export class PlusStrategy extends IStrategy {
calculate(a,b): number {
return a + b;
}
}
export class MinusStrategy extends IStrategy {
calculate(a,b): number {
return a - b;
}
}
@Injectable({
providedIn: 'root',
})
export class CalculatorService {
constructor(
private http: HttpClient,
private calcStrategy: IStrategy) {};
getByCalc() {
console.log(`Result is: ${this.calcStrategy.calculate(1,1)}`);
}
}
//The module need to add token to providers for Strategy classes.
@NgModule({
declarations: [
...
],
imports: [
...
],
providers: [
{ provide: IStrategy, useClass: MinusStrategy }
],
bootstrap: [...]
})
export class AppModule { }
Обратите внимание, что, например, я оставил имя IStrategy для абстрактного класса. Это должно быть "BaseStrategy" или что-то еще.
================================== ==========================
[12.07.2020 17:00:00 GMT + 7]
Я создал демонстрационный проект и обновил свой подход, следуя этой проблеме. Не могли бы вы открыть его и снова увидеть мой подход.
Ссылка на Stackblitz: https://stackblitz.com/github/sangnt-developer/demo-injection-in-component-level
Ссылка на Github: https://github.com/sangnt-developer/demo-injection-in-component-level