У меня есть приложение Angular, которое имеет циклическую зависимость между 3 различными типами. Я построил перехватчик, который использует нечто, называемое AuthorizationService, так что, если пользователь авторизован, токен носителя автоматически добавляется как часть HTTP-запроса. Раньше это работало нормально, пока я не хотел, чтобы мой идентификатор клиента и идентификатор клиента настраивались и вводились как часть переменных среды (в конце концов приложение заканчивается в контейнере Docker, а реализация auth использует Azure AD ).
Чтобы компенсировать это, я обновил свой существующий EnvironmentService, чтобы также считывать идентификатор клиента и идентификатор клиента из файла JSON (который переопределяется при развертывании). Реализация которого использует HttpClient для чтения файла, что-то вроде следующего, где load () вызывается при инициализации приложения:
...
constructor(private http: HttpClient) { }
load(): void {
this.http.get(configLocation).subscribe(data => {
...
this.clientId = data.clientId;
});
}
...
И AuthorizationService был обновлен, чтобы выглядеть следующим образом:
...
constructor(private environmentService: EnvironmentService) {
this.clientId = environmentService.clientId;
this.tenantId = environmentService.tenantId;
}
login(): void {
... initializes login that uses the variables set above
}
...
Вот здесь и возникает проблема. AuthorizationService зависит от EnvironmentService, который зависит от HttpClient, который зависит от AuthorizationService из-за перехватчика для HttpClient. Там нет никакой гарантии, что я могу видеть порядок, в котором вещи загружаются, и я вижу в журналах консоли, что достигнуто максимальное количество стеков.
Я попробовал другую тактику c вместо того, где вместо читая файл JSON через HttpClient, я просто загрузил его прямо в класс. Это работает, за исключением случаев, когда вы хотите выполнить развертывание и выполнить сборку с использованием конфигурации --prod - вместо ссылки на файл JSON он оптимизирован, чтобы быть встроенным, что означает, что переменные среды из другого файла конфигурации больше не читаются, и поэтому значения в файле JSON становятся c локальными настройками. Я не смог найти способ исключить файл JSON из оптимизации. Чтобы понять разницу между двумя JSON файлами, выглядит следующим образом:
локальная конфигурация. json
{
apiUrl: 'http://localhost:80'
clientId: '123456789',
tenantId: '987654321'
}
шаблон конфигурации. json
{
apiUrl: '${apiUrl}',
clientId: '${clientId}',
tenantId: '${tenantId}'
}
Я борюсь за идеи о том, что делать дальше и как этого добиться. Я пробовал несколько различных рефакторов, таких как описанный выше, но безуспешно. Кто-нибудь сталкивался с подобной проблемой раньше, и если да, то как вы ее решаете?