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