#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
inWindowDetailsService
. Таким образом, зависимость все равно останется циклической. Не так ли ?
Ответ №2:
другой способ — создать, например, файл службы x и импортировать ваши SessionHelperService и WindowDetailsService таким образом, чтобы все ваши службы выполняли свою работу без ошибки циклической зависимости