? CRUD(Create Read Update Delete)是一般應(yīng)用程序中最基礎(chǔ)的操作,但是用戶的需求卻很難直接映射到CRUD操作上。例如常見(jiàn)的需求如下:
?1. 不同的業(yè)務(wù)處理處于不同狀態(tài)的業(yè)務(wù)對(duì)象:
???? 業(yè)務(wù)A處理狀態(tài)為X的業(yè)務(wù)對(duì)象,而業(yè)務(wù)B處理狀態(tài)為Y的業(yè)務(wù)對(duì)象
?2. 業(yè)務(wù)對(duì)象處于不同狀態(tài)的時(shí)候允許的操作不同:
??? 狀態(tài)處于X的業(yè)務(wù)對(duì)象允許操作U, 而狀態(tài)處于Y的業(yè)務(wù)對(duì)象允許操作V
?3. 不同的業(yè)務(wù)操作可能修改業(yè)務(wù)對(duì)象的不同屬性:
???? 操作U修改業(yè)務(wù)對(duì)象的屬性P, 操作V修改業(yè)務(wù)對(duì)象的屬性Q
?4. 具有不同權(quán)限的人能夠從事的業(yè)務(wù)不同:
????? 角色R處理業(yè)務(wù)A, 角色S處理業(yè)務(wù)B
?5. 具有不同權(quán)限的人即使從事同一業(yè)務(wù),所能夠操作的業(yè)務(wù)對(duì)象集合也不同:
???? 角色R處理部門(mén)M的業(yè)務(wù)對(duì)象,角色S處理部門(mén)N的業(yè)務(wù)對(duì)象.
?6. 具有不同權(quán)限的人即使可以操作同一業(yè)務(wù)對(duì)象,所能夠采取的業(yè)務(wù)操作也不同:
????? 角色R只能進(jìn)行操作U, 角色S只能進(jìn)行操作V
?7. 在業(yè)務(wù)對(duì)象上執(zhí)行操作之后可能造成狀態(tài)變遷:
????? 處于狀態(tài)X的業(yè)務(wù)對(duì)象上執(zhí)行操作U后狀態(tài)變?yōu)閅
以上這些需求往往是系統(tǒng)中最易變的部分, 而它們?cè)诟拍钌锨∏”憩F(xiàn)為對(duì)CRUD的一種限制性描述. 因此通過(guò)如下擴(kuò)展我們可以定義BizFlow的概念: BizFlow = CRUD + Filter. 根據(jù)這種觀念, witrix平臺(tái)中BizFlow被實(shí)現(xiàn)為DaoWebAction的一種無(wú)縫擴(kuò)展.
?? 在jsplet框架中我們通過(guò)如下url模式來(lái)訪問(wèn)后臺(tái)的CRUD操作:
?? /list.jsp?objectName=MyObj&objectEvent=Query
為了實(shí)現(xiàn)BizFlow只需通過(guò)spring為DaoWebAction配置一個(gè)xml配置文件, 此后仍然可以通過(guò)
??? /list.jsp?objectName=MyObj&objectEvent=Query
來(lái)訪問(wèn)后臺(tái)的CRUD操作,只是后臺(tái)會(huì)自動(dòng)應(yīng)用配置文件中的 bizId="default", bizActionId="Query-default"等配置項(xiàng).
如果我們采用如下url來(lái)訪問(wèn)
??? /list.jsp?objectName=MyObj&objectEvent=Query&$bizId=test&$bizActionId=test???
則后臺(tái)將應(yīng)用配置項(xiàng) bizId=manage, bizActionId=Query-test, 而
??? /list.jsp?objectName=MyObj&objectEvent=BizAction&$bizId=test&$bizActionId=test???
則對(duì)應(yīng)于配置項(xiàng) bizId=manage, bizActionId=BizAction-test.
?? 應(yīng)用BizFlow配置項(xiàng)之后,所有前臺(tái)代碼都可以不做出任何改變, 因?yàn)樗鼈冎皇菍?duì)于給定數(shù)據(jù)的展現(xiàn).
??
?? BizFlow可以看作是CRUD加上簡(jiǎn)單的流程控制和權(quán)限控制所構(gòu)成, 但是它與完整的工作流模型還是有著顯著區(qū)別的. 工作流中所關(guān)注的重點(diǎn)首先是流程實(shí)例而不是業(yè)務(wù)對(duì)象實(shí)例, 在一個(gè)流程中是否存在唯一的業(yè)務(wù)對(duì)象,以及業(yè)務(wù)對(duì)象的狀態(tài)是否隨著流程流轉(zhuǎn)發(fā)生變化完全是一件獨(dú)立的事情,它們并不屬于抽象的工作流模型本身. 理論上說(shuō),一個(gè)業(yè)務(wù)對(duì)象可以同時(shí)參與多個(gè)流程. 在工作流建模中主要通過(guò)流程步驟的先后順序的約束來(lái)描述業(yè)務(wù)進(jìn)程, 處于同一狀態(tài)的業(yè)務(wù)對(duì)象可能處在不同的流程步驟中. 而B(niǎo)izFlow可以看作是狀態(tài)驅(qū)動(dòng)的, 當(dāng)前業(yè)務(wù)步驟直接由業(yè)務(wù)對(duì)象的狀態(tài)決定. 在BizFlow中因?yàn)橐暯鞘菢I(yè)務(wù)對(duì)象的狀態(tài),因此我們直接面對(duì)的是大量處于同一狀態(tài)的不同的業(yè)務(wù)處理過(guò)程, 而workflow中往往建模的時(shí)候強(qiáng)調(diào)單流程實(shí)例視角,而一般缺乏對(duì)于流程實(shí)例相關(guān)性的描述. 現(xiàn)在國(guó)內(nèi)很多人認(rèn)為工作流就是狀態(tài)機(jī)其實(shí)是對(duì)workflow概念的一種誤讀.
?