承接上一篇文章,本文深入探討 Alexandria 智慧型借閱圖書館應用程式中,前後端資料傳輸的最佳實踐、分散式變更管理模式,以及離線操作的狀態同步機制。完整範例碼可從 GitHub 下載,包含 Backend、Client、Messages 三個專案。
分散式應用最常見的誤區是試圖在網路上傳遞領域實體。Alexandria 採用三種針對不同職責優化的模型:
Book、User 等,封裝業務邏輯與 NHibernate 映射,負責查詢與交易處理。BookDTO 等資料傳輸物件,僅攜帶序列化資料,無行為邏輯。BookModel 等,優化為 WPF/XAML 資料繫結與使用者互動設計。將職責拆分至不同模型,避免產生臃腫的「萬能物件」,讓各層專注核心關注點。物件包含資料與行為,跨網路傳輸只能傳遞資料,若在實體中混入業務邏輯,客戶端執行時將產生語義斷層與維護困境。
採用 明確命令 (如 AddBookToQueue, RemoveBookFromQueue) 取代隱含的 CRUD 更新。前端執行命令時:
MyQueueQuery, MyRecommendationsQuery) 以取得最新狀態。此設計解耦了命令與查詢 (CQRS 風格),前端無需在命令中處理回傳資料邏輯,彈性極高。
離線操作時,本地修改尚未同步至伺服器。Alexandria 採用 快取失效 機制:命令/查詢批次發送時,立即標記相關快取為過期。重新啟動應用程式時,不會顯示過期資料,而是等待伺服器回應後重新整理。此折衷方案適用於短暫離線場景;長期離線應用則需實作本地持久化模型。
後端訊息消費者 (ConsumerOf<T>) 僅負責:
user.AddToQueue(book))。業務邏輯集中於領域實體 (User.AddToQueue 同時處理隊列新增與推薦移除),而非分散在消費者中。此架構確保領域邏輯內聚,技術複雜度由基礎設施吸收。
刪除書籍時,前端僅移除隊列項目;後端則將書籍加回推薦清單。此差異在離線期間可見,但線上狀態下,伺服器回應到達後前端將同步修正。此為 最終一致性 典型表現,若操作需強一致性確認 (如修改信用卡資訊),則需採用「四階段確認模式」:編輯 → 待確認 → 成功/失敗回饋 → 確認/錯誤修正。
針對需伺服器驗證的操作 (如地址變更),前端採用 Caliburn 框架管理視圖模式切換:
Editable 副本。後端 UpdateAddressConsumer 回覆 UpdateDetailsResult (含成功旗標與錯誤訊息),前端消費者據此呼叫 CompleteEdit() 或 ErrorEdit() 完成狀態機流轉。
Alexandria 展示了以 NHibernate + Rhino Service Bus 建構分散式智慧型用戶端的完整架構:
此架構雖引入多個新概念,但產出的程式碼結構清晰、職責分明,長期維護性遠優於傳統 RPC/CRUD 架構。