山海萬(wàn)靈 HarmonyOS 文化知識(shí)實(shí)戰(zhàn)(07):Repository Factory 的 HTTP/Mock/Fallback 切換
文化圖鑒的首頁(yè)、探索頁(yè)和館長(zhǎng)講解頁(yè)都要讀取神獸、區(qū)域、展廳和學(xué)習(xí)卡。開(kāi)發(fā)環(huán)境切換到 Mock 服務(wù)或網(wǎng)絡(luò)短暫不可用時(shí)如果頁(yè)面直接判斷接口地址很容易出現(xiàn)一套在線 UI、一套離線 UI。山海萬(wàn)靈把這種差異收斂在 Repository Factory 中頁(yè)面始終面向同一個(gè)ShanhaiRepository契約工作。一、頁(yè)面只取得領(lǐng)域倉(cāng)庫(kù)ShanhaiAppViewModelFactory創(chuàng)建 ViewModel 時(shí)調(diào)用createShanhaiRepository()。頁(yè)面和 ViewModel 不直接構(gòu)造 HTTP 客戶端也不關(guān)心當(dāng)前數(shù)據(jù)來(lái)自服務(wù)還是內(nèi)置資料它們只調(diào)用loadBootstrap、listBeasts、listRegions、explainBeast等領(lǐng)域方法。export function createShanhaiRepository(): ShanhaiRepository { return new FallbackShanhaiRepository( new HttpShanhaiRepository(), new MockShanhaiRepository() ) } export function createShanhaiAppViewModel(): ShanhaiAppViewModel { return new ShanhaiAppViewModel( createShanhaiRepository(), localProgressRepository, userProfileRepository ) }這種邊界讓 UI 接收的始終是神獸、區(qū)域、展廳和學(xué)習(xí)卡等領(lǐng)域?qū)ο?。服?wù)端字段調(diào)整、Mock 數(shù)據(jù)補(bǔ)充和網(wǎng)絡(luò)異常處理都留在倉(cāng)庫(kù)層頁(yè)面不會(huì)因此增加分支。二、首次引導(dǎo)決定主通道FallbackShanhaiRepository把 HTTP Repository 作為 primary把 Mock Repository 作為 fallback。應(yīng)用首次加載時(shí)先請(qǐng)求loadBootstrap()成功后將primaryReady置為真后續(xù)的目錄和概覽讀取走 HTTP 通道。請(qǐng)求失敗則立即讀取內(nèi)置 Mock 數(shù)據(jù)應(yīng)用仍能打開(kāi)圖鑒和探索入口。async loadBootstrap(): PromiseShanhaiBootstrap { try { const bootstrap await this.primary.loadBootstrap() this.primaryReady true return bootstrap } catch (_) { this.primaryReady false return this.fallback.loadBootstrap() } } isUsingLocalFallback(): boolean { return !this.primaryReady }項(xiàng)目自帶 Mock API 聯(lián)通后首頁(yè)會(huì)回讀“在線同步 / 內(nèi)容與圖譜已同步”。這個(gè)提示來(lái)自同一套啟動(dòng)數(shù)據(jù)鏈路說(shuō)明當(dāng)前啟動(dòng)流程已經(jīng)取得 primary 返回的內(nèi)容投影。三、目錄讀取與細(xì)粒度動(dòng)作分開(kāi)處理目錄類(lèi)方法包括listBeasts、listRegions、listHalls、listAiGuides和getOverview。當(dāng)首次引導(dǎo)已經(jīng)建立 HTTP 主通道時(shí)這些方法沿用該通道首次引導(dǎo)未成功時(shí)則統(tǒng)一使用 Mock 數(shù)據(jù)。這樣首頁(yè)所需的基礎(chǔ)目錄在一次引導(dǎo)后有明確的數(shù)據(jù)來(lái)源。場(chǎng)景倉(cāng)庫(kù)選擇頁(yè)面表現(xiàn)bootstrap 請(qǐng)求成功HTTP Repository顯示在線同步加載遠(yuǎn)端目錄和概覽bootstrap 請(qǐng)求失敗Mock Repository保留本地圖鑒目錄與探索入口講解、學(xué)習(xí)卡、圖譜推薦請(qǐng)求失敗自動(dòng)回退到 Mock Repository展示可讀的本地講解或?qū)W習(xí)卡不讓目標(biāo)頁(yè)面白屏四、交互型請(qǐng)求具備二次回退神獸講解、學(xué)習(xí)卡、圖譜推薦和發(fā)現(xiàn)動(dòng)作屬于進(jìn)入頁(yè)面后的細(xì)粒度請(qǐng)求。這些方法會(huì)在 HTTP 調(diào)用失敗時(shí)把primaryReady改回假并改由 Mock Repository 返回同形狀的領(lǐng)域?qū)ο?。?yè)面不用捕獲網(wǎng)絡(luò)異常來(lái)拼裝替代內(nèi)容。async explainBeast(beastId: string, topic: CuratorGuideTopic): PromiseAiGuideItem { if (this.primaryReady) { try { return await this.primary.explainBeast(beastId, topic) } catch (_) { this.primaryReady false } } return this.fallback.explainBeast(beastId, topic) } async listGraphRecommendations(nodeType: string, nodeId: string) { if (this.primaryReady) { try { return await this.primary.listGraphRecommendations(nodeType, nodeId) } catch (_) { this.primaryReady false } } return this.fallback.listGraphRecommendations(nodeType, nodeId) }回退狀態(tài)會(huì)保留到下一次引導(dǎo)成功為止。用戶繼續(xù)閱讀時(shí)頁(yè)面看到的是同一類(lèi)神獸講解、學(xué)習(xí)卡或推薦項(xiàng)而不是錯(cuò)誤頁(yè)這也是 Repository 契約統(tǒng)一的直接收益。五、HTTP 映射層消化服務(wù)端字段HTTP Repository 負(fù)責(zé)把接口響應(yīng)映射為ShanhaiRepository使用的模型。新增字段或字段命名變化先在這里歸一化再由 Mock Repository 提供同一模型的本地版本。ViewModel 不依賴原始 JSON 字段因此在線數(shù)據(jù)與 Mock 數(shù)據(jù)能使用同一套列表、詳情和推薦組件。這條約束也明確了邊界業(yè)務(wù)頁(yè)只消費(fèi)已經(jīng)映射的領(lǐng)域?qū)ο缶W(wǎng)絡(luò)地址、請(qǐng)求失敗和服務(wù)端字段兼容不進(jìn)入 ArkUI 頁(yè)面。需要接入新的服務(wù)時(shí)先補(bǔ)齊 HTTP 映射和 Mock 對(duì)照數(shù)據(jù)再讓頁(yè)面使用新增的領(lǐng)域字段。以神獸詳情為例HTTP 數(shù)據(jù)除了基礎(chǔ)名稱和描述還會(huì)映射區(qū)域、展廳、學(xué)習(xí)卡與圖譜關(guān)聯(lián)。Mock 數(shù)據(jù)采用相同的BeastItem、AiGuideItem和GraphRecommendationItem形狀詳情頁(yè)只按這些模型渲染。這樣服務(wù)端將嵌套字段改為可選字段時(shí)可以在 HTTP Repository 中補(bǔ)默認(rèn)值或兼容轉(zhuǎn)換頁(yè)面沒(méi)有必要根據(jù)接口版本再增加條件判斷。async listLearningCards(beastId: string): PromiseBeastLearningCard[] { if (this.primaryReady) { try { return await this.primary.listLearningCards(beastId) } catch (_) { this.primaryReady false } } return this.fallback.listLearningCards(beastId) }這里的回退邊界也應(yīng)保持明確首次loadBootstrap失敗時(shí)本地目錄成為啟動(dòng)數(shù)據(jù)已經(jīng)成功建立主通道后講解、學(xué)習(xí)卡、圖譜推薦和發(fā)現(xiàn)動(dòng)作會(huì)捕獲單項(xiàng)失敗并回退。目錄讀取不在這個(gè)細(xì)粒度捕獲列表中因而其異常策略不能由頁(yè)面臨時(shí)補(bǔ)齊。新增領(lǐng)域方法時(shí)應(yīng)先決定它屬于啟動(dòng)目錄還是交互動(dòng)作再選擇對(duì)應(yīng)的失敗路徑。六、驗(yàn)收動(dòng)作可先啟動(dòng)項(xiàng)目自帶的 Mock API再啟動(dòng)應(yīng)用并進(jìn)入首頁(yè)確認(rèn)在線同步提示與圖鑒、探索入口都已加載。隨后進(jìn)入神獸詳情并觸發(fā)講解、學(xué)習(xí)卡或圖譜推薦當(dāng)交互請(qǐng)求不可用時(shí)頁(yè)面應(yīng)繼續(xù)顯示本地可讀內(nèi)容?;謴?fù)服務(wù)后重新引導(dǎo)目錄讀取重新進(jìn)入 HTTP 通道。驗(yàn)收時(shí)關(guān)注的是同一條操作鏈上的可觀察結(jié)果啟動(dòng)成功后首頁(yè)展示在線同步狀態(tài)進(jìn)入詳情后講解或?qū)W習(xí)卡能夠渲染人為使該交互請(qǐng)求失敗后仍返回本地同類(lèi)型內(nèi)容重新完成啟動(dòng)引導(dǎo)后狀態(tài)回到 HTTP 主通道。不要把其他頁(yè)面的空狀態(tài)當(dāng)作回退成功也不要把舊安裝包的畫(huà)面與新構(gòu)建包混在一次結(jié)果中。對(duì)于服務(wù)端演進(jìn)可增加一組 Mock 契約測(cè)試給 HTTP 映射層一個(gè)字段缺失、空數(shù)組和未知枚舉值的響應(yīng)確認(rèn)輸出仍能構(gòu)造領(lǐng)域模型再對(duì) Mock Repository 做同一接口斷言。兩組結(jié)果一致才能讓頁(yè)面組件在切換數(shù)據(jù)源后繼續(xù)按既有模型工作。網(wǎng)絡(luò)請(qǐng)求接口的配置與調(diào)用方式可參考 HarmonyOS HTTP 請(qǐng)求指南。七、把數(shù)據(jù)源切換限制在一個(gè)入口Repository Factory 把 HTTP、Mock 與 Fallback 的組合固定在應(yīng)用入口ViewModel 取得的是穩(wěn)定的領(lǐng)域接口。首次引導(dǎo)負(fù)責(zé)確定主通道交互型請(qǐng)求負(fù)責(zé)在失敗時(shí)回退本地?cái)?shù)據(jù)負(fù)責(zé)維持圖鑒可讀性。后續(xù)增加新接口時(shí)只需擴(kuò)展 Repository 契約、HTTP 映射與 Mock 對(duì)照數(shù)據(jù)頁(yè)面結(jié)構(gòu)無(wú)需為數(shù)據(jù)源切換再寫(xiě)一遍。

相關(guān)新聞

Spring Boot 3.x原生編譯:?jiǎn)?dòng)速度提升98%的實(shí)戰(zhàn)指南

Spring Boot 3.x原生編譯:?jiǎn)?dòng)速度提升98%的實(shí)戰(zhàn)指南

1. Spring Boot 3.x 原生編譯革命:徹底解決啟動(dòng)慢的終極方案 Spring Boot 應(yīng)用啟動(dòng)速度慢的問(wèn)題一直困擾著開(kāi)發(fā)者,特別是當(dāng)項(xiàng)目規(guī)模增長(zhǎng)到一定程度后,冷啟動(dòng)時(shí)間動(dòng)輒10秒以上。傳統(tǒng)優(yōu)化手段如精簡(jiǎn)依賴、延遲初始化等往往收效有限。而GraalVM原…

2026/8/4 11:53:07 閱讀更多
Linux命令行高效操作技巧與實(shí)戰(zhàn)優(yōu)化指南

Linux命令行高效操作技巧與實(shí)戰(zhàn)優(yōu)化指南

1. 命令行效率提升的核心價(jià)值在Linux系統(tǒng)管理領(lǐng)域,命令行操作效率直接決定了運(yùn)維人員的工作產(chǎn)出。RH134認(rèn)證課程將命令行效率作為開(kāi)篇章節(jié),正是因?yàn)檫@是系統(tǒng)管理員日常工作中最基礎(chǔ)卻最容易被忽視的核心能力。我見(jiàn)過(guò)太多工程師在服務(wù)器前反復(fù)輸入相似命令…

2026/8/4 11:53:07 閱讀更多
JVM調(diào)優(yōu)實(shí)戰(zhàn):核心邏輯與參數(shù)配置詳解

JVM調(diào)優(yōu)實(shí)戰(zhàn):核心邏輯與參數(shù)配置詳解

1. JVM調(diào)優(yōu)的核心邏輯與價(jià)值定位 當(dāng)Java應(yīng)用的吞吐量下降或響應(yīng)時(shí)間延長(zhǎng)時(shí),90%的情況都與JVM運(yùn)行狀態(tài)直接相關(guān)。我在電商大促期間處理過(guò)每秒3萬(wàn)訂單的系統(tǒng)崩潰,最終發(fā)現(xiàn)是年輕代尺寸設(shè)置不當(dāng)導(dǎo)致GC線程持續(xù)占滿CPU。JVM調(diào)優(yōu)不是玄學(xué),而是建立…

2026/8/4 11:53:07 閱讀更多
Rust實(shí)現(xiàn)安全多方計(jì)算:醫(yī)療金融數(shù)據(jù)隱私保護(hù)實(shí)戰(zhàn)

Rust實(shí)現(xiàn)安全多方計(jì)算:醫(yī)療金融數(shù)據(jù)隱私保護(hù)實(shí)戰(zhàn)

1. 項(xiàng)目概述:當(dāng)Rust遇上安全多方計(jì)算三年前我第一次接觸醫(yī)療機(jī)構(gòu)的聯(lián)合數(shù)據(jù)分析需求時(shí),就意識(shí)到傳統(tǒng)的數(shù)據(jù)集中處理模式存在根本性缺陷。某三甲醫(yī)院想與同城其他機(jī)構(gòu)合作研究慢性病發(fā)展趨勢(shì),但各方都拒絕共享原始數(shù)據(jù)——這直接催生了我對(duì)安全…

2026/8/4 13:13:11 閱讀更多
AI編程-- Codex ,要用哪些模型和推理強(qiáng)度

AI編程-- Codex ,要用哪些模型和推理強(qiáng)度

Codex模型 模型:Sol、 Terra、Luna, 官方將 Sol 定位為復(fù)雜開(kāi)放任務(wù)、Terra 為日常全能、Luna 為明確可重復(fù)任務(wù)。 Sol:復(fù)雜、模糊、需要判斷和打磨的任務(wù)。不確定時(shí)直接選Sol。 例如:大型重構(gòu)、疑難 Bug、架構(gòu)設(shè)計(jì)、代碼審查、…

2026/8/4 13:13:11 閱讀更多
華為P20開(kāi)機(jī)故障自救指南:從強(qiáng)制重啟到Recovery修復(fù)全解析

華為P20開(kāi)機(jī)故障自救指南:從強(qiáng)制重啟到Recovery修復(fù)全解析

如果你的華為P20手機(jī)突然無(wú)法開(kāi)機(jī),或者卡在開(kāi)機(jī)畫(huà)面,先別急著去維修店。這很可能不是一個(gè)硬件問(wèn)題,而是一個(gè)可以通過(guò)簡(jiǎn)單操作解決的軟件或系統(tǒng)故障。很多用戶遇到這種情況會(huì)感到焦慮,擔(dān)心手機(jī)變“磚”,但實(shí)際上&#x…

2026/8/4 13:13:11 閱讀更多
大模型JSON輸出不穩(wěn)定?從提示詞到后處理的完整工程化解決方案

大模型JSON輸出不穩(wěn)定?從提示詞到后處理的完整工程化解決方案

在實(shí)際 AI 應(yīng)用開(kāi)發(fā)中,無(wú)論是構(gòu)建智能 Agent 還是處理結(jié)構(gòu)化數(shù)據(jù),讓大語(yǔ)言模型穩(wěn)定、準(zhǔn)確地輸出 JSON 格式都是一個(gè)高頻且棘手的需求。模型可能輸出不完整的 JSON、包含多余的解釋文本,或者在復(fù)雜嵌套時(shí)出現(xiàn)格式錯(cuò)誤,這些都會(huì)導(dǎo)致…

2026/8/4 13:13:11 閱讀更多
藍(lán)牙技術(shù)全景指南:從無(wú)線鏈路、協(xié)議棧到產(chǎn)品量產(chǎn)

藍(lán)牙技術(shù)全景指南:從無(wú)線鏈路、協(xié)議棧到產(chǎn)品量產(chǎn)

藍(lán)牙看似是一個(gè)人人熟悉的開(kāi)關(guān),工程上卻是一組跨度很大的技術(shù):無(wú)線電、鏈路控制、主機(jī)協(xié)議、設(shè)備模型、安全、音頻、組網(wǎng)、定位、合規(guī)與量產(chǎn)測(cè)試,任何一層的誤判都可能在產(chǎn)品后期變成互操作故障。最常見(jiàn)的問(wèn)題不是代碼少寫(xiě)了一行,…

2026/8/4 13:03:11 閱讀更多
清華大學(xué)重磅EST:植物自導(dǎo)電閃蒸焦耳熱600°C/2600°C兩步法!稀土超積累植物秒級(jí)轉(zhuǎn)化為CeO?-石墨烯電催化劑!

清華大學(xué)重磅EST:植物自導(dǎo)電閃蒸焦耳熱600°C/2600°C兩步法!稀土超積累植物秒級(jí)轉(zhuǎn)化為CeO?-石墨烯電催化劑!

通訊作者:鄧兵、劉建國(guó)通訊單位:清華大學(xué)DOI:https://doi.org/10.1021/acs.est.6c00603研究背景稀土元素(REEs)是清潔能源技術(shù)與電子器件不可或缺的核心原料,然而傳統(tǒng)提取方式依賴能耗高、排放大的采礦與強(qiáng)…

2026/8/4 0:01:30 閱讀更多
貴州師范大學(xué)JCIS:混合焓調(diào)控設(shè)計(jì)PtCoNiCuCr高熵合金!ORR半波電位0.89 V/質(zhì)量活性2.4倍Pt/C!

貴州師范大學(xué)JCIS:混合焓調(diào)控設(shè)計(jì)PtCoNiCuCr高熵合金!ORR半波電位0.89 V/質(zhì)量活性2.4倍Pt/C!

研究背景質(zhì)子交換膜燃料電池(PEMFCs)因其高能量轉(zhuǎn)換效率和清潔零排放特性備受關(guān)注,然而陰極氧還原反應(yīng)(ORR)動(dòng)力學(xué)遲緩、鉑催化劑成本高昂且耐久性不足的問(wèn)題嚴(yán)重制約了其商業(yè)化進(jìn)程。將 Pt 與 3d 過(guò)渡金屬合金化可調(diào)控…

2026/8/4 0:01:30 閱讀更多
福州大學(xué)/清華大學(xué)AFM:脈沖焦耳熱900°C/1s合成Co?Cu催化劑,寬電位NH?法拉第效率~100%,MEA穩(wěn)定300h

福州大學(xué)/清華大學(xué)AFM:脈沖焦耳熱900°C/1s合成Co?Cu催化劑,寬電位NH?法拉第效率~100%,MEA穩(wěn)定300h

通訊作者:萬(wàn)宇馳、張久俊、呂瑞濤通訊單位:福州大學(xué) 、清華大學(xué)DOI:https://doi.org/10.1002/adfm.76112核心導(dǎo)讀:本文提出"分步升級(jí)"廢硝酸鹽處理新路線——利用廢水中的金屬離子經(jīng)快速焦耳熱(40V&#xff…

2026/8/4 0:01:30 閱讀更多
MoneyPrinterPlus實(shí)戰(zhàn)指南:AI視頻批量生成與自動(dòng)化發(fā)布完整解決方案

MoneyPrinterPlus實(shí)戰(zhàn)指南:AI視頻批量生成與自動(dòng)化發(fā)布完整解決方案

MoneyPrinterPlus實(shí)戰(zhàn)指南:AI視頻批量生成與自動(dòng)化發(fā)布完整解決方案 【免費(fèi)下載鏈接】MoneyPrinterPlus AI一鍵批量生成各類(lèi)短視頻,自動(dòng)批量混剪短視頻,自動(dòng)把視頻發(fā)布到抖音,快手,小紅書(shū),視頻號(hào)上,賺錢(qián)從來(lái)沒(méi)有這么容易過(guò)! 支持本地語(yǔ)音模型chatTTS,fasterwhisper,…

2026/8/4 13:11:34 閱讀更多
3分鐘搞定!QQ空間歷史說(shuō)說(shuō)完整備份終極指南

3分鐘搞定!QQ空間歷史說(shuō)說(shuō)完整備份終極指南

3分鐘搞定!QQ空間歷史說(shuō)說(shuō)完整備份終極指南 【免費(fèi)下載鏈接】GetQzonehistory 獲取QQ空間發(fā)布的歷史說(shuō)說(shuō) 項(xiàng)目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 你是否曾想過(guò),那些年發(fā)過(guò)的QQ空間說(shuō)說(shuō),那些記錄青春的文字…

2026/8/4 13:10:06 閱讀更多
AMAT 0100-02186 I/O 分配 PCB

AMAT 0100-02186 I/O 分配 PCB

AMAT 0100-02186 I/O分配PCB板是應(yīng)用材料(Applied Materials)公司生產(chǎn)的一款用于半導(dǎo)體設(shè)備的I/O信號(hào)分配電路板。該型號(hào)(0100-02186)的核心特點(diǎn)如下:專(zhuān)用于Endura等半導(dǎo)體工藝腔室。集成信號(hào)路由與分配功能。連接控制…

2026/8/3 19:34:52 閱讀更多
Nissei Corp FFMN-32L-10-T0 40AX 三相異步電動(dòng)機(jī)

Nissei Corp FFMN-32L-10-T0 40AX 三相異步電動(dòng)機(jī)

Nissei Corp FFMN-32L-10-T0 40AX 三相異步電動(dòng)機(jī)是日本日清(Nissei)品牌的一款工業(yè)用三相異步電機(jī),適用于自動(dòng)化設(shè)備及通用機(jī)械驅(qū)動(dòng)。該型號(hào)(FFMN-32L-10-T0 40AX)的核心特點(diǎn)如下:三相交流異步電動(dòng)機(jī)。額定…

2026/8/3 19:34:54 閱讀更多