В документации Angular есть замечательная глава под названием FAQs по NgModule, которая содержит следующий раздел:
Что, если два модуля предоставляют один и тот же сервис?
...
Если NgModule A предоставляет сервис для токена 'X' и импортирует NgModule B, который также предоставляет сервис для токена 'X', то определение сервиса NgModule A "выигрывает".
Другими словами, вы можете переопределить OAuthModuleConfig для вашей библиотеки в AppModule:
main.ts
(async () => {
const response = await fetch('https://api.myjson.com/bins/lf0ns');
const config = await response.json();
environment['allowedUrls'] = config.apiBaseURL;
platformBrowserDynamic().bootstrapModule(AppModule)
.catch(err => console.error(err));
})();
app.module.ts
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { AppComponent } from './app.component';
import { OAuthModule, OAuthModuleConfig } from 'angular-oauth2-oidc';
import { HttpClientModule } from '@angular/common/http';
import { environment } from '../environments/environment';
@NgModule({
declarations: [
AppComponent
],
imports: [
BrowserModule,
HttpClientModule,
OAuthModule.forRoot(),
],
providers: [
{
provide: OAuthModuleConfig,
useFactory: () => ({
resourceServer: {
allowedUrls: [environment['allowedUrls']],
sendAccessToken: true
}
})
}
],
bootstrap: [AppComponent]
})
export class AppModule {}
Обратите внимание, что мы также должны использовать useFactory
вместо useValue
, поэтому мы не зависим от того, когда AppModule
импортируется.