servicecurrentcy和language的实现细节都是持久化的。基址号Service还包含通过url设置context的实现类。共实施4组。base-site-initializer.ts(BaseSiteInitializer)首先这个类是InjectionTokenAPP_INITIALIZER的提供者,在应用初始化的时候执行。通过构造函数注入的参数,第一个参数来自facade文件夹下的Service实现,第二个来自与site-context同级的config文件夹。@Injectable({providedIn:'root'})exportclassBaseSiteInitializerimplementsOnDestroy{constructor(protectedbaseSiteService:BaseSiteService,protectedconfigInit:ConfigInitializerService){}initialize该方法加载默认值,由APP_INITIALIZER的provider调用。initialize():void{this.subscription=this.configInit.getStable('context').pipe(//TODO(#12351):<---明确插入此处SiteContextRoutesHandlerswitchMap(()=>this.setFallbackValue()))。订阅();}setFallbackValueprotectedsetFallbackValue():Observable{returnthis.configInit.getStable('context').pipe(tap((config:SiteContextConfig)=>this.setDefaultFromConfig(config)));}这里的this.configInit.getStable('context')留待来研究。setDefaultFromConfig从config的默认值设置ActiveBaseSite:}}我们可以从调试器观察运行时行为:调用所有APP_INITIALIZER提供者,包括本章介绍的BaseSiteInitializer的initialize方法:subscribefinally导致setDefaultFromConfig被调用:此时,context的所有值到位。currency-state-persistence.service.ts(CurrencyStatePersistenceService)注入的三个依赖项:exportclassCurrencyStatePersistenceService{constructor(protectedstatePersistenceService:StatePersistenceService,protectedcurrencyService:CurrencyService,protectedconfig:SiteContextConfig){}(1)从状态文件夹(2)来自site-context门面文件夹(3)是一个抽象类,包括urlParameters属性,类型为string[],以及[contextName:string]:string[]initSync这个方法调用state文件夹下的StatePersistenceService,传递key,state$和onRead三个参数。关于CurrencyService的isInitialized方法,我添加了config.log,两个打印都是true:onRead成功从??localstorage读取USD,但是没有进入代码第29行的IF分支,∵currencyService.isInitialized返回true:所以这里的setActive方法未实现。setActive方法由url解析触发:总结本文依次介绍SAP电商云SpartacusUIBaseSiteInitializer类的实现细节。此类主要用作APP_INITIALIZER提供程序的实现之一。useFactory的工厂函数initializeBaseSite,在这个工厂函数的实现中,通过依赖注入的方式注入了BaseSiteInitializer的实例,调用它的publicinitialize方法完成默认值的设置。