Угловые службы расширения, наследования и di, как сопоставить конструкторы? - PullRequest
0 голосов
/ 08 мая 2018

Я пытаюсь сделать какое-то наследство над некоторыми услугами, которые у меня есть. Я действительно не знаю, является ли это хорошей практикой или нет, так или иначе, я действительно хотел бы реорганизовать все приложение, получая новые подходы.

В любом случае, это то, что у меня есть

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

@Injectable()
export class ApiBaseService {

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

  constructor(url : string, _logger : LoggerService) {

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

 }

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

и детский класс

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


@Injectable()
export class ApiWhatEverService extends ApiBaseService {

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

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

}

Дело в том, что конструкторы не совпадают из-за DI, связанного с LoggerService

Таким образом, мои мысли здесь пытаются внедрить 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
    ...............................
  }

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

}

Буду признателен, если кто-нибудь сможет мне помочь или направить меня.

Большое спасибо заранее

1 Ответ

0 голосов
/ 08 мая 2018

Поставщики создаются в рамках. Пользователь не может предоставить аргументы конструктору класса провайдера. url : string не имеет смысла в инъекционных классах, это приведет к ошибке DI, потому что нет string провайдера.

Существует несколько рецептов, которые позволяют предоставлять настройки для провайдера (см. этот обзор ). 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, что имеет дополнительные ограничения). Это антипаттерн здесь. Везде, где возможно, следует использовать имеющийся инжектор.

...