Posted on 2007-01-14 17:04
canonical 閱讀(1095)
評(píng)論(2) 編輯 收藏 所屬分類:
設(shè)計(jì)理論
??? 目前的AOP(Aspect Oriented Programming)技術(shù)雖然以動(dòng)態(tài)代碼織入為核心,但是這種織入仍然是一次性的。一般在系統(tǒng)構(gòu)造的時(shí)候(例如ClassLoader裝載Class的時(shí)候)實(shí)現(xiàn)類和成員函數(shù)的增強(qiáng)。此后在運(yùn)行時(shí)刻代碼結(jié)構(gòu)是固定的而不再發(fā)生變化。但是在真正的業(yè)務(wù)處理過(guò)程中,我們?cè)诓煌膽?yīng)用場(chǎng)景下可能要求織入不同的Aspect。例如基本的權(quán)限Aspect, 如果在不同的應(yīng)用場(chǎng)景有不同的權(quán)限設(shè)定,則我們顯然希望進(jìn)入一個(gè)確定的操作場(chǎng)景的時(shí)候就指定一整套的權(quán)限策略,而不是在每個(gè)函數(shù)調(diào)用時(shí)刻寫(xiě)上一大堆的if/else(這種分離的條件判斷正是AOP試圖從結(jié)構(gòu)上消除的)。
??? 為了實(shí)現(xiàn)AOP的二級(jí)動(dòng)態(tài)化,我們首先需要約定一些公共標(biāo)記(坐標(biāo)),便于在標(biāo)記處插入Aspect Container, 其次我們需要在系統(tǒng)中建立一個(gè)隱蔽的信道,可以通過(guò)該信道傳遞一個(gè)標(biāo)志符(Aspect的id),用于在各處選擇特定的Aspect. 建立這種動(dòng)態(tài)特性之后,我們就可以據(jù)此發(fā)展出Aspect組的概念,并實(shí)現(xiàn)Aspect組之間的繼承關(guān)系等高階結(jié)構(gòu),從而最大限度的限制程序結(jié)構(gòu)的分散化。
??? Witrix平臺(tái)的BizFlow設(shè)計(jì)在概念上可以看作是AOP的一種二級(jí)動(dòng)態(tài)化織入設(shè)計(jì),它通過(guò)$bizId這一特定參數(shù)來(lái)選擇織入的Biz。一個(gè)BizFlow對(duì)象是一組Biz(Aspect)的集合, BizFlow可以通過(guò)extends機(jī)制實(shí)現(xiàn)集合之間的合并等(BizFlow實(shí)現(xiàn)的合并策略其實(shí)是非常復(fù)雜的)。一個(gè)簡(jiǎn)單的應(yīng)用就是流程支持,例如一個(gè)普通的實(shí)體對(duì)象對(duì)應(yīng)的bizflow只需要加上如下代碼即可獲得流程相關(guān)的代碼,前臺(tái)菜單等。
? <bizflow extends="testflow.biz.xml">