從 Web 應用轉向智慧型用戶端 (Smart Client) 開發時,常面臨資料存取、前後端通訊、離線同步等挑戰。本文系列將以線上借閱圖書館系統「Alexandria」為例,示範如何結合 NHibernate (O/RM) 與 Rhino Service Bus (訊息總線) 建構健壯的分散式智慧型用戶端應用。完整程式碼託管於 GitHub。
智慧型用戶端架構介於「胖用戶端/薄伺服器」與「薄用戶端/胖伺服器」之間:
若後端僅作資料存儲,建議改用 WCF RIA Services 或 WCF Data Services;若前端僅作顯示,則失去智慧型用戶端優勢 (離線、回應性、負載分擔)。
建構分散式系統必須正視 Peter Deutsch 的八大謬誤:網路可靠、零延遲、無限頻寬、網路安全、拓撲不變、單一管理員、零傳輸成本、同質網路。智慧型用戶端透過 本地快取 與 非同步訊息傳遞 緩解這些問題:快取提升回應性並支援離線;訊息佇列解耦發送與接收,容忍網路中斷與延遲。
拒絕 RPC 風格的細粒度遠端呼叫。前端啟動時發送 訊息批次 (如 MyBooksQuery, MyQueueQuery, MyRecommendationsQuery) 至後端,單次網路往返換取多組資料。Rhino Service Bus 基於單向佇列訊息交換,支援 Send (發送並忘記) 與 Reply (回覆發送者) 模式。
ConsumerOf<TMsg>,透過 IoC 容器 (Castle Windsor) 注入相依性 (如 ISession, IServiceBus)。AbstractBootStrapper,設定 NHibernate SessionFactory、訊息模組、相依性註冊。Session 管理:NHibernateMessageModule 在訊息到達時開啟 Session,處理完成時釋放。同一批次訊息共享 Session,自受惠於 NHibernate 一級快取 (避免重複查詢用戶實體)。
交易管理:由 Rhino Service Bus 使用 TransactionScope 包裹整個訊息批次,所有消費者操作隸屬同一交易。NHibernate 自動登記環境交易,開發者無需手寫交易代碼。
引入 持久化快取 (二進位序列化至磁碟) 作為訊息基礎設施一環:
ICacheableQuery) 時,攔截器先檢查快取,若命中即以快取資料觸發消費者邏輯,UI 立即顯示。ICacheableResponse) 到達時,正常處理並更新快取 (時間戳機制解決亂序)。此設計讓應用程式碼完全感知不到快取存在,重啟應用亦可離線運作,真正實現「間歇性連線」能力。
下篇將深入探討:資料傳輸最佳實踐 (DTO vs 領域模型)、分散式變更管理 (命令 vs CRUD)、離線狀態衝突解決、複雜操作確認模式。