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