Выбор конфигурации во время инициализации модуля (в конструкторе или в методе stati c, таком как forRoot
) не будет работать, так как на этом этапе зависимости не были разрешены. Так, например, у вас не будет HttpClient
доступных для извлечения данных.
Что может быть приемлемым способом:
1. Укажите ConfigurationService
, который получает введенный URL-адрес вашего файла конфигурации
@Injectable()
export class ConfigService {
private config$ = new BehaviorSubject<any | null>(null);
private loadedConfig = false;
constructor(@Inject(CONFIG_URL) private configUrl: string,
private httpClient: HttpClient) {
this.getConfig();
}
getConfig(): Observable<any> {
if (!this.loadedConfig) {
this.loadedConfig = true;
this.httpClient.get(this.configUrl).subscribe(this.config$);
}
return this.config$;
}
}
2. Предоставьте ConfigurationService
как часть модуля, который может динамически устанавливать CONFIG_URL
:
@NgModule({
providers: [ConfigService],
imports: [
HttpClientModule
]
})
export class ConfigModule {
static buildForConfigUrl(configUrl: string): ModuleWithProviders {
return {
ngModule: ConfigModule,
providers: [
{
provide: CONFIG_URL,
useValue: configUrl
}
]
};
}
}
3. Импортируйте ConfigModule
в свои функциональные модули
Теперь, когда у вас есть функциональный модуль, который должен иметь собственную конфигурацию, просто импортируйте ConfigModule
, используя buildForConfigUrl
:
@NgModule({
exports: [
MyComponent
],
declarations: [
MyComponent
],
imports: [
ConfigModule.buildForConfigUrl('https://my-url/my-config.json')
]
})
export class FeatureModule {
}
4. Используйте ConfigService
в своих компонентах:
@Component({
selector: 'my-component',
template: 'I am your new component. My config is: {{ config$ | async | json }}'
})
export class MyComponent implements OnInit{
config$: Observable<any>;
constructor(private configService: ConfigService) {
}
ngOnInit(): void {
this.config$ = this.configService.getConfig();
}
}
При таком подходе вы прекрасно отделили проблемы: ваши функциональные модули не должны заботиться о том, как загружается конфигурация, но все же ее компоненты имеют конфигурация доступна во время выполнения.
Если вы хотите сделать go на один шаг дальше, вы даже можете удалить определение URL-адресов конфигурации из ваших функциональных модулей и переместить его в AppModule
централизованно.