代码之家  ›  专栏  ›  技术社区  ›  Scott

从库注入器错误扩展角度类

  •  1
  • Scott  · 技术社区  · 6 年前

    这个问题通常是关于扩展或替换组件库中的组件。我将举一个例子。我们有一个跨项目使用的组件库,其中包含许多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。

    这样行吗?我是否设置错误?我是否误解了风格指南?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Aravind    6 年前

    库中的组件查找使用令牌提供的服务 BaseTranslationService . 但是你已经没有这样的代币了。您需要这样做:

    providers: [ { provide: BaseTranslationService, useClass: MyTranslationService}, etc ]
    

    根据注释更新,您应该对类进行注释 MyTranslationService 使用 @Injectable 装饰师如下,

    @Injectable()
    export class MyTranslationService extends BaseTranslationService {
    ...
    }