Я пытаюсь поэкспериментировать с возможностью предоставления конфигурации приложения, зависящей от сети, в виде инжекта.
Я создал интерфейс AppConfig и соответствующий ему токен:
export interface AppConfig {
...
}
export const APP_CONFIG = new InjectionToken<AppConfig>('APP_CONFIG');
Я пользуюсь услугой,
@Injectable({
providedIn: 'root',
})
export class AppConfigService {
private appConfigInternal: AppConfig | null;
private generatedClient: GeneratedClient;
constructor(injector: Injector) {
this.generatedClient = injector.get(GeneratedClient);
this.appConfigInternal = null;
}
get appConfig(): AppConfig {
if (this.appConfigInternal != null) {
return this.appConfigInternal;
}
throw new Error('Invalid retrieval of application config');
}
async load(): Promise<boolean> {
// loads some properties asynchronously and fills in the app config,
// a false return indicates that it is a fundamental error and the application
// should be in an error state and not use the app config
...
}
В моих поставщиках модулей приложений у меня есть:
{
provide: APP_INITIALIZER,
useFactory: appConfigStartup,
deps: [Injector],
multi: true,
},
{
provide: APP_CONFIG,
useFactory: (injector: Injector): AppConfig => {
const service = injector.get(AppConfigService);
return service.appConfig;
},
deps: [Injector],
multi: false,
},
который использует функцию запуска:
const appConfigStartup = (injector: Injector) => async (): Promise<void> => {
const appConfigService = injector.get(AppConfigService);
const result = await appConfigService.load();
if (result) {
console.log('Application Config loaded');
} else {
console.log('Application Config not loaded');
}
};
При отсутствии чего-либо в компоненте приложения в консоли отображается сообщение "Конфигурация приложения загружена".
Когда я пытаюсь добавить новый параметр в конструктор:
@Inject(APP_CONFIG) private appConfig: AppConfig
Там написано:
Can't resolve all parameters for AppComponent: ([object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], [object Object], ?).
Я также пытался добавить поставщика в AppComponent без изменений.
Я подозреваю, что он пытается создать объект без запуска APP_INITIALIZER, поскольку сетевой вызов не выполняется.
Вероятно, я мог бы предоставить AppConfig непосредственно в качестве результата для Promise, но по устаревшим причинам я хотел иметь возможность использовать этот метод загрузки и предоставлять объект отдельно.
Но я точно не знаю, что здесь происходит.