Введение службы Angular в службу AngularJS - PullRequest
0 голосов
/ 11 октября 2019

Я работаю над переносом кодовой базы oppia (https://github.com/oppia/oppia) с AngularJS на Angular2 +. В настоящее время я переносю сервисы, после чего я буду переносить директивы / компоненты. Порядок миграции сервисов следующий:порядок зависимости, т.е. если service3 зависит от service2, service2 зависит от service1 - я перенесу service1, затем service2 и, наконец, service3.

Проблема, с которой я сталкиваюсь, заключается в использовании (перенастроенных) сервисов Angular в модулетесты сервиса AngularJS. В настоящее время мы находимся в гибридном состоянии, которое использует AngularJS и Angular. Я пишу заявление о понижении рейтинга всех сервисов, которые были обновлены до Angular, например:

angular.module('oppia').factory(
  'UpgradedServices',
  downgradeInjectable(UpgradedServices));

Сейчас, ссылаясь на этот ответ https://stackoverflow.com/a/48668591/12141840, , если вы используете downgradeModule, угловой модуль лениво запускается angularjs, когда ему нужно визуализировать первый угловой компонент. До тех пор, пока угловой модуль не инициализирован, если вы обращаетесь к любым угловым сервисам внутри angularjs, используя downgradeInjectable,эти услуги также недоступны .

Для компонентов, которые мы принудительно загрузили ранее, как указано в ответе. Проблемы возникают при запуске юнит-тестов для сервисов. Так, скажем, service3 использует service2, а service2 использует service1. Я перевожу service1 в angular (с последним утверждением downgrade). Служба 1 не доступна для службы 2 до тех пор, пока не загрузится первый компонент, и, следовательно, недоступна во время выполнения модульных тестов (компонент не загружен для запуска модульных тестов). Мы не можем использовать service1, как для модульных тестов service2.

Решение, которое я нашел, состояло в том, чтобы внедрить service1 подобно $provide.value('service1', new service1()) в модульных тестах других служб (service2). Это исправляет ошибку (Первый вопрос - это правильный путь?). Но теперь скажите, что я мигрировал UtilsService , который используется в адском множестве сервисов, и там дети (другие, которые используют эти сервисы) - я должен добавить $provide.value('UtilsService', new UtilsService()) в примерно 200 тестах сервисов (*spec.ts). Тогда у нас есть AlertsService, который снова используется многими сервисами. Я должен снова добавить $provide.value('AlertsService': new AlertsService()) в тест (* spec.ts) всех сервисов, использующих его, и сервисы, которые зависят от этих сервисов. Для ясности, если A использует B, а B использует C, то, если C переносится, я должен также предоставить C в тестах A (поскольку A использует B, а B использует C, и у нас нет экземпляра C где-либо вэтот поток).

Решением этой проблемы было добавление имени службы UpgradedService.ts, которое выглядит следующим образом:

import {} // statements
@Injectable({
  providedIn: 'root'
})
export class UpgradedServices {
  /* eslint-disable quote-props */
  upgradedServices = {
    'UtilsService': new UtilsService(),
    'AlertsService': new AlertsService(new LoggerService()),
    'ValidatorsService': new ValidatorsService(
        new AlertsService(new LoggerService()), new AppConstants())
  };
  /* eslint-enable quote-props */
}

angular.module('oppia').factory(
  'UpgradedServices',
  downgradeInjectable(UpgradedServices));

, а затем использование этой службы во всех других * спецификациях. Сервисы AngularJS вместо того, чтобы писать везде, где мы предоставляем $ обеспечить. Вот как это выглядит в одной из спецификаций (добавлено в beforeEach ()).

var ugs = new UpgradedServices();
for (let [key, value] of Object.entries(ugs.upgradedServices)) {
  $provide.value(key, value);
}

Второй вопрос: это хорошо или есть простой способ сделать все это?

Третий вопрос. Трудно записать все аргументы конструктора в UpgradedService.ts. Посмотрите на ValidatorService, мы получаем вложенный конструктор. Я чувствую, что это будет более трудным, поскольку я продолжу дальнейшую миграцию сервисов, будут длинные аргументы конструктора, глубоко вложенные.

Это длинный пост :), я попытался объяснить все свои усилия. Спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...