facade包含四大exports:site-context.interface.ts(SiteContext)定义一个接口:import{Observable}from'rxjs';exportinterfaceSiteContext{getAll():Observable;getActive():Observable<字符串>;setActive(isocode:string);}从getAll可以推断,对于一个Context,是支持多个值的,只有一个值才能成为活跃值。base-site.service.ts(BaseSiteService)BaseSite的字段列表定义在site-context外层文件夹模型下:BaseSiteService类实现了SiteContext接口,即需要实现getAll等三个方法。构造函数,定义Store和SiteContextConfig两个依赖。后者向全局配置对象添加两个字段,context和urlParameters。前者来自@ngrx/store,带有类型参数:StateWithSiteContext.StateWithSiteContextStateWithSiteContext是一个接口:exportconstSITE_CONTEXT_FEATURE='siteContext';exportinterfaceStateWithSiteContext{[SITE_CONTEXT_FEATURE]:SiteContextState;}SiteContextState的定义:exportinterfaceSiteContextState::CurrenciesState;baseSite:BaseSiteState;}LanguagesState定义:exportinterfaceLanguagesState{entities:LanguagesEntities;activeLanguage:string;}反映了Context的数据结构、数据集和当前活跃值。LanguagesEntities定义:exportinterfaceLanguagesEntities{[isocode:string]:Language;}语言类型可以看作是ABAP结构:exportinterfaceLanguage{active?:boolean;等值代码?:字符串;名称?:字符串;nativeName?:string;}getActive从全局内存状态中提取活动站点:一一分析。SiteContextSelectors.getActiveBaseSite:一、SiteContextSelectors的来源:import{SiteContextSelectors}from'../store/selectors/index';查看selectors文件夹下的index.ts,这里导出了groupselector的全部内容,然后生成了withas一个别名,方便其他消费者调用。看一下getActiveBaseSite的定义,里面有5个关键点。对比其调用代码:(1)MemoizedSelector,说明这是一个使用内存进行结果缓存的Selector,与关键点3通过createSelector方法创建一致。(2)StateWithSiteContext,是Selector的类型参数,表示State的数据结构。该参数与构造函数中注入Store时传入的类型参数匹配。(3)createSelector:前面介绍过StateWithSiteContext,它是一个特性State,是所有State的起点。在我们的业务逻辑中,我们需要查询ActiveBaseSite,就要从这个起点出发。exportconstSITE_CONTEXT_FEATURE='siteContext';exportinterfaceStateWithSiteContext{[SITE_CONTEXT_FEATURE]:SiteContextState;}SiteContextState的定义:exportinterfaceSiteContextState{languages:LanguagesState;第一个参数是另一个新的Selector,负责从构造函数注入的Store的类型参数中返回SiteContextState。第二个参数是projector,负责从SiteContextState中投射出string类型的ActiveBaseSiteID:目前我们只有前四个关键点没有讨论,也就是createSelector的第一个参数,另一个Selector: