typescript - Angular automatisk modulregistrering för global konfigurationstjänst
Jag arbetar på en Angular 16-applikation med flera resursmoduler med sina egna kataloger och routning. De är lazy-loaded. Jag vill skapa ett mönster för att automatiskt registrera nya modulkonfigurationer och använda en global konfigurationstjänst för navigering eller åtgärder på dessa resurser.
Till exempel:
- Min nya modul A har sin egen konfigurationsklass med konfigurationsobjekt.
- Jag klarade precis detta nya modul utan att göra något annat.
- Min applikation registrerar alla modulers konfigurationer vid start.
- Jag har en global konfigurationstjänst som innehåller alla dessa modulkonfigurationer.
- Jag kan använda dessa konfigurationer överallt i appen (t.ex. navigeringsobjekt, rutter, etc.)
För att uppnå detta försökte jag använda en abstrakt konfigurationsklass som anropar en registreringsmetod på tjänsten:
@Injectable({
providedIn: 'root',
})
class ModuleAResourceConfig extends ResourceConfig {
// module A specific configs
constructor() {
super();
}
}
abstract class ResourceConfig {
// sharedConfigElements
constructor() {
Inject(ResourceService).register(this);
}
}
/** global service */
class ResourceService {
resourceConfig: Record<ResourceConfigKey, ResourceConfig>
...
register(config: ResourceConfig): void {
// register the new config
}
För att registrera en konfiguration måste jag instansiera de specifika konfigurationsklasserna. För att göra detta använde jag leverantörer med en InjectionToken i appmodulen:
export const RESOURCE_CONFIG_TOKEN = new InjectionToken<ResourceConfig[]>('resourceConfigToken');
@NgModule({
declarations: [AppComponent],
imports: [
...
],
providers: [
{
provide: RESOURCE_CONFIG_TOKEN,
useClass: ModuleAResourceConfig,
multi: true,
},
{
provide: RESOURCE_CONFIG_TOKEN,
useClass: ModuleBResourceConfig,
multi: true,
},
...
],
bootstrap: [AppComponent],
})
export class AppModule {}
Först, Jag är inte säker på om det är den bästa metoden för att uppnå min förfrågan och jag tror inte att det är ett bra sätt. Det skulle vara väldigt coolt om jag kunde bli av med dessa AppModule-ändringar. Har du någonsin experimenterat med den här typen av arkitektur?