【问题标题】:Angular extending services, inheritance and di, how to make constructors matching?Angular扩展服务,继承和di,如何使构造函数匹配?
【发布时间】:2018-10-18 06:51:47
【问题描述】:

我正在尝试对我拥有的某些服务进行某种继承。 我真的不知道这是否是一个好习惯,无论如何我真的很想重构所有的整个应用程序以获得新的方法。

不管怎样,这就是我所拥有的

    ...............................

@Injectable()
export class ApiBaseService {

    ...............................

  constructor(url : string, _logger : LoggerService) {

    ...............................    

 }

    ...............................

还有一个子类

    ...............................


@Injectable()
export class ApiWhatEverService extends ApiBaseService {

  constructor(private _http: Http) {
    super(environment.apiUrl);
  }

    ...............................

}

这里的重点是LoggerService相关的DI导致构造函数不匹配

所以我的想法是尝试以任何其他方式注入 LoggerService,例如使用 Angular 注入器,但它失败了

    ...............................

@Injectable()
export class ApiBaseService {

  apiUrl;
  _logger : LoggerService;

    ...............................

  constructor(url : string) {

    ...............................    


    let injector = ReflectiveInjector.resolveAndCreate([
      LoggerService
    ]);
    this._logger = injector.get(LoggerService);
    //IT DOESN'T GET ALL THE METHOD ASSOCIATED TO LoggerService
    ...............................
  }

    ...............................

}

如果有人可以帮助或指导我,我将不胜感激。

在此先感谢

【问题讨论】:

    标签: javascript angular typescript dependency-injection angular5


    【解决方案1】:

    提供者由框架实例化。用户不能向提供者类构造函数提供参数。 url : string 在可注入类中没有意义,它会导致 DI 错误,因为没有 string 提供程序。

    有几个配方允许为提供者提供配置(请参阅this overview)。 URL 可以在配置提供者中提供:

    const CONFIG = new InjectionToken<any>('config');
    function configFactory() {
      return {
        url: environment.url
      }
    }
    
    ...
    providers: [..., { provide: CONFIG, useFactory: configFactory }]
    ...
    

    子提供者应扩充父提供者列表,以便通过super 传递它:

    @Injectable()
    export class ApiBaseService {
      constructor(
        @Inject(CONFIG) protected config: any,
        protected _logger : LoggerService
      ) {...}
    }
    
    @Injectable()
    export class ApiWhatEverService extends ApiBaseService {
    
      constructor(
        @Inject(CONFIG) config: any,
        _logger : LoggerService,
        private _http: Http
      ) {
        super(config, _logger);
      }
    }
    

    ReflectiveInjector 通常用于边缘情况(它已被弃用,有利于具有额外限制的StaticInjector)。这里是反模式。应尽可能使用现有的注射器。

    【讨论】:

      猜你喜欢
      • 2019-02-26
      • 2014-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-06
      • 2014-11-22
      • 1970-01-01
      相关资源
      最近更新 更多