Unity應用架構設計 ViewModel之間實現共享資料
閱讀目錄
JavaScript中的原型鏈
為ViewModel構建繼承關係
小結
對於客戶端應用程式而言,單頁應用程式(Single Page Application)是最常見的表現形式。有經驗的開發人員往往會把一個View分解多個SubView。那麼,如何在多個SubView之間 『共享資料』 是一個很棘手的事情。又因為ViewModel才是真正為View提供資料來源,所以本質上『共享資料』指的是多個ViewModel之間共享同一塊資料控制元件。
JavaScript中的原型鏈
談到『共享』兩字,腦海裡跳出第一個印象就是『繼承』。對吧,因為你是父母的孩子,所以理所當然你可以和父母共享家中的一切。所以『共享』的前提,就是構建一個『繼承鏈』,也就是JavaScript中的『原型鏈』。
那麼JavaScript是怎樣實現原型鏈呢?有經驗的JavaScript程式設計師想必早就記的滾瓜爛熟了——透過內建屬性 __proto__ 來實現。
所以ViewModel之間『共享資料』的核心就是如何去實現一個繼承鏈,如下所示:
為ViewModel構建繼承關係
有了上述的分析之後,只要仿照JavaScript的 __proto__ 的實現,我們對所有ViewModel的基類ViewModelBase新增一個ParentViewModel 屬性,它代表當前ViewModel的父親物件。
public class ViewModelBase { public ViewModelBase ParentViewModel { get; set; } //... }
接著我參考了WPF中是怎樣獲取父ViewModel當中的資料:
Binding="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, Path=DataContext.ParentViewModelProperty}
可以看到透過 FindAncestor 方法,去指定 AncestorType 型別的上層物件中獲取資料。
所以,我為ViewModelBase 增加一個擴充套件方法,可以透過繼承鏈實現從指定的祖先物件獲取資料。
public static IEnumerableAncestors (this ViewModelBase origin) where T : ViewModelBase { if (origin==null) { yield break; } var parentViewModel = origin.ParentViewModel; while (parentViewModel!=null) { var castedViewModel = parentViewModel as T; if (castedViewModel != null) { yield return castedViewModel; } parentViewModel = parentViewModel.ParentViewModel; } }
對應在ViewModel中,可以透過 Ancestors擴充套件方法獲取上層物件的資料
var ancestors = this.Ancestors();
小結
本篇文章介紹了怎樣在ViewModel之間共享資料,實際上解決方案是非常簡單的,人為的構造了一個繼承鏈並隨著繼承鏈往上找,總是能找到希望獲取到的資料。類似與JavaScript中的原型鏈,維護了一種至上而下的父子關係。
原始碼託管在Github上,點選此瞭解
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/506/viewspace-2800309/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Unity應用架構設計(5)——ViewModel之間如何共享資料Unity應用架構View
- Unity應用架構設計(2)——使用中介者模式解耦ViewModel之間通訊Unity應用架構模式解耦View
- Unity應用架構設計(6)——設計動態資料集合ObservableListUnity應用架構
- Unity應用架構設計(8)——使用ServiceLocator實現物件的注入Unity應用架構物件
- Unity應用架構設計(12)——AOP思想的實踐Unity應用架構
- Unity應用架構設計oC工廠理念先行Unity應用架構
- Unity應用架構設計(1)—— MVVM 模式的設計和實施(Part 1)Unity應用架構MVVM模式
- Unity應用架構設計(1)—— MVVM 模式的設計和實施(Part 2)Unity應用架構MVVM模式
- 用react-redux實現react元件之間資料共享ReactRedux元件
- Unity應用架構設計(7)——IoC工廠理念先行Unity應用架構
- Unity應用架構設計(9)——構建統一的 RepositoryUnity應用架構
- 架構設計之資料分片架構
- Android應用架構之MVP實現Android應用架構MVP
- [譯] 在 Laravel 應用程式之間共享資料庫Laravel資料庫
- Unity應用架構設計(4)——設計可複用的SubView和SubViewModel(Part 1)Unity應用架構View
- iOS KeyChain 應用間共享資料iOSAI
- .NET應用架構設計—重新認識分層架構(現代企業級應用分層架構核心設計要素)應用架構
- 應用架構圖的設計應用架構
- React應用架構設計指南React應用架構
- SaaS架構:應用服務、應用結構設計架構
- 利用Docker輕鬆實現雲原生應用-高可用架構設計Docker架構
- 剖析 Android 架構元件之 ViewModelAndroid架構元件View
- iOS應用架構談:架構設計的方法論iOS應用架構
- 初學 Android 架構元件之 ViewModelAndroid架構元件View
- iOS應用架構談(一):架構設計的方法論iOS應用架構
- 架構之:資料流架構架構
- 主流資料庫架構設計資料庫架構
- Android 不同應用通過SharedPreference實現共享資料Android
- React Native App應用架構設計React NativeAPP應用架構
- 論軟體架構設計及應用架構
- fragment之間相互傳資料、共享資料Fragment
- 百萬年薪架構師之路:談應用系統架構設計架構
- 總結 - 設計模式,企業應用架構模式,架構模式設計模式應用架構
- 設計,架構,框架之間是什麼關係?架構框架
- 資料脫敏大資料架構設計大資料架構
- MySQL資料庫實現高可用架構之MHA的實戰MySql資料庫架構
- 架構設計之架構的演變架構
- 架構設計:資料服務系統0到1落地實現方案架構