Iteration::two的基于Flex的開源項目-- Cairngorm store的學習筆記(小結)
Posted on 2006-04-05 13:51 云自無心水自閑 閱讀(2137) 評論(0) 編輯 收藏 所屬分類: Flex 、Cairngorm 、Flex2這一段時間在 Cairngorm上搭建了一個小項目, 順便小結一下開發過程:
1. 首先規劃構建View, 將一個應用的界面, 分成適當的Mxml Component
2. view中必然涉及的需要數據的綁定, 將組件需要的數據都集中到ModelLocator中.
3. 設計事件(CairngormEvent), 也就是與用戶交互的過程中以及系統運轉的過程中會需要派發哪些事件,
需要注意的一點是, Cairngorm中Flex事件也需要轉化成CairngormEvent
4. 設計事件的處理函數, 也就是命令. 在FrontControl中對事件和命令進行注冊.
5. 命令中通過代理去調用服務.
5. 設計代理類, 在代理類中調用服務
5. 設計命令中涉及的服務(最可能的是與數據庫的交互), 并添加相應的配置
6. 設計服務中需要使用的ValueObject
7. 命令中如果需要對視圖組件數據進行存取, 需要通過ViewHelper來完成, 設計相應的ViewHelper.
同時在mxml中對viewHelper進行注冊.
補充說明: 事件的產生不一定全部是與用戶交互的結果, 也就是說不全是由View產生的.
當然大部分的事件(比如用戶點擊了保存按鈕)是這樣產生的.
在命令中也可以產生命令, 典型的就是SequenceCommand, 應用中可以把一個事件的處理分成幾個步驟來完成,
完成第1個步驟后怎么通知第2個步驟開始呢, 當然還是繼續派發事件啦. 在SequenceCommand在類中,
把派發事件封裝了一下, 給出了一個executeNextCommand()可以直接調用.
不過在這里我也遇到了一個問題, 直接使用SequenceCommand的executeNextCommand()并不管用.
好象dispatchEvent并沒有效果, 我后來是自己修改了代碼, 使用Application.application.dispatchEvent才解決問題的.
Cairngorm的優點:
一. 實現了比較徹底的解耦
1. 事件機制, 對用戶的響應(比如點擊保存按鈕), 并不是直接從View中抓取數據, 然后New一個類, 調用這個類的某個方法,
將數據保存到數據庫中, 而只是簡單地派發一個事件, 具體事件由誰來響應, 如何處理對他來說是透明不可見的.
2. Locator模式, Cairngorm中service, view, model的獲取都是通過Locator的,
也就是說系統其他部分對于service, view, model只需要知道其ID就夠了, 其內部實現等待細節都是不需要知道的.
舉個例子, 傳統的方法: 你要找一個叫張三的人幫你干一件事, 你需要知道張三長什么樣,
然后在一個坐著10個人的大辦公室里找到他, 告訴他你的要求.
而現在在這個大辦公室的門口多了一個前臺小姐, 你只需要告訴這個小姐,我要找張三, 然后她會幫你去找,
你根本不需要知道張三的模樣.
RIA的優點: 由于Flex的原因, 系統處理是異步的.
比如, 你請求了一個比較耗時的數據庫讀取操作, 請求發出后, 你就可以進行其他操作了, 服務結束會產生相應事件,
然后由Command進行后續處理, 最后引發頁面數據更新.
1. 首先規劃構建View, 將一個應用的界面, 分成適當的Mxml Component
2. view中必然涉及的需要數據的綁定, 將組件需要的數據都集中到ModelLocator中.
3. 設計事件(CairngormEvent), 也就是與用戶交互的過程中以及系統運轉的過程中會需要派發哪些事件,
需要注意的一點是, Cairngorm中Flex事件也需要轉化成CairngormEvent
4. 設計事件的處理函數, 也就是命令. 在FrontControl中對事件和命令進行注冊.
5. 命令中通過代理去調用服務.
5. 設計代理類, 在代理類中調用服務
5. 設計命令中涉及的服務(最可能的是與數據庫的交互), 并添加相應的配置
6. 設計服務中需要使用的ValueObject
7. 命令中如果需要對視圖組件數據進行存取, 需要通過ViewHelper來完成, 設計相應的ViewHelper.
同時在mxml中對viewHelper進行注冊.
補充說明: 事件的產生不一定全部是與用戶交互的結果, 也就是說不全是由View產生的.
當然大部分的事件(比如用戶點擊了保存按鈕)是這樣產生的.
在命令中也可以產生命令, 典型的就是SequenceCommand, 應用中可以把一個事件的處理分成幾個步驟來完成,
完成第1個步驟后怎么通知第2個步驟開始呢, 當然還是繼續派發事件啦. 在SequenceCommand在類中,
把派發事件封裝了一下, 給出了一個executeNextCommand()可以直接調用.
不過在這里我也遇到了一個問題, 直接使用SequenceCommand的executeNextCommand()并不管用.
好象dispatchEvent并沒有效果, 我后來是自己修改了代碼, 使用Application.application.dispatchEvent才解決問題的.
Cairngorm的優點:
一. 實現了比較徹底的解耦
1. 事件機制, 對用戶的響應(比如點擊保存按鈕), 并不是直接從View中抓取數據, 然后New一個類, 調用這個類的某個方法,
將數據保存到數據庫中, 而只是簡單地派發一個事件, 具體事件由誰來響應, 如何處理對他來說是透明不可見的.
2. Locator模式, Cairngorm中service, view, model的獲取都是通過Locator的,
也就是說系統其他部分對于service, view, model只需要知道其ID就夠了, 其內部實現等待細節都是不需要知道的.
舉個例子, 傳統的方法: 你要找一個叫張三的人幫你干一件事, 你需要知道張三長什么樣,
然后在一個坐著10個人的大辦公室里找到他, 告訴他你的要求.
而現在在這個大辦公室的門口多了一個前臺小姐, 你只需要告訴這個小姐,我要找張三, 然后她會幫你去找,
你根本不需要知道張三的模樣.
RIA的優點: 由于Flex的原因, 系統處理是異步的.
比如, 你請求了一個比較耗時的數據庫讀取操作, 請求發出后, 你就可以進行其他操作了, 服務結束會產生相應事件,
然后由Command進行后續處理, 最后引發頁面數據更新.