这个问题通常是关于扩展或替换组件库中的组件。我将举一个例子。我们有一个跨项目使用的组件库,其中包含许多UI组件和指令。这些组件会在运行中自行转换。这些小部件中注入了翻译服务,程序员指定要翻译的键。这里一切都好。
假设这个基本翻译服务有getTranslation()方法来保持简单。
对于我们的大多数产品,基本翻译服务都是开箱即用的。对于其他人,他们希望使用不同的版本。我的第一个想法是定义一个接口,然后由基础翻译/其他项目的服务来实现它(对于Spring Java来说很正常)。我正在阅读angular style指南,其中说“考虑使用类而不是接口”。我花了一段时间来理解为什么(因为我的背景是Java),这很有意义,因为角度DI注入的工作方式似乎有所不同
https://github.com/angular/angular/issues/19632
.
因此,作为测试,在一个示例项目中,我创建了一个子类。
import { Injectable } from '@angular/core';
import { BaseTranslationService } from './base-translation.service';
@Injectable()
export class MyTranslationService extends BaseTranslationService {
constructor() {
super();
}
getTranslation(bundle: string, key: string, params?: any[]): string {
let translation = super.getTranslation(bundle, key, params);
return translation + ' from subclass';
}
}
虽然base translation service上还有许多其他方法,但我只是想用一些沙盒内容来覆盖上面的方法。
最后,在消费项目中,我知道不再提供BaseTransationService,而是提供新的:
providers: [ MyTranslationService, etc ]
这不起作用。我在所有需要BaseTransationService的组件上都遇到了此错误:
NullInjectorError:BaseTransationService没有提供程序!
看起来DI不理解MyTranslationService是否适用于BaseTranlationService。
这样行吗?我是否设置错误?我是否误解了风格指南?