Циклическая зависимость Angular 11 обнаружена только для служб

#javascript #angular #angular-services #circular-dependency

#javascript #angular #angular-services #циклическая зависимость

Вопрос:

У меня есть две угловые службы, которые говорят WindowDetailsService и SessionHelperService . Теперь в моем коде для WindowDetailsService I у меня должен быть следующий сценарий:

WindowDetailsService:

 import { SessionHelperService } from '../pkg/session/session-helper.service';

constructor(private sessionHelperService: SessionHelperService) {
}

getCurrentSession() {
    const session = this.sessionHelperService.get(true);
}
 

SessionHelperService

 import { WindowDetailsService } from '../pkg/session/window-details.service';

constructor(private windowDetailsService: WindowDetailsService) {
}

windowOperations(windowType: String) {
    Switch(windowType) {
        case 'Cordova':
            if (shouldCloseWindow) {
                this.windowDetailsService.setReadyToClose(true);
                if (closeSession) {
                    this.closeUserSession(closeSession)
                        .finally(this.windowDetailsService.closeCurrentWindow);
                } else {
                    this.windowDetailsService.closeAllWindows();
                }
            }
            break;
        case 'Web':
            break;
        case 'Electron':
            break;
    }
}
 

Ошибка, которую я получаю,
Warning: Circular dependency detected: session-helper.service.ts -> window.details.ts -> session-helper.service.ts

Warning: Circular dependency detected: window-details.service.ts -> session-helper.service.ts -> window-details.service.ts

Я не могу извлечь код Window-details из SessionHelperService, поскольку он содержит код не только для типа окна Cordova, но также для Web и Electron.

Теперь моя проблема в том, что я не могу извлечь код, связанный с WindowDetailsService, из SessionHelperService и наоборот. Поскольку это большой проект, и если я внесу в него изменения, это повлияет на множество других зависимых файлов в проекте. Пожалуйста, подскажите, что мне делать

Комментарии:

1. возможно, ваш ServiceA зависит от ServiceB, и снова ServiceB зависит от ServiceA. Таким образом, что ServiceA.funcA() и service.funcB() и 2nd вызывают 1st, а 1st вызывает 2nd…

Ответ №1:

Попробуйте использовать службу инжектора, чтобы получить SessionHelperService этот путь:

WindowDetailsService:

   import { Injector } from '@angular/core';
  
  @Injectable({
    providedIn: 'root'
  })
  export class ...

  private sessionHelperService: SessionHelperService

  /**
   * Constructor
   */
  constructor(private injector:Injector) {
  }

  getCurrentSession() {
    this.sessionHelperService = injector.get(SessionHelperService));
    const session = this.sessionHelperService.get(true);
  }
 

Комментарии:

1. Я попробую это, но даже если мы используем инжектор, у нас все равно будет ссылка на SessionHelperService in WindowDetailsService . Таким образом, зависимость все равно останется циклической. Не так ли ?

Ответ №2:

другой способ — создать, например, файл службы x и импортировать ваши SessionHelperService и WindowDetailsService таким образом, чтобы все ваши службы выполняли свою работу без ошибки циклической зависимости