Angular: Как я могу разорвать циклическую зависимость с HttpClient и перехватчиком - PullRequest
0 голосов
/ 25 февраля 2020

У меня есть приложение 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}'
}

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

...