專利名稱::創(chuàng)作和執(zhí)行基于流程且基于約束的工作流的統(tǒng)一模型的制作方法
技術(shù)領(lǐng)域:
:本申請(qǐng)的實(shí)施例涉及工作流建模領(lǐng)域。更為具體地,本發(fā)明的實(shí)施例涉及組件化和可擴(kuò)展工作流模型。
背景技術(shù):
:現(xiàn)有系統(tǒng)試圖通過對(duì)商業(yè)問題建模而將商業(yè)問題映射到高級(jí)工作流。然而,真實(shí)世界的工作流在各方面都有所不同,這些方面諸如(a)執(zhí)行和建模的復(fù)雜性、(b)設(shè)計(jì)時(shí)對(duì)工作流的結(jié)構(gòu)的知識(shí)、(c)靜態(tài)定義或特別/動(dòng)態(tài)、(d)在其生命周期中各點(diǎn)創(chuàng)作和編輯該工作流的簡(jiǎn)易性、以及(e)與核心工作流過程的弱或強(qiáng)商業(yè)邏輯關(guān)聯(lián)?,F(xiàn)有模型無法容納所有這些因素。此外,大多數(shù)現(xiàn)有工作流模型是以基于語(yǔ)言的方法(例如,BPEL4WS、XLANG/S和WSFL)或基于應(yīng)用程序的方法為基礎(chǔ)的?;谡Z(yǔ)言的方法是具有一閉合的預(yù)定義構(gòu)造集的高級(jí)工作流語(yǔ)言,它幫助向用戶/程序員建模該工作流過程。工作流語(yǔ)言載有供該閉合構(gòu)造集使用的所有語(yǔ)義信息,以使用戶能夠構(gòu)建工作流模型。然而,語(yǔ)言無法由開發(fā)者來擴(kuò)展,且表示構(gòu)成該工作流模型的閉合的原語(yǔ)集。語(yǔ)言被綁定到由工作流系統(tǒng)銷售商發(fā)貨的語(yǔ)言編譯器。僅該工作流系統(tǒng)產(chǎn)品銷售商可通過在該產(chǎn)品的未來版本中用一新的構(gòu)造集擴(kuò)展該語(yǔ)言來擴(kuò)展該模型。這通常要求升級(jí)與該語(yǔ)言相關(guān)聯(lián)的編譯器?;趹?yīng)用程序的方法是這樣一種應(yīng)用程序,它在該應(yīng)用程序內(nèi)具有工作流能力以解決領(lǐng)域?qū)S脝栴}。這些應(yīng)用程序不是真正可擴(kuò)展的,也沒有可編程模型。采用現(xiàn)有方法,復(fù)雜性、預(yù)知、動(dòng)態(tài)工作流、創(chuàng)作簡(jiǎn)易性以及與商業(yè)邏輯和核心工作流的關(guān)聯(lián)強(qiáng)度等問題未被充分地解決。沒有可擴(kuò)展、可定制以及可重新主宿工作流設(shè)計(jì)器框架可用于構(gòu)建可視工作流設(shè)計(jì)器來對(duì)不同的工作流類別建?!,F(xiàn)有系統(tǒng)缺乏一種快速應(yīng)用程序開發(fā)(RAD)風(fēng)格工作流設(shè)計(jì)體驗(yàn),它允許用戶圖形地設(shè)計(jì)工作流過程,并以開發(fā)者選擇的編程語(yǔ)言來關(guān)聯(lián)商業(yè)邏輯。另外,沒有啟用了墨跡的工作流設(shè)計(jì)器。另外,現(xiàn)有系統(tǒng)無法提供用于執(zhí)行工作流的無縫特別或動(dòng)態(tài)編輯。工作流過程在本質(zhì)上是動(dòng)態(tài)且移動(dòng)的,且其形式不能在設(shè)計(jì)時(shí)完全預(yù)見。該工作流過程以結(jié)構(gòu)化方式起始,并最終在其執(zhí)行生命周期過程中發(fā)展和改變。需要一種允許工作流構(gòu)建者能夠在設(shè)計(jì)時(shí)創(chuàng)作各種類型的工作流模型,以及以無縫的方式對(duì)運(yùn)行的工作流做出特別或動(dòng)態(tài)改變的工作流創(chuàng)作框架。即使在部署了工作流過程之后且該工作流過程正在運(yùn)行,商業(yè)需求的變化通常迫使改變或編輯當(dāng)前運(yùn)行的工作流過程。需要一種提供工作流過程的運(yùn)行時(shí)創(chuàng)作的系統(tǒng)。另外,工作流過程處理跨越工作流過程模型的多個(gè)步驟的橫切的、互不相關(guān)且紊亂的問題。例如,盡管工作流過程的各部分被設(shè)計(jì)成參與長(zhǎng)期運(yùn)行的事務(wù),然而同一過程的其它部分被設(shè)計(jì)成用于并發(fā)執(zhí)行。同一工作流過程的另外一些部分要求跟蹤,而其它部分處理商業(yè)或應(yīng)用程序級(jí)例外。需要向工作流過程的一個(gè)或多個(gè)部分應(yīng)用特定的行為。某些工作流建模方法是不實(shí)用的,因?yàn)樗鼈冃枰麄€(gè)商業(yè)過程的基于流的完整描述,包括所有例外以及人類干預(yù)。這些方法中的一些提供了當(dāng)出現(xiàn)例外時(shí)的附加功能,而其它方法獨(dú)占地采用基于約束的方法而非基于流的方法來對(duì)商業(yè)過程建?!,F(xiàn)有系統(tǒng)實(shí)現(xiàn)基于流或基于約束的方法中的任一種。這些系統(tǒng)該不靈活,以致于無法對(duì)許多常見商業(yè)情況進(jìn)行建模。因此,需要一種組件化且可擴(kuò)展的工作流模型來解決這些和其它缺點(diǎn)的一個(gè)或多個(gè)。
發(fā)明內(nèi)容本發(fā)明的實(shí)施例提供了一種用于構(gòu)建組件化工作流模型的可擴(kuò)展框架。具體地,工作流過程中的每一步驟具有描述工作流步驟的設(shè)計(jì)時(shí)方面、編譯時(shí)方面以及運(yùn)行時(shí)方面的相關(guān)聯(lián)組件模型。此外,任何開發(fā)者可通過創(chuàng)作這些組件來擴(kuò)展核心工作流模型。本發(fā)明包括一工作流引擎,它足夠靈活和強(qiáng)大來協(xié)調(diào)各種工作流的執(zhí)行,包括高度形式的機(jī)器到機(jī)器過程、基于約束的特別人類工作流、以及具有基于流和基于約束的方法的混合的工作流。該工作流引擎準(zhǔn)許對(duì)執(zhí)行工作流的激活、執(zhí)行、查詢和控制能力。例如,本發(fā)明準(zhǔn)許對(duì)執(zhí)行工作流的特別和動(dòng)態(tài)改變。該工作流引擎可以在包括服務(wù)器和客戶機(jī)環(huán)境兩者的各種宿主環(huán)境中重新主宿或嵌入。每一特定宿主環(huán)境將工作流引擎與一組服務(wù)提供者相結(jié)合。服務(wù)提供者的總能力確定了可在該特定宿主環(huán)境中執(zhí)行的工作流的種類。本發(fā)明的其它實(shí)施例提供了一種用于序列化工作流模型的聲明性格式,諸如可擴(kuò)展配合(orchestration)標(biāo)記語(yǔ)言(XOML)。該聲明性格式使用戶能夠通過編寫一組組件來擴(kuò)展工作流模型。對(duì)應(yīng)于工作流過程的各步驟的語(yǔ)義被封裝在活動(dòng)確認(rèn)器組件中,該組件在編譯時(shí)確認(rèn)并實(shí)施給定組件的語(yǔ)義。本發(fā)明的聲明性格式的實(shí)施例還能夠進(jìn)行數(shù)據(jù)聲明以及與工作流模型的各元素的數(shù)據(jù)相關(guān)。該聲明性格式支持?jǐn)?shù)據(jù)通過工作流的變換。例如,該格式聲明性地表示外部數(shù)據(jù)源,如數(shù)據(jù)庫(kù)或文件、代碼片斷以及工作流模型內(nèi)的商業(yè)規(guī)則。本發(fā)明的一個(gè)實(shí)施例提供了一種構(gòu)建圖形/可視工作流設(shè)計(jì)器的可擴(kuò)展、可定址以及可重新主宿的工作流設(shè)計(jì)器框架,以對(duì)不同類別的工作流建模。本發(fā)明的另一實(shí)施例支持快速應(yīng)用程序開發(fā)風(fēng)格的工作流設(shè)計(jì)體驗(yàn),以允許用戶圖形地設(shè)計(jì)工作流過程,并以任何編程語(yǔ)言來關(guān)聯(lián)商業(yè)邏輯。本發(fā)明的實(shí)施例也使用筆和圖形輸入板技術(shù)提供了墨跡支持。本發(fā)明提供了一種自由形式的繪圖表面,其中,由用戶繪制的工作流被轉(zhuǎn)移到內(nèi)部表示。本發(fā)明支持通過在現(xiàn)有繪圖表面上的墨跡編輯(例如,添加/刪除活動(dòng))以及現(xiàn)有工作流的墨跡注釋(例如,書寫表面上的注解、建議或提醒等手繪物)對(duì)工作流的創(chuàng)建和修改。本發(fā)明的其它一些實(shí)施例提供了用于以聲明性方式捕捉橫切行為并將行為應(yīng)用于工作流模型的選中部分的組件。本發(fā)明的其它實(shí)施例在與其相關(guān)聯(lián)的行為的上下文中執(zhí)行工作流模型的選中部分。本發(fā)明的實(shí)施例提供了處理工作流模型的多個(gè)步驟的橫切的、互不相關(guān)且紊亂的問題的框架、可重新使用組件和語(yǔ)言。依照本發(fā)明的一個(gè)方面,一種計(jì)算機(jī)實(shí)現(xiàn)的系統(tǒng)表示工作流模型。該計(jì)算機(jī)實(shí)現(xiàn)的系統(tǒng)包括多個(gè)結(jié)構(gòu)化活動(dòng)的工作流。該工作流還包括多個(gè)非結(jié)構(gòu)化的活動(dòng),其每一個(gè)具有與其相關(guān)聯(lián)的約束。該系統(tǒng)還包括運(yùn)行時(shí)引擎,用于通過執(zhí)行多個(gè)結(jié)構(gòu)化活動(dòng)的每一個(gè)、評(píng)估多個(gè)非結(jié)構(gòu)化活動(dòng)的每一個(gè)的約束、以及根據(jù)與其相關(guān)聯(lián)的約束的評(píng)估執(zhí)行多個(gè)非結(jié)構(gòu)化活動(dòng)的每一個(gè)來執(zhí)行該工作流。依照本發(fā)明的另一方面,一種方法對(duì)工作流建模。該工作流表示商業(yè)過程。該方法包括向用戶呈現(xiàn)多個(gè)活動(dòng)。該方法還包括從用戶接收對(duì)所呈現(xiàn)的活動(dòng)的選擇以及與其相關(guān)聯(lián)的流程規(guī)范。該方法還包括依照所接收的流程規(guī)范對(duì)所接收的活動(dòng)選擇分組。該方法還包括從用戶接收對(duì)所呈現(xiàn)的活動(dòng)的另一選擇以及與其相關(guān)聯(lián)的約束。該方法還包括將所接收的對(duì)所呈現(xiàn)的活動(dòng)的其它選擇與對(duì)分組的活動(dòng)選擇合并,以創(chuàng)建工作流。依照本發(fā)明的又一方面,一個(gè)或多個(gè)計(jì)算機(jī)可讀介質(zhì)具有用于對(duì)具有基于流程的區(qū)域和基于約束的區(qū)域的工作流建模的計(jì)算機(jī)可執(zhí)行組件。該組件包括用于向用戶呈現(xiàn)多個(gè)活動(dòng)的顯示組件。該組件還包括用于從用戶接收對(duì)所呈現(xiàn)的活動(dòng)的選擇以及與其相關(guān)聯(lián)的流程規(guī)范的接口組件。該接口組件還從用戶接收對(duì)所呈現(xiàn)的活動(dòng)的另一選擇以及與每一活動(dòng)相關(guān)聯(lián)約束。該組件還包括用于依照所接收的流程規(guī)范對(duì)所接收的活動(dòng)選擇分組的設(shè)計(jì)器組件。該設(shè)計(jì)器組件還將所接收的對(duì)所呈現(xiàn)的活動(dòng)的其它選擇與分組的活動(dòng)選擇合并以創(chuàng)建工作流??商鎿Q地,本發(fā)明可包括各種其它方法和裝置。其它特征部分是顯而易見的,而部分將在后文指出。圖1是包含任務(wù)和控制流合成活動(dòng)的示例性工作流。圖2示出了一個(gè)示例性活動(dòng)繼承樹。圖3示出了一個(gè)示例性組件模型。圖4示出了一個(gè)示例性組件模型生命周期。圖5是示出基于流程的工作流內(nèi)約束活動(dòng)組的框圖。圖6是用于創(chuàng)作依賴于工作流規(guī)范的向?qū)У墓ぷ髁鞯母呒?jí)應(yīng)用程序用戶界面。圖7示出了一個(gè)示例性工作流設(shè)計(jì)器。圖8示出了包括接收活動(dòng)及其后的發(fā)送活動(dòng)的配合程序。圖9示出了可視工作流、工作流的XOML序列化表示以及工作流的分離代碼之間的進(jìn)度表定義和關(guān)系。圖10是示出其中可實(shí)現(xiàn)本發(fā)明的合適的計(jì)算系統(tǒng)環(huán)境的一個(gè)示例的框圖。附錄A描述了示例性活動(dòng)。貫穿附圖,對(duì)應(yīng)的參考符號(hào)指示對(duì)應(yīng)的部分。具體實(shí)施例方式本發(fā)明的實(shí)施例對(duì)表示諸如商業(yè)過程等過程的工作流進(jìn)行建模。商業(yè)過程是導(dǎo)致可預(yù)測(cè)和可重復(fù)結(jié)果的依賴性和有序的任務(wù)、活動(dòng)等。包括組織的操作過程、機(jī)構(gòu)的工作知識(shí)以及信息資源,商業(yè)過程被設(shè)計(jì)成以有效且及時(shí)的方式滿足所定義的商業(yè)目標(biāo)。在一個(gè)有效的環(huán)境中,過程的功能性組件可被容易地標(biāo)識(shí)、適應(yīng)和部署來解決不斷改變的企業(yè)需求。工作流是與商業(yè)過程中的任務(wù)交互的最終用戶的體驗(yàn)。任務(wù)被建模為活動(dòng)、組件等,其每一個(gè)表示由個(gè)人或機(jī)器執(zhí)行的工作單元。在一個(gè)實(shí)施例中,向用戶呈現(xiàn)多個(gè)活動(dòng)。用戶選擇并組織活動(dòng)來創(chuàng)建工作流。執(zhí)行所創(chuàng)建的工作流以對(duì)商業(yè)過程建模。參考圖1,示例性工作流100包含任務(wù)和控制流合成活動(dòng)。在一個(gè)示例中,配合引擎工作流模型支持不同類別工作流的建模、創(chuàng)作和執(zhí)行。示例包括按照出現(xiàn)在有序序列中或作為一組異步事件出現(xiàn)的一組結(jié)構(gòu)化步驟對(duì)給定問題建模。該配合引擎協(xié)調(diào)進(jìn)度表的執(zhí)行。進(jìn)度表是以樹形結(jié)構(gòu)分層排列的一組經(jīng)組織的活動(dòng)。執(zhí)行活動(dòng)的執(zhí)行上下文以及對(duì)其可見的共享數(shù)據(jù)由一作用域提供。每一活動(dòng)表示封裝工作流過程中步驟元數(shù)據(jù)的組件。活動(dòng)是工作流模型中的基本執(zhí)行單元,且具有相關(guān)聯(lián)的屬性、句柄、約束和事件。每一活動(dòng)可以由任何編程語(yǔ)言中的用戶代碼來配置。例如,用戶代碼可表示以公用語(yǔ)言運(yùn)行時(shí)環(huán)境(CLR)語(yǔ)言書寫的商業(yè)或應(yīng)用程序邏輯或規(guī)則。每一活動(dòng)支持對(duì)用戶代碼中的執(zhí)行的預(yù)截聽(pre-interception)掛鉤和后截聽(post-interception)掛鉤。每一活動(dòng)具有相關(guān)聯(lián)的運(yùn)行時(shí)執(zhí)行語(yǔ)義和行為(例如,狀態(tài)管理、事務(wù)、事件處理和異常處理)。活動(dòng)可與其它活動(dòng)共享狀態(tài)。活動(dòng)可以是原語(yǔ)活動(dòng)或被組合成合成活動(dòng)。原語(yǔ)或基本活動(dòng)沒有子結(jié)構(gòu)(例如,子活動(dòng)),并由此是樹結(jié)構(gòu)中的葉節(jié)點(diǎn)。合成活動(dòng)包含子結(jié)構(gòu)(例如,它是一個(gè)或多個(gè)子活動(dòng)的父節(jié)點(diǎn))。在一個(gè)實(shí)施例中,活動(dòng)有三種類型簡(jiǎn)單活動(dòng)、容器活動(dòng)和根活動(dòng)。在本實(shí)施例中,在模型中有一個(gè)根活動(dòng),且根活動(dòng)中沒有或有任何數(shù)量的簡(jiǎn)單活動(dòng)或容器活動(dòng)。容器活動(dòng)可包括簡(jiǎn)單或容器活動(dòng)。整個(gè)工作流過程可用作構(gòu)建更高階工作流過程的活動(dòng)。此外,活動(dòng)可以是可中斷或不可中斷的。不可中斷合成活動(dòng)不包括可中斷活動(dòng)。不可中斷活動(dòng)缺少可導(dǎo)致活動(dòng)阻斷的服務(wù)。配合引擎提供一組示例性的活動(dòng)。參考圖2,一活動(dòng)繼承樹示出了若干示例性活動(dòng)。圖2列出的示例性活動(dòng)在附錄A中更詳細(xì)地描述。另外,任何用戶可編寫一個(gè)或多個(gè)活動(dòng)來擴(kuò)展工作流模型。例如,用戶可為特定的商業(yè)問題、領(lǐng)域、工作流標(biāo)準(zhǔn)(例如,商業(yè)過程執(zhí)行語(yǔ)言)或目標(biāo)平臺(tái)編寫活動(dòng)。配合引擎可向用戶提供一組豐富的服務(wù)來編寫活動(dòng),該組服務(wù)包括,例如分析代碼、類型分解和類型系統(tǒng)的服務(wù)、用于序列化和呈現(xiàn)的服務(wù)。在一個(gè)實(shí)施例中,每一活動(dòng)具有至少三個(gè)部分元數(shù)據(jù)、實(shí)例數(shù)據(jù)和執(zhí)行邏輯?;顒?dòng)的元數(shù)據(jù)定義了可被配置的數(shù)據(jù)屬性。例如,某些活動(dòng)可共享在活動(dòng)抽象基類中定義的一組公用元數(shù)據(jù)。每一活動(dòng)依照其需求通過擴(kuò)展該類來聲明其自己的附加元數(shù)據(jù)屬性。元數(shù)據(jù)屬性的值由該活動(dòng)跨配置該活動(dòng)的進(jìn)度表的實(shí)例的所有實(shí)例共享。例如,如果用戶創(chuàng)建進(jìn)度表A,并向其添加一發(fā)送活動(dòng),則該發(fā)送活動(dòng)被給予標(biāo)識(shí)信息(例如,“001”)作為其元數(shù)據(jù)的一部分。添加到該進(jìn)度表的第二發(fā)送活動(dòng)將接收其自己的唯一標(biāo)識(shí)信息(例如,“002”)。一旦創(chuàng)建和執(zhí)行了進(jìn)度表A的多個(gè)實(shí)例,則發(fā)送“001”的所有實(shí)例將共享元數(shù)據(jù)值。相反,活動(dòng)的實(shí)例元數(shù)據(jù)定義了一組對(duì)運(yùn)行進(jìn)度表實(shí)例中的活動(dòng)實(shí)例專用的數(shù)據(jù)。例如,延遲活動(dòng)可提供其實(shí)例數(shù)據(jù)上的只讀屬性,該實(shí)例數(shù)據(jù)是標(biāo)識(shí)延遲活動(dòng)的超時(shí)值的日期和時(shí)間值。一旦延遲活動(dòng)開始執(zhí)行,該值即可用,且它對(duì)延遲活動(dòng)的每一單個(gè)實(shí)例很可能是不同的。通常參考進(jìn)度表的實(shí)例,尤其是活動(dòng)和任務(wù)的實(shí)例,而不用“實(shí)例”來限定參考。合成活動(dòng)具有其子活動(dòng)組作為另一元素。子活動(dòng)在一個(gè)實(shí)施例中被認(rèn)為是元數(shù)據(jù)。配合引擎模型明確地準(zhǔn)許在運(yùn)行時(shí)在進(jìn)度表的實(shí)例中操縱該元數(shù)據(jù)。向作為執(zhí)行進(jìn)度表實(shí)例的一個(gè)部分的合成活動(dòng)添加新的子活動(dòng),使得僅該進(jìn)度表實(shí)例的元數(shù)據(jù)(活動(dòng)樹)被影響是可能的。接下來參考圖3,每一活動(dòng)具有一組相關(guān)聯(lián)的組件,它們形成了該活動(dòng)的組件模型。該組相關(guān)聯(lián)的組件包括活動(dòng)執(zhí)行器、活動(dòng)設(shè)計(jì)器、活動(dòng)序列化器、活動(dòng)確認(rèn)器(例如,語(yǔ)義檢查器)、以及活動(dòng)代碼生成器。活動(dòng)執(zhí)行器是實(shí)現(xiàn)該活動(dòng)的執(zhí)行語(yǔ)義的無狀態(tài)(stateless)組件。活動(dòng)執(zhí)行器與活動(dòng)的元數(shù)據(jù)一起工作來實(shí)現(xiàn)該活動(dòng)。代碼調(diào)度器擔(dān)當(dāng)活動(dòng)執(zhí)行器的服務(wù)提供者以向活動(dòng)執(zhí)行器提供服務(wù)?;顒?dòng)設(shè)計(jì)器可視地顯示活動(dòng)的設(shè)計(jì)時(shí)可視表示。活動(dòng)設(shè)計(jì)器是設(shè)計(jì)器分層結(jié)構(gòu)中的一個(gè)節(jié)點(diǎn),并且可以加主題或加皮膚?;顒?dòng)設(shè)計(jì)器主宿在設(shè)計(jì)環(huán)境中(例如,應(yīng)用程序),并通過服務(wù)與宿主設(shè)計(jì)環(huán)境交互?;顒?dòng)確認(rèn)器在編譯時(shí)以及運(yùn)行時(shí)實(shí)施活動(dòng)語(yǔ)義?;顒?dòng)確認(rèn)器在工作流模型的上下文中操作,并使用由該環(huán)境提供的服務(wù)(例如,編譯器、設(shè)計(jì)器或運(yùn)行時(shí)環(huán)境)。確認(rèn)在工作流生命周期中的各個(gè)點(diǎn)發(fā)生。結(jié)構(gòu)依從性檢查在創(chuàng)建工作流的序列化表示時(shí)、編譯時(shí)或響應(yīng)于用戶請(qǐng)求而做出。語(yǔ)義檢查可以在運(yùn)行時(shí)比在編譯時(shí)執(zhí)行的檢查更強(qiáng)大,以確保諸如運(yùn)行實(shí)例的活動(dòng)樹中活動(dòng)的添加和替換等運(yùn)行時(shí)操作的安全性。本發(fā)明評(píng)估與每一活動(dòng)相關(guān)聯(lián)的語(yǔ)義,以找出例如與預(yù)定接口要求的一致性和依從性?;顒?dòng)序列化器是序列化活動(dòng)元數(shù)據(jù)的組件?;顒?dòng)序列化器從各種模型/格式序列化器中調(diào)用。整個(gè)工作流模型是基于一可擴(kuò)展模式被序列化成聲明性標(biāo)記語(yǔ)言的,它可以按需進(jìn)一步被轉(zhuǎn)換成其它工作流語(yǔ)言。在一個(gè)實(shí)施例中,活動(dòng)的組件模型作為數(shù)據(jù)結(jié)構(gòu)儲(chǔ)存在計(jì)算機(jī)可讀介質(zhì)上。在該數(shù)據(jù)結(jié)構(gòu)中,活動(dòng)設(shè)計(jì)器由儲(chǔ)存用于可視地表示該活動(dòng)的數(shù)據(jù)的圖像字段(例如,圖標(biāo))表示。另外,一個(gè)或多個(gè)創(chuàng)作時(shí)字段儲(chǔ)存定義與活動(dòng)相關(guān)聯(lián)的屬性、方法和事件的元數(shù)據(jù)?;顒?dòng)序列化器由儲(chǔ)存用于將儲(chǔ)存在創(chuàng)作時(shí)字段中的元數(shù)據(jù)傳送到活動(dòng)的聲明性表示的數(shù)據(jù)的序列化器字段表示?;顒?dòng)生成器由儲(chǔ)存與儲(chǔ)存在創(chuàng)作時(shí)字段中的元數(shù)據(jù)相關(guān)聯(lián)的軟件代碼的商業(yè)邏輯字段來表示。活動(dòng)執(zhí)行器由儲(chǔ)存用于執(zhí)行儲(chǔ)存在商業(yè)邏輯字段中的軟件代碼的數(shù)據(jù)的執(zhí)行器字段表示。作用域和進(jìn)度表執(zhí)行活動(dòng)的執(zhí)行上下文以及對(duì)其可見的共享數(shù)據(jù)由作用域來提供。作用域是核心活動(dòng)之一。作用域是用于將變量和長(zhǎng)期運(yùn)行服務(wù)與事務(wù)語(yǔ)義、出錯(cuò)處理語(yǔ)義、補(bǔ)償、事件處理程序和數(shù)據(jù)狀態(tài)管理集合在一起的統(tǒng)一構(gòu)造。作用域可具有相關(guān)聯(lián)的異常和事件處理程序。在一個(gè)實(shí)施例中,作用域可以是事務(wù)的、原子的、長(zhǎng)期運(yùn)行的或同步的。在對(duì)用戶變量的沖突讀-寫或?qū)?寫訪問的情況下,向用戶提供并發(fā)控制。作用域也是事務(wù)邊界、異常處理邊界以及補(bǔ)償邊界。由于作用域可以在進(jìn)度表內(nèi)嵌套,因此用不同作用域內(nèi)相同的名字(即使作用域是嵌套的)來聲明變量、消息、通道和相關(guān)集而沒有名字沖突也是可能的。在進(jìn)度表內(nèi)嵌套的作用域只能在該進(jìn)度表的上下文內(nèi)執(zhí)行。進(jìn)度表可以被編譯為應(yīng)用程序(例如,獨(dú)立的可執(zhí)行實(shí)體)或庫(kù)(例如,用于從其它進(jìn)度表調(diào)用)。被編譯為庫(kù)的每一進(jìn)度表有效地構(gòu)成了可從其它進(jìn)度表內(nèi)調(diào)用的新活動(dòng)類型。進(jìn)度表的元數(shù)據(jù)包括參數(shù)的聲明。一旦開發(fā)了進(jìn)度表,可執(zhí)行所開發(fā)的進(jìn)度表的實(shí)例。激活和控制進(jìn)度表實(shí)例的過程是由其中嵌入了配合引擎的宿主環(huán)境所決定的。配合引擎提供了可用于測(cè)試進(jìn)度表的不提供必要服務(wù)的“簡(jiǎn)單宿主”。另外,配合引擎提供了一激活服務(wù)來促進(jìn)同樣由引擎和外部應(yīng)用程序用于與服務(wù)環(huán)境(即,宿主)交互的“服務(wù)提供者”模型(例如,應(yīng)用程序編程接口)的標(biāo)準(zhǔn)化。激活服務(wù)創(chuàng)建了特定進(jìn)度表類型的進(jìn)度表實(shí)例,并可任選地傳遞參數(shù)。進(jìn)度表實(shí)例本質(zhì)上是運(yùn)行進(jìn)度表實(shí)例的代理,并包括唯一地標(biāo)識(shí)該實(shí)例的標(biāo)識(shí)符、對(duì)進(jìn)度表的元數(shù)據(jù)(活動(dòng)樹)的引用、以及掛起、恢復(fù)和終止實(shí)例的方法。激活服務(wù)也支持基于給定的進(jìn)度表實(shí)例標(biāo)識(shí)符找出進(jìn)度表實(shí)例。代碼分離(code-beside)作用域活動(dòng)可具有包括用于該作用域活動(dòng)的商業(yè)邏輯的相關(guān)聯(lián)的代碼分離類。由于進(jìn)度表本身是作用域,因此進(jìn)度表也可具有代碼分離的類。在進(jìn)度表內(nèi)嵌套的作用域也可具有其自己的代碼分離類。在作用域內(nèi)嵌套的活動(dòng)共享該作用域的代碼分離類,它擔(dān)當(dāng)其共享數(shù)據(jù)的狀態(tài)和商業(yè)邏輯的容器。例如,代碼活動(dòng)的元數(shù)據(jù)包括對(duì)具有代碼分離中的特定簽名的方法的引用。在另一實(shí)例中,發(fā)送活動(dòng)的元數(shù)據(jù)包括對(duì)特定簽名的代碼分離方法的可任選引用加上對(duì)消息聲明和通道聲明的強(qiáng)制引用。代碼分離的示例性使用包括變量、消息、通道和相關(guān)集的聲明;出/入/引用參數(shù)的聲明;附加自定義屬性的聲明;要發(fā)送的消息的準(zhǔn)備;已接收消息的處理;以返回布爾值的代碼表達(dá)的規(guī)則的實(shí)現(xiàn);本地定義的變量的操縱;讀活動(dòng)元數(shù)據(jù)和實(shí)例數(shù)據(jù);寫活動(dòng)實(shí)例數(shù)據(jù)(例如,設(shè)置將要執(zhí)行的活動(dòng)的屬性);引發(fā)事件;拋出異常;枚舉和導(dǎo)航運(yùn)行進(jìn)度表實(shí)例的活動(dòng)樹中的活動(dòng)的分層結(jié)構(gòu),包括跨嵌套的作用域和進(jìn)度表調(diào)用邊界;向運(yùn)行進(jìn)度表實(shí)例內(nèi)的合成活動(dòng)添加新活動(dòng);改變與運(yùn)行進(jìn)度表實(shí)例內(nèi)的活動(dòng)相關(guān)聯(lián)的聲明性規(guī)則;以及獲取對(duì)其它運(yùn)行進(jìn)度表實(shí)例的引用和對(duì)其的操縱。參考圖4,一框圖示出了示例性組件模型生命周期。用戶與儲(chǔ)存在一個(gè)或多個(gè)計(jì)算機(jī)可讀介質(zhì)上的計(jì)算機(jī)可執(zhí)行組件交互,以對(duì)具有基于流程的區(qū)域和基于約束的區(qū)域的工作流建模。該計(jì)算機(jī)可執(zhí)行組件包括顯示組件402、接口組件404、設(shè)計(jì)器組件406以及運(yùn)行時(shí)組件408。顯示組件402向用戶呈現(xiàn)多個(gè)活動(dòng)。接口組件404從用戶接收對(duì)所呈現(xiàn)的活動(dòng)的選擇和與其相關(guān)聯(lián)的流程規(guī)范。設(shè)計(jì)器組件406依照所接收的流程規(guī)范對(duì)所接收的活動(dòng)選擇分組,以創(chuàng)建多個(gè)結(jié)構(gòu)化活動(dòng),接口組件404還從用戶接收對(duì)所呈現(xiàn)的活動(dòng)的另一選擇以及與每一活動(dòng)相關(guān)聯(lián)的約束。該另一選擇表示多個(gè)非結(jié)構(gòu)化活動(dòng),其每一個(gè)具有與其相關(guān)聯(lián)的約束。在一個(gè)實(shí)施例中,用戶定義一個(gè)或多個(gè)約束。設(shè)計(jì)器組件406還將多個(gè)結(jié)構(gòu)化活動(dòng)與多個(gè)非結(jié)構(gòu)化活動(dòng)合并,以創(chuàng)建工作流。運(yùn)行時(shí)組件408依照流程規(guī)范執(zhí)行多個(gè)結(jié)構(gòu)化活動(dòng)。運(yùn)行時(shí)組件還通過評(píng)估與多個(gè)非結(jié)構(gòu)化活動(dòng)的每一個(gè)相關(guān)聯(lián)的約束以及執(zhí)行其約束滿足每一評(píng)估的活動(dòng),來執(zhí)行所創(chuàng)建的工作流。在一個(gè)實(shí)施例中,約束具有輸入?yún)?shù),并且運(yùn)行時(shí)引擎408還通過識(shí)別輸入?yún)?shù)中的改變并重新評(píng)估約束來執(zhí)行工作流。在一個(gè)實(shí)施例中,顯示組件402、接口組件404、設(shè)計(jì)器組件406和運(yùn)行時(shí)組件408的一個(gè)或多個(gè)在應(yīng)用程序的執(zhí)行環(huán)境、上下文等中執(zhí)行。如圖4所示其在此處描述的硬件、軟件和系統(tǒng)構(gòu)成了用于向用戶呈現(xiàn)多個(gè)結(jié)構(gòu)化活動(dòng)以及多個(gè)非結(jié)構(gòu)化活動(dòng)的示例性裝置;用于從用戶接收對(duì)多個(gè)結(jié)構(gòu)化活動(dòng)的選擇、對(duì)多個(gè)非結(jié)構(gòu)化活動(dòng)的選擇、以及與所選擇的活動(dòng)相關(guān)聯(lián)的流程規(guī)范的示例性裝置;用于依照所述流程規(guī)范將對(duì)多個(gè)結(jié)構(gòu)化活動(dòng)的選擇與對(duì)多個(gè)非結(jié)構(gòu)化活動(dòng)的選擇組合以創(chuàng)建工作流的示例性裝置;以及用于執(zhí)行所創(chuàng)建的工作流的示例性裝置。一個(gè)或多個(gè)計(jì)算機(jī)可讀介質(zhì)具有用于執(zhí)行該方法的計(jì)算機(jī)可執(zhí)行指令。約束活動(dòng)組工作流以許多形狀和大小出現(xiàn),且其每一個(gè)的特征可以是它位于從一端的特別工作流到另一端的形式工作流的范圍內(nèi)。一般而言,特別工作流具有一組要以任何順序完成或執(zhí)行的任務(wù)。即,該組任務(wù)對(duì)于執(zhí)行順序是不相關(guān)的。形式工作流具有定義良好的控制流構(gòu)造(例如,順序、并發(fā)、條件分支以及while循環(huán)),用于精確地定義和控制該組任務(wù)的執(zhí)行。某些工作流具有形式的一些部分,以及特別的其它部分,且可以被容易地表達(dá)為具有目標(biāo)和約束。在某些情況下,工作流甚至可以在其生命周期內(nèi)沿該范圍移動(dòng),或當(dāng)實(shí)例在進(jìn)行中時(shí)改變其流程和/或約束。本發(fā)明提供了基于流程的調(diào)度和基于約束的調(diào)度的統(tǒng)一。該合成以稱為約束活動(dòng)組(CAG)的控制流構(gòu)造為中心。CAG活動(dòng)提供了其執(zhí)行過程由與約束活動(dòng)相關(guān)聯(lián)的約束指導(dǎo)的活動(dòng)組。以此方式,CAG促進(jìn)了其中未對(duì)執(zhí)行路徑明確建模的一組活動(dòng)(例如,相關(guān)活動(dòng))的面向目標(biāo)的受約束執(zhí)行。CAG的退化情況(例如,其中沒有在任何約束活動(dòng)上指定任何約束,且使用了默認(rèn)的完成條件)是約束活動(dòng)的非同步并發(fā)或并行執(zhí)行。CAG與聲明CAG的執(zhí)行何時(shí)被認(rèn)為完成的完成條件相關(guān)聯(lián)。一個(gè)示例性默認(rèn)完成條件聲明CAG的執(zhí)行在所有約束活動(dòng)處于完成或取消狀態(tài)時(shí)完成。一個(gè)示例性完成條件是引用包裝CAG的作用域及其父作用域以及其它活動(dòng)的狀態(tài)中的變量和消息的布爾值。如果當(dāng)CAg從潛伏狀態(tài)移到啟用狀態(tài)時(shí)完成條件求值為真,則CAG立即完成,而不會(huì)啟用或執(zhí)行任何約束活動(dòng)。當(dāng)任何時(shí)刻執(zhí)行CAG活動(dòng)的完成條件求值為假,則包含在CAG中的任何以及所有執(zhí)行活動(dòng)立即被取消,且CAG活動(dòng)移至完成狀態(tài)。CAG中的每一活動(dòng)具有與其相關(guān)聯(lián)的關(guān)聯(lián)約束。用于約束活動(dòng)(例如,CAG中的活動(dòng))的一個(gè)示例性約束是引用包裝該CAG的作用域及其父作用域(但并非兄弟作用域)以及CAG內(nèi)其它活動(dòng)的狀態(tài)中的變量和消息的布爾函數(shù)。約束可以是透明的、部分透明的或不透明的,取決于對(duì)于其數(shù)據(jù)依賴性和實(shí)現(xiàn)所知的內(nèi)容。數(shù)據(jù)源依賴性(但非實(shí)現(xiàn))對(duì)于部分透明的約束是已知的。對(duì)于完全透明的約束,數(shù)據(jù)依賴性和實(shí)現(xiàn)是已知的。不透明條件不提供關(guān)于數(shù)據(jù)依賴性或?qū)崿F(xiàn)的信息。透明和部分透明的約束具有更有效求值的優(yōu)點(diǎn),因?yàn)橐婵蓪?duì)何時(shí)需要該約束的請(qǐng)求做出有用的判斷。當(dāng)活動(dòng)上的啟用約束變?yōu)檎鏁r(shí),該約束聲明相關(guān)聯(lián)的活動(dòng)已準(zhǔn)備好執(zhí)行并且必須被啟用。該約束僅當(dāng)活動(dòng)處于潛伏狀態(tài)時(shí)才有意義。由此,它僅能被求值為真一次。約束可以在它被啟用以后的任何時(shí)刻被禁用。這支持在兩個(gè)任務(wù)被分配給兩個(gè)個(gè)體,其中一個(gè)任務(wù)的完成取消另一任務(wù)(禁用)的情況下常見的XOR條件。如同啟用約束中的禁用約束是一次使用的。CAG的啟用約束可以在滿足CAG的完成條件之后被重新啟用,以向CAG中的任務(wù)提供重復(fù)的語(yǔ)義或while語(yǔ)義。CAG活動(dòng)的完成條件以及與所包含的活動(dòng)相關(guān)聯(lián)的所有約束可以被認(rèn)為是單個(gè)表達(dá)式集合。當(dāng)CAG本身被啟用時(shí),對(duì)滿足其數(shù)據(jù)依賴性的所有布爾表達(dá)式求值。如果CAG的完成條件為真,則CAG立即被認(rèn)為是完成。否則,生成要啟用的零個(gè)或多個(gè)活動(dòng)的列表。本發(fā)明的工作流引擎啟用所識(shí)別的活動(dòng)。當(dāng)由于活動(dòng)執(zhí)行對(duì)進(jìn)度表的狀態(tài)(例如,對(duì)約束和完成條件所依賴的數(shù)據(jù)全域的狀態(tài))發(fā)生改變時(shí),發(fā)生約束的重新求值,并識(shí)別要啟用的新活動(dòng)。表達(dá)式求值和活動(dòng)執(zhí)行并發(fā)地執(zhí)行,這與分階段或兩步迭代過程相反。接下來參考圖5,一框圖示出了工作流模型500,它使用CAG在基于流程的區(qū)域中定義了基于約束的區(qū)域?;诹鞒痰膮^(qū)域包括一組結(jié)構(gòu)化活動(dòng)(例如,工作流模型元素)。工作流的基于約束的區(qū)域示出了當(dāng)相關(guān)聯(lián)的約束(例如,對(duì)進(jìn)度表的數(shù)據(jù)狀態(tài)的布爾表達(dá)式)為真時(shí)要執(zhí)行的一組活動(dòng)。基于流程的模型在達(dá)到其端點(diǎn)時(shí)完成,而基于約束的區(qū)域中的活動(dòng)只要滿足了與活動(dòng)之一相關(guān)聯(lián)的約束(例如,無限地或直到滿足CAG完成語(yǔ)義)時(shí)就執(zhí)行。對(duì)基于約束的區(qū)域具有完成語(yǔ)義使基于約束的區(qū)域和基于流程的區(qū)域能夠被組合。在圖5的實(shí)例中,基于約束的區(qū)域包括約束組1502。約束組1中的活動(dòng)包括發(fā)送1504和延遲1506?;顒?dòng)504、506的每一個(gè)具有與其相關(guān)聯(lián)的約束。另外,完成條件508與約束組1502相關(guān)聯(lián)。工作流模板(stencil)工作流模板(例如,工作流樣板或活動(dòng)包)包括根活動(dòng)和一組活動(dòng)。模板可以是域或宿主專用的。模型的示例包括結(jié)構(gòu)化的工作流模板、人類工作流模板以及非結(jié)構(gòu)化的工作流模板。某些模板可以作為一組活動(dòng)是“閉合的”,包括被設(shè)計(jì)成可能在特定的宿主環(huán)境中共同工作的一個(gè)或多個(gè)根。其它模板可能是“開放”到各種程度的。模板定義了其可擴(kuò)展性點(diǎn)。例如,開發(fā)者編寫CustomRoot(自定義根)和新的抽象CustomActivity(自定義活動(dòng)),并聲明包是CustomRoot加上從CustomActivity導(dǎo)出的任何活動(dòng)。示例性BPEL或XLANG/S模板包括具有以下特征的根活動(dòng)狀態(tài)管理和事務(wù)中的參與具有相關(guān)聯(lián)的事件和異常處理程序、支持合約第一模型、可被分析、并具有定義良好的激活和終止行為。示例性模板還包括一組消息通信專用活動(dòng)(例如,Send(發(fā)送)和Receive(接收)及其變體),以及諸如Scope(作用域)、Loop(循環(huán))、Condition(條件)、Listen(監(jiān)聽)和Throw(拋出)等其它結(jié)構(gòu)化活動(dòng)。一個(gè)示例性Halifax模板包括具有以下特征的根活動(dòng)隱含狀態(tài)管理、相關(guān)聯(lián)的異常處理程序(0-n)、支持基于事件的模型、具有良好定義的激活行為、以及具有未定義的終止。根活動(dòng)包含0-n個(gè)EventDriven(事件驅(qū)動(dòng))活動(dòng)。每一EventDriven活動(dòng)表示一個(gè)Halifax活動(dòng)。每一EventDriven活動(dòng)具有相關(guān)聯(lián)的狀態(tài)管理協(xié)議并在原子作用域內(nèi)執(zhí)行。設(shè)計(jì)器框架(用戶界面)配合引擎提供了用于以WYSWYG方式設(shè)計(jì)各種類別的工作流模型的框架。例如,參考圖6,一種用于創(chuàng)作工作流的高級(jí)應(yīng)用程序用戶界面依賴于工作流規(guī)范的向?qū)?。該框架包括使開發(fā)者能夠編寫可視工作流設(shè)計(jì)器的一組服務(wù)和行為。這些服務(wù)提供了呈現(xiàn)工作流過程的有效方式、支持用于繪制工作流的墨跡/圖形輸入板、以及支持諸如撤消/回復(fù)、拖/放、剪切/復(fù)制/粘貼、縮放、掃視、搜索/替換等設(shè)計(jì)器操作、書簽、裝飾、用于確認(rèn)錯(cuò)誤的智能標(biāo)簽、用于活動(dòng)的有效拖動(dòng)目標(biāo)指示符、自動(dòng)布局、視圖分頁(yè)、導(dǎo)航標(biāo)記器、拖動(dòng)指示符、具有頁(yè)眉/頁(yè)腳的打印和預(yù)覽等等。通過這一用戶界面,可構(gòu)造包含任務(wù)和控制流合成活動(dòng)(例如,順序、并行和條件)的簡(jiǎn)單工作流。對(duì)規(guī)則規(guī)范(例如,條件分支邏輯、while循環(huán)邏輯)或數(shù)據(jù)流規(guī)范(例如,任務(wù)A的輸出是任務(wù)B的輸入)不要求代碼輸入(或依賴于現(xiàn)有的已編譯代碼)。進(jìn)度表的序列化表示(包括規(guī)則和數(shù)據(jù)流)是自包含的,且在不需要代碼分離的某些情形中完成。使用本發(fā)明的設(shè)計(jì)器框架,本發(fā)明的配合引擎包括一種快速應(yīng)用程序開發(fā)(RAD)風(fēng)格的可視工作流設(shè)計(jì)器,它支持以可視方式將軟件代碼與工作流模型相關(guān)聯(lián)。工作流中的每一活動(dòng)具有相關(guān)聯(lián)的活動(dòng)設(shè)計(jì)器。每一活動(dòng)設(shè)計(jì)器是按照框架服務(wù)來編寫的。本發(fā)明的框架也包含一可視設(shè)計(jì)器模型。該可視設(shè)計(jì)器模型包括通過該工作流模型中的關(guān)系彼此鏈接的一組活動(dòng)設(shè)計(jì)器。圖7示出了一個(gè)示例性工作流設(shè)計(jì)器。本發(fā)明包括將代碼與工作流模型相關(guān)聯(lián)的各種模式,包括“代碼分離”、“代碼嵌入”和允許用戶代碼實(shí)時(shí)在工作流模型中往返的“僅代碼”。本發(fā)明也提供了當(dāng)用戶在構(gòu)建工作流時(shí)的實(shí)時(shí)語(yǔ)義錯(cuò)誤。在一個(gè)實(shí)施例中,本發(fā)明向用戶呈現(xiàn)了標(biāo)識(shí)設(shè)計(jì)器框架用戶界面中的多個(gè)活動(dòng)的包。本發(fā)明還從用戶接收對(duì)所呈現(xiàn)的活動(dòng)的選擇和分層組織。本發(fā)明序列化所接收的活動(dòng)來創(chuàng)建工作流的持久表示。本發(fā)明還從用戶接收表示用于與工作流中的多個(gè)活動(dòng)之一相關(guān)聯(lián)的商業(yè)邏輯的軟件代碼。本發(fā)明也可接收具有與其相關(guān)聯(lián)的一個(gè)或語(yǔ)義的用戶定義活動(dòng)。本發(fā)明包括用于評(píng)估語(yǔ)義以找出其對(duì)預(yù)定義接口要求的一致性的語(yǔ)義檢查器或確認(rèn)器。如果語(yǔ)義與預(yù)定義的接口要求相一致,則本發(fā)明呈現(xiàn)該用戶定義的活動(dòng)作為多個(gè)活動(dòng)之一。本發(fā)明還編譯軟件代碼來創(chuàng)建一個(gè)或多個(gè)二進(jìn)制文件。例如,本發(fā)明將序列化的工作流表示和軟件代碼編譯成包含工作流的可執(zhí)行表示的單個(gè)程序集(assembly)。本發(fā)明執(zhí)行所創(chuàng)建的工作流。在一個(gè)實(shí)施例中,一個(gè)或多個(gè)計(jì)算機(jī)可讀介質(zhì)具有用于執(zhí)行該方法的計(jì)算機(jī)可執(zhí)行指令。配合引擎設(shè)計(jì)器允許用戶通過使用其它所創(chuàng)建的進(jìn)度表來遞歸地組成更高階進(jìn)度表并使用它們。進(jìn)度表的內(nèi)聯(lián)擴(kuò)充允許用戶內(nèi)聯(lián)地查看進(jìn)度表內(nèi)容并剪切或復(fù)制內(nèi)容。為允許進(jìn)度表的內(nèi)聯(lián)擴(kuò)充以及使進(jìn)度表只讀,創(chuàng)建用于內(nèi)聯(lián)進(jìn)度表的單獨(dú)設(shè)計(jì)表面和設(shè)計(jì)器宿主。此外,合成進(jìn)度表設(shè)計(jì)器具有其自己的分層結(jié)構(gòu)。所調(diào)用的進(jìn)度表在設(shè)計(jì)器由用戶擴(kuò)充時(shí)被加載和顯示。在一個(gè)實(shí)施例中,當(dāng)活動(dòng)被放到或復(fù)制到設(shè)計(jì)器表面上時(shí),層疊設(shè)計(jì)器。一屬性將調(diào)用活動(dòng)設(shè)計(jì)器與主宿的進(jìn)度表的根設(shè)計(jì)器鏈接。以下函數(shù)防止向設(shè)計(jì)器添加或移除活動(dòng)。internalstaticboolAreAllComponentsInWritableContext(ICollectioncomponents)internalstaticboolIsContextReadOnly(IServiceProviderserviceProvider)這些函數(shù)由基礎(chǔ)結(jié)構(gòu)調(diào)用以檢查其中插入活動(dòng)的上下文是否為可寫的。對(duì)于主宿的設(shè)計(jì)器,這些函數(shù)返回假。另外,防止屬性被修改。其它函數(shù)從適當(dāng)?shù)慕M件中取出活動(dòng)設(shè)計(jì)器internalstaticServiceDesignerGetSafeRootDesigner(IServiceProviderserviceProvider)internalstaticICompositeActivityDesignerGetSafeParentDesigner(objectobj)internalstaticIActivityDesignerGetSafeDesigner(objectobj)在一個(gè)示例中,用戶創(chuàng)建進(jìn)度表并將其編譯為活動(dòng)。在成功地編譯之后,該進(jìn)度表出現(xiàn)在工具箱中。用戶打開或創(chuàng)建其中需要所編譯的進(jìn)度表的進(jìn)度表。用戶從工具箱中拖放所編譯的進(jìn)度表。在設(shè)計(jì)表面上示出層疊的進(jìn)度表設(shè)計(jì)器。當(dāng)用戶希望查看放下的所編譯的進(jìn)度表的內(nèi)容時(shí),用戶擴(kuò)充進(jìn)度表設(shè)計(jì)器以用只讀的狀態(tài)示出內(nèi)聯(lián)的所調(diào)用的進(jìn)度表的內(nèi)容。所調(diào)用的進(jìn)度表的內(nèi)聯(lián)使用戶能夠查看所調(diào)用的進(jìn)度表,而無需在不同的進(jìn)度表設(shè)計(jì)器之間切換。該特征對(duì)于通過重復(fù)使用現(xiàn)有進(jìn)度表來組成更高階進(jìn)度表的開發(fā)者而言是有用的。對(duì)使用主題/皮膚的設(shè)計(jì)器框架的定制的支持使用設(shè)計(jì)器框架編寫的工作流設(shè)計(jì)器可使用工作流主題來定制。這些可以是聲明性地描述設(shè)計(jì)器的各方面的可擴(kuò)展標(biāo)記語(yǔ)言(XML)文件。工作流設(shè)計(jì)器提供伙伴擴(kuò)展活動(dòng)的向?qū)еС?。工作流設(shè)計(jì)器支持的示例性用戶界面特征包括,但不限于,撤消/恢復(fù)、拖/放、剪切/復(fù)制/粘貼、縮放、掃視、搜索/替換、書簽、裝飾、用于確認(rèn)錯(cuò)誤的智能標(biāo)簽、用于活動(dòng)的有效拖動(dòng)目標(biāo)指示符、自動(dòng)布局、視圖分頁(yè)、導(dǎo)航標(biāo)記器、拖動(dòng)指示符、具有頁(yè)眉/頁(yè)腳的打印和預(yù)覽、以及文檔大綱綜合。工作流設(shè)計(jì)器支持自定義的設(shè)計(jì)器主題/皮膚來允許使用XML元數(shù)據(jù)定制設(shè)計(jì)器的外觀和感覺。工作流設(shè)計(jì)器支持后臺(tái)編譯。在一個(gè)實(shí)施例中,提供了在設(shè)計(jì)進(jìn)度表時(shí)用于確認(rèn)錯(cuò)誤的智能標(biāo)簽和智能動(dòng)作。工作流設(shè)計(jì)器可主宿在任何容器中(例如,應(yīng)用程序、外殼等)。一個(gè)示例性配合引擎程序包括接收活動(dòng)以及其后跟隨的發(fā)送活動(dòng)。該過程接收消息并將其發(fā)送出去。用戶創(chuàng)建名為“HelloWorld”的項(xiàng)目,并向該項(xiàng)目添加配合項(xiàng)。用戶然后將作用域活動(dòng)拖放至設(shè)計(jì)表面。下一步,用戶將接收活動(dòng)以及其后的發(fā)送活動(dòng)放到該作用域上。圖8示出了設(shè)計(jì)器中的所得工作流800。每一活動(dòng)設(shè)計(jì)器提供了對(duì)象模型上的用戶界面表示。開發(fā)者能夠直接對(duì)對(duì)象模型編程,并設(shè)置活動(dòng)上的屬性或使用該設(shè)計(jì)器。配合引擎設(shè)計(jì)器允許開發(fā)者從工具箱中選擇活動(dòng)并將其拖到設(shè)計(jì)器表面上。如果活動(dòng)已被放置到進(jìn)度表中并需要移動(dòng),則開發(fā)者能夠選擇它(通過點(diǎn)擊它)并將其拖至它需要去往的進(jìn)度表區(qū)域。如果開發(fā)者按住ctrl鍵并同時(shí)進(jìn)行拖放,則做出所選中活動(dòng)的副本。積極放置提供了可能的拖動(dòng)點(diǎn)(目標(biāo))作為設(shè)計(jì)表面上的可視指示器。自動(dòng)滾動(dòng)也參與在拖放的上下文中。當(dāng)處理大型進(jìn)度表時(shí),到當(dāng)前不在視見區(qū)中的設(shè)計(jì)器區(qū)域的導(dǎo)航可通過將該活動(dòng)拖向要放置的進(jìn)度表區(qū)域來訪問。拖放可跨統(tǒng)一項(xiàng)目中的進(jìn)度表以及跨統(tǒng)一解決方案中的其它項(xiàng)目中的進(jìn)度表得到支持。在活動(dòng)被放置到設(shè)計(jì)表面上之后,開發(fā)者配置該活動(dòng)。每一活動(dòng)具有一組屬性,開發(fā)者配置該屬性以使進(jìn)度表有效。這些屬性可在屬性瀏覽器中編輯。每一活動(dòng)控制什么屬性在屬性瀏覽器中是可查看的。為幫助開發(fā)者配置各活動(dòng),設(shè)計(jì)器提供了各種對(duì)話框或“子設(shè)計(jì)器”。對(duì)活動(dòng)的各屬性調(diào)用每一對(duì)話框。配合引擎能夠定制工具箱中呈現(xiàn)的活動(dòng)。當(dāng)開發(fā)者創(chuàng)建自定義活動(dòng)或進(jìn)度表時(shí),最終的結(jié)果是程序集。使用對(duì)話框,開發(fā)者能夠?yàn)g覽程序集位置并選擇該程序集以使其作為配合引擎活動(dòng)出現(xiàn)?;蛘?,開發(fā)者可將程序集放置在配合引擎安裝路徑中,且它也為配合引擎活動(dòng)呈現(xiàn)。應(yīng)用程序編程接口(API)在另一實(shí)施例中,本發(fā)明提供了用于執(zhí)行各種工作流操作的應(yīng)用程序編程接口(API)。本發(fā)明包括用于創(chuàng)作工作流的設(shè)計(jì)應(yīng)用程序編程接口。設(shè)計(jì)應(yīng)用程序編程接口包括用于創(chuàng)作工作流的裝置以及用于選擇一個(gè)或多個(gè)活動(dòng)來創(chuàng)建該工具流的裝置。本發(fā)明也包括用于編輯經(jīng)由設(shè)計(jì)應(yīng)用程序編程接口創(chuàng)作的工作流的編譯應(yīng)用程序編程接口。編譯應(yīng)用程序編程接口包括用于序列化工作流的裝置、用于定制工作流的可視外觀的裝置、用于編譯經(jīng)由設(shè)計(jì)應(yīng)用程序編程接口創(chuàng)作的工作流的裝置、用于確認(rèn)工作流的裝置。本發(fā)明也包括用于將類型與工作流中的每一活動(dòng)相關(guān)聯(lián)的類型提供者應(yīng)用程序編程接口。類型提供者應(yīng)用程序編程接口包括用于將該類型與工作流中的每一活動(dòng)相關(guān)聯(lián)的裝置,以及用于將一類型與工作流中的每一活動(dòng)相關(guān)聯(lián)的裝置。一個(gè)或多個(gè)API構(gòu)成了用于創(chuàng)作工作流的示例性裝置、用于選擇一個(gè)或多個(gè)活動(dòng)來創(chuàng)建工作流的示例性裝置、用于序列化工作流的示例性裝置、用于定制工作流的可視外觀的示例性裝置、用于確認(rèn)工作流的示例性裝置、用于編譯工作流的示例性裝置、以及用于將類型與工作流中的每一活動(dòng)相關(guān)聯(lián)的示例性裝置?;顒?dòng)執(zhí)行框架由于有進(jìn)度表和作用域的例外,因此引擎將活動(dòng)視為抽象的實(shí)體,并僅協(xié)調(diào)活動(dòng)的執(zhí)行而不知道任何特定活動(dòng)的具體數(shù)據(jù)或語(yǔ)義。在一個(gè)實(shí)施例中,四個(gè)實(shí)體在活動(dòng)的執(zhí)行期間交互活動(dòng)本身、正在執(zhí)行的活動(dòng)的父活動(dòng)、包含正在執(zhí)行的活動(dòng)的作用域、以及配合引擎。每一實(shí)體具有不同的功能。如果活動(dòng)的執(zhí)行方法返回而沒有向其活動(dòng)協(xié)調(diào)器發(fā)信號(hào)通知完成,則該活動(dòng)被認(rèn)為是在邏輯等待狀態(tài)中。這一活動(dòng)可由配合引擎取消,或繼續(xù)(例如,一旦它所等待的項(xiàng)或事件變得可用或發(fā)生,且由引擎向該活動(dòng)通知這一情況)。某些從未進(jìn)入邏輯等待狀態(tài)的活動(dòng)可能從不被取消。示例包括發(fā)送活動(dòng)和代碼活動(dòng),因?yàn)樗鼈儾恍枰獙?duì)外部事件或預(yù)定的需求就可執(zhí)行。一旦交出了線程(即,一旦其執(zhí)行方法由配合引擎調(diào)用),則這些活動(dòng)將做工作直到完成。從不給配合引擎取消它們的機(jī)會(huì),因?yàn)樗鼈儾环祷鼐€程直到它們發(fā)信號(hào)通知完成。配合引擎運(yùn)行時(shí)環(huán)境使用規(guī)則來觸發(fā)在其上執(zhí)行配合引擎活動(dòng)的事件。配合引擎設(shè)計(jì)器向用戶提供了在運(yùn)行時(shí)關(guān)聯(lián)要評(píng)估的規(guī)則來觸發(fā)事件的能力。配合引擎設(shè)計(jì)器通過提供可擴(kuò)展性體系結(jié)構(gòu)使用戶能夠使用不同類型的規(guī)則技術(shù)。該設(shè)計(jì)器對(duì)于所使用的規(guī)則技術(shù)的類型是不可知的。在一個(gè)實(shí)施例中,設(shè)計(jì)器支持布爾表達(dá)式處理程序,作為將規(guī)則與活動(dòng)相關(guān)聯(lián)的一種方式。這意味著在用戶代碼文件中,用戶編寫返回真或假值的方法,基于該方法觸發(fā)規(guī)則。當(dāng)前有多種可用于評(píng)估規(guī)則的技術(shù),包括信息代理(InfoAgent)和商業(yè)規(guī)則引擎(BRE)。為實(shí)現(xiàn)這一目標(biāo),設(shè)計(jì)器包括使規(guī)則技術(shù)開發(fā)者能夠在設(shè)計(jì)器中主宿自定義用戶界面的可擴(kuò)展性體系結(jié)構(gòu)。該設(shè)計(jì)器提供了一種自定義用戶界面編寫者以代碼語(yǔ)句集合的形式序列化規(guī)則的方法。該設(shè)計(jì)器在用戶代碼文件中發(fā)放布爾處理程序,并向其插入代碼語(yǔ)句集合。配合引擎包括可由規(guī)則編寫者使用的默認(rèn)用戶界面。規(guī)則技術(shù)提供者通過創(chuàng)建自定義規(guī)則聲明、編寫與自定義規(guī)則聲明相關(guān)聯(lián)的用戶界面類型編輯器、創(chuàng)建自定義用戶界面來主宿規(guī)則用戶界面、以及在保存時(shí)生成代碼語(yǔ)句來向配合引擎設(shè)計(jì)器添加規(guī)則。在一個(gè)示例中,用戶選擇要向其附加規(guī)則的活動(dòng)設(shè)計(jì)器、在屬性瀏覽器中定位規(guī)則屬性并在下拉框中選擇“RuleExpressionHandler(規(guī)則表達(dá)式處理程序)”(它使得“Statements(語(yǔ)句)”屬性出現(xiàn)在用戶界面的Rule(規(guī)則)屬性下方)、在“Statements”屬性中指定用戶代碼方法名、調(diào)用用戶界面類型編輯器來調(diào)用主宿規(guī)則專用用戶界面的對(duì)話框、以及在對(duì)話框中通過創(chuàng)建新的謂詞行并將它們組合在一起來定義規(guī)則。用戶界面在用戶代碼文件中發(fā)放方法。方法名將與由用戶在屬性瀏覽器中指定的名稱相同。等效于創(chuàng)建規(guī)則的代碼語(yǔ)句將被插入到該規(guī)則的用戶代碼方法中。執(zhí)行期間的消息通信在運(yùn)行工作流中,發(fā)送到進(jìn)度表的消息是預(yù)期供特定進(jìn)度表實(shí)例使用的。例如,購(gòu)買定單#123的發(fā)票必須被發(fā)送回發(fā)起(例如,發(fā)送出)該購(gòu)買定單的同一進(jìn)度表實(shí)例。為將入站消息與適當(dāng)?shù)倪M(jìn)度表實(shí)例相匹配,消息和進(jìn)度表實(shí)例共享一相關(guān)集。該相關(guān)集可以是單值相關(guān)集,這意味著消息中的標(biāo)識(shí)符字段與由進(jìn)度表實(shí)例持有的相同類型的標(biāo)識(shí)符進(jìn)行匹配。多屬性相關(guān)集也是可能的,且類似于數(shù)據(jù)庫(kù)表中的多列主要關(guān)鍵字。進(jìn)度表實(shí)例持有的相關(guān)集的值是在進(jìn)度表實(shí)例發(fā)送出消息時(shí)初始化的(例如,可從出棧定單的標(biāo)識(shí)符字段中取該值),或當(dāng)進(jìn)度表實(shí)例接收消息時(shí)初始化的。該相關(guān)集值然后是該進(jìn)度表實(shí)例狀態(tài)的一部分。當(dāng)隨后的入站消息到達(dá)時(shí),進(jìn)度表實(shí)例狀態(tài)中保持的相關(guān)集值與由預(yù)期類型的入站消息所持有的標(biāo)識(shí)符字段進(jìn)行匹配。當(dāng)找到匹配,則滿足該相關(guān)集,且該消息被傳遞到進(jìn)度表實(shí)例。盡管相關(guān)集的實(shí)現(xiàn)是由配合引擎和宿主環(huán)境所決定的,但是在一個(gè)實(shí)施例中,用戶聲明該相關(guān)集以使進(jìn)度表實(shí)例能夠正確工作。在另一實(shí)施例中,某些活動(dòng)(例如,SendRequest(發(fā)送請(qǐng)求)/ReceiveResponse(接收響應(yīng))活動(dòng)以及ReceiveRequest(接收請(qǐng)求)/SendReponse(發(fā)送響應(yīng))活動(dòng))與用戶無關(guān)地設(shè)置相關(guān)集。由發(fā)送和接收活動(dòng)執(zhí)行各種各樣的確認(rèn)檢查,以確保相關(guān)集是正確初始化和遵循的。執(zhí)行工作流的動(dòng)態(tài)編輯配合引擎提供了用于創(chuàng)作(以及隨后可視化和執(zhí)行)各種類型的工作流的框架。示例包括事件-條件-動(dòng)作(ECA)風(fēng)格的工作流或結(jié)構(gòu)化工作流或規(guī)則驅(qū)動(dòng)工作流。此外,不論是如何對(duì)工作流建模的,工作流都允許用戶在設(shè)計(jì)時(shí)或甚至在工作流過程正在運(yùn)行時(shí)以同一方式創(chuàng)作或編輯工作流,而無需重新編譯該工作流過程。該框架允許用戶以高保真度在運(yùn)行時(shí)和設(shè)計(jì)時(shí)表示之間進(jìn)行往返。特別(adhoc)改變是在運(yùn)行時(shí)對(duì)過程模型做出的改變。用戶可向運(yùn)行的實(shí)例要求其進(jìn)度表模型,并向該模型做出改變。例如,用戶可按批添加、移除或替換活動(dòng),然后提交或回退批處理的改變。在一個(gè)實(shí)施例中,模型是在更新之后確認(rèn)的。在本發(fā)明的許多工作流情形中,“設(shè)計(jì)時(shí)創(chuàng)作”和“運(yùn)行時(shí)執(zhí)行”之間的分隔存在模糊或甚至是消除。進(jìn)度表實(shí)例有效地與其它實(shí)例共享為那些實(shí)例的進(jìn)度表類型所定義的活動(dòng)類型(元數(shù)據(jù))樹。但是一旦開始執(zhí)行,任何進(jìn)度表實(shí)例可通過添加新活動(dòng)或操縱聲明性規(guī)則在進(jìn)行中改變。采取這一修改的進(jìn)度表實(shí)例并“保存為”新進(jìn)度表類型,或更一般地,僅從實(shí)例中恢復(fù)序列化的表示是可能的。即,運(yùn)行的進(jìn)度表實(shí)例可被序列化,然后將其帶入任何設(shè)計(jì)器(例如,創(chuàng)作環(huán)境)或運(yùn)行時(shí)可視化工具。此外,對(duì)于高級(jí)開發(fā)者而言,將進(jìn)度表完全作為軟件代碼來創(chuàng)作是可能的。為直接創(chuàng)作進(jìn)度表類型,開發(fā)者只需在該進(jìn)度表的代碼分離類的軟件代碼中包括稱為InitializeScheduleModel(初始化進(jìn)度表模型)的方法,然后用[ScheduleCreator](進(jìn)度表創(chuàng)建器)元屬性來標(biāo)記該方法。在一個(gè)實(shí)施例中,該靜態(tài)方法不采用任何參數(shù),并返回一Schedule(進(jìn)度表)對(duì)象。沒有伴隨的序列化文件,盡管可從所創(chuàng)建的Schedule對(duì)象中恢復(fù)該進(jìn)度表的序列化表示。盡管這意味著可使用單個(gè)軟件代碼文件來開發(fā)進(jìn)度表,然而可能不在該文件上執(zhí)行確認(rèn)檢查。配合引擎編譯確保作為進(jìn)度表類型的基礎(chǔ)的活動(dòng)樹的結(jié)構(gòu)和語(yǔ)義有效性。在另一實(shí)施例中,編譯和確認(rèn)內(nèi)部地運(yùn)行,以產(chǎn)生所執(zhí)行的實(shí)際類型,而不要求任何代碼輸入。進(jìn)度表類型編譯變?yōu)橐环N非常容易的過程,因?yàn)闆]有從編譯時(shí)對(duì)象模型到運(yùn)行時(shí)對(duì)象模型的轉(zhuǎn)換。本質(zhì)上,編譯只需將進(jìn)度表的對(duì)象模型表示與代碼分離相組合以產(chǎn)生新類型。在一個(gè)實(shí)施例中,如果所編譯的代碼分離與對(duì)象模型中的活動(dòng)所需求的相匹配,對(duì)特定的進(jìn)度表可能完全沒有任何基本需求來提供任何代碼分離,或者代碼分離可能已經(jīng)以編譯的形式(程序集)存在。當(dāng)編譯序列化進(jìn)度表時(shí),指向有效地?fù)?dān)當(dāng)該進(jìn)度表的代碼分離的現(xiàn)有已編譯類型是可能的。創(chuàng)建該已編譯類型的派生類型,且該新類型擔(dān)當(dāng)代碼分離以確保創(chuàng)建了唯一的類型來表示該新進(jìn)度表。序列化體系結(jié)構(gòu)序列化基礎(chǔ)結(jié)構(gòu)提供了一種模塊化的、格式中立且容易擴(kuò)展的機(jī)制來序列化配合引擎活動(dòng)樹。具體地,調(diào)用者(例如,應(yīng)用程序或用戶)向序列化管理器請(qǐng)求對(duì)象(或活動(dòng))A的序列化器。對(duì)象A的類型的元數(shù)據(jù)元屬性將對(duì)象A綁定到所請(qǐng)求類型的序列化器。調(diào)用者然后要求序列化器序列化對(duì)象A。對(duì)象A的序列化器然后序列化對(duì)象A。對(duì)于在序列化時(shí)遇到的每一對(duì)象,序列化器向序列化管理器請(qǐng)求另外的序列化器。序列化的結(jié)果被返回給調(diào)用者。配合引擎組件模型中的每一活動(dòng)可參與序列化。在一個(gè)實(shí)施例中,序列化器組件不是活動(dòng)類本身的一部分。相反,該組件通過在與該活動(dòng)相關(guān)聯(lián)的類中注釋序列化器元屬性來指定。序列化器元屬性指向用于序列化該活動(dòng)類型的對(duì)象的類。在另一實(shí)施例中,活動(dòng)類型的提供者組件覆蓋了由該活動(dòng)提供的默認(rèn)序列化器。設(shè)計(jì)器序列化基于元數(shù)據(jù)、序列化器和序列化管理器。元數(shù)據(jù)元屬性用于將類型與序列化器相關(guān)?!俺绦蛞龑?dǎo)”元屬性可用于安裝為沒有序列化器的類型提供序列化器的對(duì)象。序列化器是知道如何序列化特定類型或類型作用域的對(duì)象。對(duì)每一數(shù)據(jù)格式存在一基類。例如,可以有知道如何將對(duì)象轉(zhuǎn)換成XML的XmlSerializer(XML序列化器)基類。本發(fā)明是獨(dú)立于任何特定序列化格式的通用體系結(jié)構(gòu)。序列化管理器是對(duì)用于序列化對(duì)象圖的所有各種序列化器提供信息存儲(chǔ)的對(duì)象。例如,五十個(gè)推想的圖可具有五十個(gè)不同的序列化器,它們都生成其自己的輸出。序列化管理器可由這些序列化器使用以在必要時(shí)彼此通信。在一個(gè)實(shí)施例中,與使用類屬對(duì)象元數(shù)據(jù)的序列化器耦合的序列化提供者的使用提供了一種回叫機(jī)制,其中,給予對(duì)象向給定類型提供序列化器的機(jī)會(huì)??赏ㄟ^諸如AddSerializationProvider(添加序列化提供者)等方法來向序列化管理器給予序列化提供者。序列化提供者可通過向序列化器添加諸如DefaultSerializationProviderAttribute(默認(rèn)序列化提供者屬性)等元屬性而被自動(dòng)添加到序列化管理器。在一個(gè)實(shí)施例中,格式由以下規(guī)則來規(guī)定對(duì)象被序列化為xml元素、對(duì)象的屬性被歸類為簡(jiǎn)單屬性(例如,序列化為xml元屬性)或復(fù)雜屬性(序列化為子元素)、以及對(duì)象的子對(duì)象被序列化為子元素。子對(duì)象的定義可在各個(gè)對(duì)象之間不同。以下示例是while活動(dòng)的序列化,它具有Send活動(dòng)作為其子對(duì)象之一。<WhileID="whilel"><ConditionRule><CodeExpressionRuleDeclaration><ExpressionName="whileCondition"/></CodeExpressionRuleDeclaration></ConditionRule><SendHasTypedChannel="True"ID="send1"><MessageName="msg1"Type="System.UInt32"/><OnBeforeSendName="onBeforeSend1"/><TypedChannelType="System.Collections.IList"Operation="AddIndex"Name="Foo"/></Send></While>在其中用于序列化的語(yǔ)言是XOML的實(shí)施例中,當(dāng)編譯進(jìn)度表時(shí),每一XOML元素被序列化成其各自的對(duì)象。對(duì)象包括簡(jiǎn)單和復(fù)雜類型兩者。接下來描述每一活動(dòng)的XOML表示之間的映射及其到創(chuàng)作對(duì)象模型的映射。XOML的序列化在原語(yǔ)(Primitive)和合成(Composite)活動(dòng)之間有所不同。原語(yǔ)活動(dòng)的簡(jiǎn)單類型被序列化為該活動(dòng)類型上的元屬性。原語(yǔ)活動(dòng)的復(fù)雜類型被序列化為子元素。作為一個(gè)示例,以下是Send活動(dòng)的XOML表示。<SendID="send1"HasTypedChannel="False"><MessageName="messagel"Type="System.String"/><UntypedChannelName="c1"/></Send>以與原語(yǔ)類型序列化類似的方式,合成活動(dòng)的簡(jiǎn)單類型被序列化為該活動(dòng)類型上的元屬性。然而,按照定義,合成活動(dòng)封裝了嵌套的活動(dòng)。每一嵌套的活動(dòng)被序列化為另一子元素。作為一個(gè)示例,以下是While活動(dòng)的XOML表示。<WhileID="whilel"><ConditionRule><CodeExpressionRule><ExpressionName="test"/></CodeExpressionRule></ConditionRule></While>過程/工作流視圖和序列化的表示之間存在強(qiáng)關(guān)系。圖9示出了可視工作流、該工作流的序列化(例如,XOML)表示以及該工作流的分離代碼之間的進(jìn)度表定義和關(guān)系。當(dāng)以任一表示創(chuàng)作時(shí),其它表示將招致改變。由此,當(dāng)開發(fā)者在XOML和過程/工作流視圖之間切換時(shí),修改活動(dòng)的XOML(或在合成活動(dòng)的情況下修改其構(gòu)成部分)直接在過程/工作流視圖中得到反映。反過來也是適用的。修改過程/工作流視圖中的活動(dòng)導(dǎo)致XOML內(nèi)的適當(dāng)修改。作為一個(gè)示例,過程/工作流中的活動(dòng)的刪除導(dǎo)致同一活動(dòng)的XOML中XML元素的移除。在過程/工作流視圖和分離的代碼之間也發(fā)生往返。在創(chuàng)建XOML代碼的過程中,如果XOML定義不符合預(yù)定義的接口要求,則在違反的XML元素下加下劃線,或用其它方式可視地向開發(fā)者標(biāo)識(shí)。如果開發(fā)者切換到過程視圖,則將向他們警告在XOML內(nèi)存在錯(cuò)誤,且設(shè)計(jì)器提供一鏈接,開發(fā)者可點(diǎn)擊該鏈接并且會(huì)被導(dǎo)航到違反的元素。該同一錯(cuò)誤出現(xiàn)在任務(wù)面板中,并且在雙擊該錯(cuò)誤之后,開發(fā)者將會(huì)被導(dǎo)航到XOML中違反的元素。從XOML文件創(chuàng)建活動(dòng)樹(反序列化)在一個(gè)實(shí)施例中,CreateEditorInstance()函數(shù)(創(chuàng)建編輯器實(shí)例)創(chuàng)建DesignSurface(設(shè)計(jì)表面)對(duì)象,然后對(duì)DesignSurface對(duì)象調(diào)用BeginLoad()函數(shù)(開始加載),向其傳遞實(shí)際的加載器對(duì)象,最終以對(duì)DesignerLoader()函數(shù)(設(shè)計(jì)器加載器)的BeginLoad()調(diào)用而結(jié)束。PerformLoad()函數(shù)(執(zhí)行加載)讀取文本緩沖區(qū)對(duì)象,并將其反序列化到配合引擎組件模型分層結(jié)構(gòu)。本發(fā)明走查該分層結(jié)構(gòu),并將活動(dòng)插入到設(shè)計(jì)表面以加載視件工作室(visualsutdio)中的組件。本發(fā)明也監(jiān)聽對(duì)XOML文件的改變以跟蹤分層結(jié)構(gòu)和項(xiàng)標(biāo)識(shí)改變,來更新視件工作室高速緩存中的值。次要文檔數(shù)據(jù)列表包括對(duì)用戶不可見的次要文檔的列表,配合引擎設(shè)計(jì)器在這些次要文檔上工作。例如,用戶尚未打開分離代碼文件,但當(dāng)用戶在配合引擎設(shè)計(jì)器中做出改變時(shí),對(duì)該分離代碼文件做出改變是可能的。由于該文件對(duì)用戶是不可見的,因此該文件作為次要文檔來維護(hù)。只要保存XOML文件,就自動(dòng)保存次要文檔。如果這些文件之一的名字改變,或者文件被刪除,則本發(fā)明相應(yīng)地更新對(duì)應(yīng)的次要文檔對(duì)象。對(duì)象樹的示例性反序列化準(zhǔn)則如下。xml元素首先作為父對(duì)象的屬性來處理。如果父對(duì)象沒有具有該元素標(biāo)簽名的屬性,則該元素作為父對(duì)象的子對(duì)象來處理。xml元屬性作為父對(duì)象上的簡(jiǎn)單屬性來處理。在適用上述序列化代碼的一個(gè)示例性反序列化中,<While>元素作為適用xml名字空間信息創(chuàng)建的對(duì)象來處理。<ConditionRule>元素作為While活動(dòng)的屬性來處理。<CodeExpressionRuleDeclaration>元素作為其值將被應(yīng)用于ConditionRule屬性的對(duì)象來處理。<Send>元素首先作為While活動(dòng)的屬性來嘗試,但“While”活動(dòng)沒有具有名字為“Send”的屬性,因此<Send>元素作為對(duì)象來處理,并作為子活動(dòng)添加到while活動(dòng)。<Message>元素作為Send活動(dòng)的屬性來處理。由于Send上的Message屬性是只讀的,因此Message元素的內(nèi)容被認(rèn)為是Message對(duì)象的內(nèi)容。類似的規(guī)則也適用于<OnBeforeSend>和<TypedChannel>元素的反序列化。在以下條件下,XOML反序列化將會(huì)嚴(yán)重失敗XOML代碼不是良好形成的、XomlDocument不是XOML代碼中的第一個(gè)元素、以及XOML代碼中的第一個(gè)活動(dòng)不能被反序列化。將向開發(fā)者呈現(xiàn)出錯(cuò)消息,當(dāng)從XOML視圖切換到過程/工作流視圖時(shí),通過該消息他們可被導(dǎo)航到違反的XML元素。主宿配合引擎設(shè)計(jì)器設(shè)計(jì)器框架可被主宿在任何應(yīng)用程序中。這對(duì)于第三方應(yīng)用程序要在其各自的環(huán)境中呈現(xiàn)工作流而言是非常有用的特征。它也允許第三方通過重新主宿和定址設(shè)計(jì)器表面來開發(fā)關(guān)于配合引擎設(shè)計(jì)器的工具。本發(fā)明的框架期望主宿容器應(yīng)用程序能夠提供諸如編輯器和/或文本緩沖區(qū)等一組服務(wù)。重新主宿設(shè)計(jì)器的一個(gè)步驟是創(chuàng)建加載器和設(shè)計(jì)表面。加載器負(fù)責(zé)加載XOML文件,并構(gòu)造維護(hù)活動(dòng)的設(shè)計(jì)器宿主基礎(chǔ)結(jié)構(gòu)。設(shè)計(jì)表面維護(hù)其中的設(shè)計(jì)器宿主基礎(chǔ)結(jié)構(gòu),并向宿主提供服務(wù)且與設(shè)計(jì)表面交互。設(shè)計(jì)表面擔(dān)當(dāng)服務(wù)容器以及服務(wù)提供者。在一個(gè)示例中,執(zhí)行以下代碼來加載XOML文檔并構(gòu)造維護(hù)其中的活動(dòng)的設(shè)計(jì)器宿主。this.loader.XomlFile=filePath;if(this.surface.IsLoaded==false)this.surface.BeginLoad(this.loader);以下服務(wù)啟用了設(shè)計(jì)器中的不同函數(shù)。ISelectionService函數(shù)(選擇服務(wù))維護(hù)所選中的對(duì)象。IToolboxService函數(shù)(工具箱服務(wù))管理與工具箱的交互。IMenuCommandService函數(shù)(菜單命令服務(wù))管理與菜單的交互。ITypeProvider函數(shù)(類型提供者)啟用類型系統(tǒng)。另外,可以有由設(shè)計(jì)器主宿環(huán)境提供的其它服務(wù),以啟用高級(jí)的設(shè)計(jì)器特征。類型流是本發(fā)明的組件模型框架中的一個(gè)組件。當(dāng)設(shè)計(jì)器主宿在項(xiàng)目系統(tǒng)內(nèi)部時(shí),在每一項(xiàng)目的基礎(chǔ)上創(chuàng)建TypeProvider(類型提供者)對(duì)象。項(xiàng)目中的程序集引用被壓入類型提供者。此外,對(duì)項(xiàng)目中的用戶代碼文件進(jìn)行語(yǔ)法分析,并創(chuàng)建單個(gè)代碼編譯且將其壓入類型提供者。同樣,本發(fā)明監(jiān)聽項(xiàng)目系統(tǒng)中將導(dǎo)致類型系統(tǒng)中的類型改變的事件,并響應(yīng)于改變對(duì)類型提供者做出適當(dāng)?shù)恼{(diào)用來重新加載類型。撤消/恢復(fù)在創(chuàng)建且正確地構(gòu)造了進(jìn)度表之后,開發(fā)者可能希望回退一系列已執(zhí)行的操作。本發(fā)明的撤消和恢復(fù)功能提供了可視的反饋,它示出了哪一活動(dòng)被直接影響。例如,當(dāng)撤消活動(dòng)上的屬性時(shí),被影響的活動(dòng)變?yōu)檫x中。當(dāng)撤消多個(gè)對(duì)象的刪除時(shí),當(dāng)被恢復(fù)到進(jìn)度表時(shí),所涉及的所有對(duì)象變?yōu)檫x中。撤消/恢復(fù)是在其它領(lǐng)域的許多應(yīng)用程序中使用的常見特征,且其意義是被普遍理解的。在配合引擎設(shè)計(jì)器中,撤消/恢復(fù)項(xiàng)在保存時(shí)不被清除。此外,撤消/恢復(fù)可在過程/工作流視圖中、XOML視圖中、當(dāng)開發(fā)者在視圖之間切換時(shí)、以及在分離代碼中執(zhí)行。對(duì)過程/工作流視圖中的以下動(dòng)作提供了撤消/恢復(fù)活動(dòng)拖放(例如,將活動(dòng)從工具箱拖到設(shè)計(jì)表面、將活動(dòng)從進(jìn)度表的一部分移到另一部分、以及將活動(dòng)從一個(gè)設(shè)計(jì)器移到另一設(shè)計(jì)器)、活動(dòng)的配置(例如,指定活動(dòng)的屬性)、以及剪切/復(fù)制/粘貼/刪除。在一個(gè)實(shí)施例中,序列化的視圖(例如,XOML)視圖是提供文本編輯器的標(biāo)準(zhǔn)撤消/恢復(fù)操作的XML編輯器。本發(fā)明的設(shè)計(jì)器向開發(fā)者提供了反饋,指示過程/工作流視圖中做出改變?nèi)缓笤谛蛄谢晥D中撤消將導(dǎo)致序列化代碼的丟失。當(dāng)開發(fā)者在過程/工作流視圖中構(gòu)造進(jìn)度表的一部分時(shí),切換到序列化視圖然后決定執(zhí)行撤消/恢復(fù)操作,將出現(xiàn)警告。示例性操作環(huán)境圖10以計(jì)算機(jī)130的形式示出了通用計(jì)算設(shè)備的一個(gè)示例。在本發(fā)明的一個(gè)實(shí)施例中,諸如計(jì)算機(jī)130等計(jì)算機(jī)適用于此處所示和所描述的其它附圖。計(jì)算機(jī)130具有一個(gè)或多個(gè)處理器或處理單元132以及系統(tǒng)存儲(chǔ)器134。在所示的實(shí)施例中,系統(tǒng)總線136將包括系統(tǒng)存儲(chǔ)器134的各種系統(tǒng)組件耦合至處理器132??偩€136表示若干類型總線結(jié)構(gòu)的任一種的一個(gè)或多個(gè),包括存儲(chǔ)器總線或存儲(chǔ)器控制器、外圍總線、加速圖形端口、以及使用各種總線體系結(jié)構(gòu)的任一種的處理器或局部總線。作為示例而非局限,這類體系結(jié)構(gòu)包括工業(yè)標(biāo)準(zhǔn)體系結(jié)構(gòu)(ISA)總線、微通道體系結(jié)構(gòu)(MCA)總線、增強(qiáng)ISA(EISA)總線、視頻電子技術(shù)標(biāo)準(zhǔn)協(xié)會(huì)(VESA)局部總線以及外圍部件互連(PCI)總線,也稱為Mezzanine總線。計(jì)算機(jī)130通常具有至少某種形式的計(jì)算機(jī)可讀介質(zhì)。計(jì)算機(jī)可讀介質(zhì)可以是可由計(jì)算機(jī)130訪問的任何可用介質(zhì),可包括易失性和非易失性介質(zhì)、可移動(dòng)和不可移動(dòng)介質(zhì)。作為示例而非局限,計(jì)算機(jī)可讀介質(zhì)包括計(jì)算機(jī)存儲(chǔ)介質(zhì)和通信介質(zhì)。計(jì)算機(jī)存儲(chǔ)介質(zhì)包括以用于儲(chǔ)存諸如計(jì)算機(jī)可讀指令、數(shù)據(jù)結(jié)構(gòu)、程序模塊或其它數(shù)據(jù)等信息的任一方法或技術(shù)實(shí)現(xiàn)的易失性和非易失性,可移動(dòng)和不可移動(dòng)介質(zhì)。例如,計(jì)算機(jī)存儲(chǔ)介質(zhì)包括RAM、ROM、EEPROM、閃存或其它存儲(chǔ)器技術(shù)、CD-ROM、數(shù)字多功能盤(DVD)或其它光盤存儲(chǔ)、磁盒、磁帶、磁盤存儲(chǔ)或其它磁存儲(chǔ)設(shè)備、或可以用來儲(chǔ)存所期望的信息并可由計(jì)算機(jī)130訪問的任一其它介質(zhì)。通信介質(zhì)通常具體化為諸如載波或其它傳輸機(jī)制的已調(diào)制數(shù)據(jù)信號(hào)中的計(jì)算機(jī)可讀指令、數(shù)據(jù)結(jié)構(gòu)、程序模塊或其它數(shù)據(jù),并包括任一信息傳送介質(zhì)。本領(lǐng)域的技術(shù)人員熟悉已調(diào)制數(shù)據(jù)信號(hào),它以對(duì)信號(hào)中的信息進(jìn)行編碼的方式設(shè)置或改變其一個(gè)或多個(gè)特征。有線介質(zhì),如有線網(wǎng)絡(luò)或直接連線連接,以及無線介質(zhì),如聲學(xué)、RF、紅外和其它無線介質(zhì),都是通信介質(zhì)的示例。上述任一的組合也應(yīng)當(dāng)包括在計(jì)算機(jī)可讀介質(zhì)的作用域之內(nèi)。系統(tǒng)存儲(chǔ)器134包括易失性和/或非易失性存儲(chǔ)器形式的計(jì)算機(jī)存儲(chǔ)介質(zhì)。在所示的實(shí)施例中,系統(tǒng)存儲(chǔ)器134包括只讀存儲(chǔ)器(ROM)138和隨機(jī)存取存儲(chǔ)器(RAM)140?;据斎?輸出系統(tǒng)142(BIOS)包括如在啟動(dòng)時(shí)幫助在計(jì)算機(jī)130內(nèi)的元件之間傳輸信息的基本例程,通常儲(chǔ)存在ROM138中。RAM140通常包含處理單元132立即可訪問或者當(dāng)前正在操作的數(shù)據(jù)和/或程序模塊。作為示例而非局限,圖10示出了操作系統(tǒng)144、應(yīng)用程序146、其它程序模塊148和程序數(shù)據(jù)150。計(jì)算機(jī)130也可包括其它可移動(dòng)/不可移動(dòng)、易失性/非易失性計(jì)算機(jī)存儲(chǔ)介質(zhì)。例如,圖10示出了對(duì)不可移動(dòng)、非易失性磁介質(zhì)進(jìn)行讀寫的硬盤驅(qū)動(dòng)器154。圖10也示出了對(duì)可移動(dòng)、非易失性磁盤158進(jìn)行讀寫的磁盤驅(qū)動(dòng)器156以及對(duì)可移動(dòng)、非易失性光盤162,如CDROM或其它光介質(zhì)進(jìn)行讀寫的光盤驅(qū)動(dòng)器160??梢栽谑纠圆僮鳝h(huán)境中使用的其它可移動(dòng)/不可移動(dòng)、易失性/非易失性計(jì)算機(jī)存儲(chǔ)介質(zhì)包括但不限于,磁帶盒、閃存卡、數(shù)字多功能盤、數(shù)字視頻帶、固態(tài)RAM、固態(tài)ROM等等。硬盤驅(qū)動(dòng)器154、磁盤驅(qū)動(dòng)器156和光盤驅(qū)動(dòng)器160通常通過非易失性存儲(chǔ)器接口,如接口160連接到系統(tǒng)總線136。上文討論并在圖10示出的驅(qū)動(dòng)器及其關(guān)聯(lián)的計(jì)算機(jī)存儲(chǔ)介質(zhì)為計(jì)算機(jī)130提供了計(jì)算機(jī)可讀指令、數(shù)據(jù)結(jié)構(gòu)、程序模塊和其它數(shù)據(jù)的存儲(chǔ)。例如,在圖10中,示出硬盤驅(qū)動(dòng)器154儲(chǔ)存操作系統(tǒng)170、應(yīng)用程序172、其它程序模塊174和程序數(shù)據(jù)176。注意,這些組件可以與操作系統(tǒng)144、應(yīng)用程序146、其它程序模塊148和程序數(shù)據(jù)150相同,也可以與它們不同。這里對(duì)操作系統(tǒng)170、應(yīng)用程序172、其它程序模塊174和程序數(shù)據(jù)176給予不同的標(biāo)號(hào)來說明至少它們是不同的副本。用戶可以通過輸入設(shè)備或用戶界面選擇設(shè)備,如鍵盤180和定位設(shè)備182(例如,鼠標(biāo)、跟蹤球或觸摸墊)向計(jì)算機(jī)130輸入命令和信息。其它輸入設(shè)備(未示出)可包括麥克風(fēng)、操縱桿、游戲墊、圓盤式衛(wèi)星天線、掃描儀等等。這些和其它輸入設(shè)備通常通過耦合至系統(tǒng)總線136的用戶輸入接口184連接至處理單元132,但是也可以通過其它接口和總線結(jié)構(gòu)連接,如并行端口、游戲端口或通用串行總線(USB)。監(jiān)視器188或其它類型的顯示設(shè)備也通過接口,如視頻接口190連接至系統(tǒng)總線136。除監(jiān)視器188之外,計(jì)算機(jī)通常包括其它外圍輸出設(shè)備(未示出),如打印機(jī)和揚(yáng)聲器,它們可通過輸出外圍接口(未示出)連接。計(jì)算機(jī)130可以使用到一個(gè)或多個(gè)遠(yuǎn)程計(jì)算機(jī),如遠(yuǎn)程計(jì)算機(jī)194的邏輯連接在網(wǎng)絡(luò)化環(huán)境中操作。遠(yuǎn)程計(jì)算機(jī)194可以是個(gè)人計(jì)算機(jī)、服務(wù)器、路由器、網(wǎng)絡(luò)PC、對(duì)等設(shè)備或其它普通網(wǎng)絡(luò)節(jié)點(diǎn),并通常包括許多或所有相對(duì)于計(jì)算機(jī)130所描述的元件。圖10描述的邏輯連接包括局域網(wǎng)(LAN)196和廣域網(wǎng)(WAN)198,但也可包括其它網(wǎng)絡(luò)。LAN136和/或WAN138可以是有線網(wǎng)絡(luò)、無線網(wǎng)絡(luò)、其組合等等。這類網(wǎng)絡(luò)環(huán)境常見于辦公室、企業(yè)作用域計(jì)算機(jī)網(wǎng)絡(luò)、內(nèi)聯(lián)網(wǎng)以及全球計(jì)算機(jī)網(wǎng)絡(luò)(例如,因特網(wǎng))。當(dāng)在局域網(wǎng)網(wǎng)絡(luò)環(huán)境中使用時(shí),計(jì)算機(jī)130通過網(wǎng)絡(luò)接口或適配器186連接至LAN196。當(dāng)在廣域網(wǎng)網(wǎng)絡(luò)環(huán)境中使用時(shí),計(jì)算機(jī)130通常包括調(diào)制解調(diào)器178或用于通過WAN198,如因特網(wǎng)建立通信的其它裝置。調(diào)制解調(diào)器178可以是內(nèi)置或外置的,它通過用戶輸入接口184或其它適當(dāng)?shù)臋C(jī)制連接至系統(tǒng)總線136。在網(wǎng)絡(luò)化環(huán)境中,相對(duì)于計(jì)算機(jī)130所描述的程序模塊或其部分可儲(chǔ)存在遠(yuǎn)程存儲(chǔ)器存儲(chǔ)設(shè)備(未示出)中。作為示例而非局限,圖10示出遠(yuǎn)程應(yīng)用程序192駐留在存儲(chǔ)器設(shè)備上。示出的網(wǎng)絡(luò)連接是示例性的,也可以使用在計(jì)算機(jī)之間建立通信鏈路的其它裝置。一般而言,計(jì)算機(jī)130的數(shù)據(jù)處理器通過在不同的時(shí)刻儲(chǔ)存在計(jì)算機(jī)的各種計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)中的指令來編程。例如,程序和操作系統(tǒng)通常分布在軟盤或CD-ROM上。從那里,它們被安裝或加載到計(jì)算機(jī)的次級(jí)存儲(chǔ)器中。在執(zhí)行時(shí),它們被至少部分地加載到計(jì)算機(jī)的初級(jí)電子存儲(chǔ)器中。此處描述的本發(fā)明包括這些和其它各種類型的計(jì)算機(jī)可讀存儲(chǔ)介質(zhì),這些介質(zhì)包含用于實(shí)現(xiàn)以下結(jié)合微處理器或其它數(shù)據(jù)處理器描述的步驟的指令。當(dāng)依照此處描述的方法和技術(shù)編程時(shí),本發(fā)明也包括計(jì)算機(jī)本身。為說明起見,諸如操作系統(tǒng)等程序和其它可執(zhí)行程序組件在此被示出為離散的框。然而,可以認(rèn)識(shí)到,這些程序和組件在不同的時(shí)刻駐留在計(jì)算機(jī)的不同存儲(chǔ)組件中,且由計(jì)算機(jī)的數(shù)據(jù)處理器執(zhí)行。盡管結(jié)合包括計(jì)算機(jī)130的示例性計(jì)算系統(tǒng)環(huán)境來描述,然而本發(fā)明也可用眾多其它通用或?qū)S糜?jì)算系統(tǒng)環(huán)境或配置來操作。該計(jì)算系統(tǒng)環(huán)境并非對(duì)本發(fā)明的使用作用域或功能提出任何局限。此外,該計(jì)算環(huán)境不應(yīng)當(dāng)被解釋為對(duì)示例性操作環(huán)境中所示的組件的任一個(gè)或其組合具有任何依賴性或要求??蛇m用于本發(fā)明的公知的計(jì)算系統(tǒng)、環(huán)境和/或配置的示例可包括,但不限于,個(gè)人計(jì)算機(jī)、服務(wù)器計(jì)算機(jī)、手持式或膝上設(shè)備、多處理器系統(tǒng)、基于微處理器的系統(tǒng)、機(jī)頂盒、可編程消費(fèi)者電子產(chǎn)品、移動(dòng)電話、網(wǎng)絡(luò)PC、小型機(jī)、大型計(jì)算機(jī)、包括上述系統(tǒng)或設(shè)備的任一個(gè)的分布式計(jì)算環(huán)境等等。本發(fā)明可以在諸如由一個(gè)或多個(gè)計(jì)算機(jī)或其它設(shè)備執(zhí)行的程序模塊等計(jì)算機(jī)可執(zhí)行指令的一般上下文環(huán)境中描述。一般而言,程序模塊包括但不限于,例程、程序、對(duì)象、組件、數(shù)據(jù)結(jié)構(gòu)等等,它們執(zhí)行特定的任務(wù)或?qū)崿F(xiàn)特定的抽象數(shù)據(jù)類型。本發(fā)明也可以在分布式計(jì)算環(huán)境中實(shí)踐,其中,任務(wù)由通過通信網(wǎng)絡(luò)連接的遠(yuǎn)程處理設(shè)備來執(zhí)行。在分布式計(jì)算環(huán)境中,程序模塊可以位于包括存儲(chǔ)器存儲(chǔ)設(shè)備的本地和遠(yuǎn)程計(jì)算機(jī)存儲(chǔ)介質(zhì)中。軟件體系結(jié)構(gòu)上下文中的接口包括軟件模塊、組件、代碼部分或其它計(jì)算機(jī)可執(zhí)行指令序列。例如,接口包括訪問第二模塊的第一模塊,以代表該第一模塊執(zhí)行任務(wù)。在一個(gè)示例中,第一和第二模塊包括諸如由操作系統(tǒng)提供的應(yīng)用程序編程接口(API)、組件對(duì)象模型(COM)接口(例如,用于對(duì)等應(yīng)用程序通信)、以及可擴(kuò)展標(biāo)記語(yǔ)言元數(shù)據(jù)互換格式(XMI)的接口(例如,用于web服務(wù)之間的通信)。接口可以是緊耦合的同步實(shí)現(xiàn),諸如Java2平臺(tái)企業(yè)版(J2EE)中、COM或分布式COM(DCOM)示例。作為替換或除此之外,接口可以是松耦合的異步實(shí)現(xiàn),諸如web服務(wù)中(例如,使用簡(jiǎn)單對(duì)象訪問協(xié)議)。一般而言,接口包括以下特征的任一組合緊耦合、松耦合、同步和異步。此外,接口可以符合標(biāo)準(zhǔn)協(xié)議、專有協(xié)議或標(biāo)準(zhǔn)和專有協(xié)議的任一組合。此處描述的接口可以都是單個(gè)接口的一部分,或可以被實(shí)現(xiàn)為單獨(dú)的接口或其中的任何組合。接口可以本地或遠(yuǎn)程地執(zhí)行以提供功能。此外,接口可包括比所示或所描述的更多或更少的功能。此處所示和描述的方法的執(zhí)行或?qū)崿F(xiàn)的順序不是關(guān)鍵的,除非另外指定。即,方法的各元素可以用任何順序執(zhí)行,除非另外指定,并且方法可包括比此處所解釋的更多或更少的元素。例如,在本發(fā)明的范圍內(nèi)可以構(gòu)想,可以另一元素之前、與其同時(shí)或在其之后執(zhí)行特定元素。當(dāng)介紹本發(fā)明或其實(shí)施例的元素時(shí),冠詞“一”、“一個(gè)”、“該”和“所述”意指存在一個(gè)或多個(gè)元素。術(shù)語(yǔ)“包含”、“包括”或“具有”旨在包括性的,且意味著除所列出的元素之外還可以有其它元素。鑒于以上內(nèi)容,可以看到,可以實(shí)現(xiàn)本發(fā)明的若干目標(biāo)并且可以達(dá)到其它有利的結(jié)果。由于可以在以上構(gòu)造、產(chǎn)品和方法中做出各種改變而不脫離本發(fā)明的范圍,因此預(yù)期以上描述中包含且在附圖中示出的所有內(nèi)容都應(yīng)當(dāng)在說明性而非限制性的意義上解釋。附錄A示例性活動(dòng)及其示例性實(shí)現(xiàn)示例性活動(dòng)包括以下活動(dòng)Send(發(fā)送)、SendRequest(發(fā)送請(qǐng)求)、SendResponse(發(fā)送響應(yīng))、Receive(接收)、ReceiveRequest(接收請(qǐng)求)、ReceiveResponse(接收響應(yīng))、Code(代碼)、Delay(延遲)、Fault(錯(cuò)誤)、Suspend(掛起)、Terminate(終止)、InvokeSchedule(調(diào)用進(jìn)度表)、InvokeSchedules(調(diào)用多個(gè)進(jìn)度表)、InvokeWebService(調(diào)用web服務(wù))、DotNetEventSource(.NET事件源)、DotNetEventSink(.NET事件宿)、Sequence(順序)、Parallel(并行)、While、ConditionalBranch(條件分支)、Conditional(條件)、Constrained(約束)、ConstrainedActivityGroup(約束活動(dòng)組)(CAG)、EventDriven(事件驅(qū)動(dòng))、Listen(監(jiān)聽)、EventHandlers(事件處理程序)、ExceptionHandler(異常處理程序)、ExceptionHandlers(多個(gè)異常處理程序)、Compensate(補(bǔ)償)、CompensationHandler(補(bǔ)償處理程序)、Scope(作用域)以及Schedule(進(jìn)度表)。每一示例性活動(dòng)具有與其相關(guān)聯(lián)的元數(shù)據(jù)。元數(shù)據(jù)由與該活動(dòng)相關(guān)聯(lián)的序列化器傳輸?shù)焦ぷ髁鞯穆暶餍员硎?。例如,元?shù)據(jù)可包括可任選的代碼分離方法以及可任選的相關(guān)集集合。Send活動(dòng)配合引擎提供用于發(fā)送消息的三種活動(dòng)(例如,Send、SendRequest以及SendResponse),其每一個(gè)著重于一個(gè)不同的使用情況。另外,由于三個(gè)活動(dòng)共享某一元數(shù)據(jù),因此定義了一抽象基類并將其用作所有三個(gè)活動(dòng)的超類。Receive活動(dòng)配合引擎提供了用于接收消息的三種活動(dòng)(例如,Receive、ReceiveRequest以及ReceiveResponse),其每一個(gè)著重于一個(gè)不同的使用情況。另外,由于三個(gè)活動(dòng)共享某一元數(shù)據(jù),因此定義了一抽象基類并將其用作所有三個(gè)活動(dòng)的超類。CodeCode活動(dòng)執(zhí)行元數(shù)據(jù)中指示的代碼分離方法。DelayDelay活動(dòng)執(zhí)行其強(qiáng)制的代碼分離方法來生成DateTime(日期時(shí)間)值。它內(nèi)部地將其實(shí)例上的TimeoutValue(超時(shí)值)屬性設(shè)為該值。如果DateTime是過去的,則Delay立即完成。否則,它設(shè)置一定時(shí)器預(yù)定,使得當(dāng)定時(shí)器激發(fā)時(shí)將通知Delay。當(dāng)定時(shí)器激發(fā)時(shí),通知Delay并且它完成。FaultFault活動(dòng)執(zhí)行其強(qiáng)制的代碼分離方法來生成Exception(異常)對(duì)象。它然后拋出該異常。SuspendSuspend活動(dòng)掛起當(dāng)前的進(jìn)度表實(shí)例。TerminateTerminate活動(dòng)終止當(dāng)前的進(jìn)度表實(shí)例。InvokeScheduleInvokeSchedule活動(dòng)調(diào)用進(jìn)度表。InvokeWebService通過代理類調(diào)用web服務(wù),轉(zhuǎn)遞和接收所指定的參數(shù)。DotNetEventSink阻斷由先前調(diào)用的進(jìn)度表實(shí)例引發(fā)的指定事件的等待通知。DotNetEventSource引發(fā)所指定的事件,并立即完成執(zhí)行。SequenceSequence活動(dòng)以有序的方式協(xié)調(diào)一組子活動(dòng)的執(zhí)行,每次一個(gè)。ParallelParallel活動(dòng)并發(fā)地執(zhí)行一組子活動(dòng)。While迭代地執(zhí)行子活動(dòng)。ConditionBranch對(duì)每一Sequence語(yǔ)義執(zhí)行子活動(dòng)。ConditionalConditional活動(dòng)包含一組有序的ConditionalBranch活動(dòng)。Constrained為了將活動(dòng)添加到約束活動(dòng)組CAG而包裝該活動(dòng)。元數(shù)據(jù)被包裝活動(dòng)的啟用規(guī)則。被包裝活動(dòng)的禁用規(guī)則。運(yùn)行時(shí)屬性表示被包裝活動(dòng)是否已經(jīng)至少完成一次的整數(shù)。執(zhí)行Constrained活動(dòng)唯一被允許的父對(duì)象是CAG。CAG本身使用Constrained活動(dòng)上的啟用和禁用規(guī)則來確定何時(shí)執(zhí)行它。當(dāng)CAG告訴Constrained活動(dòng)要執(zhí)行時(shí),它只是執(zhí)行它所包裝的活動(dòng)。Performed(已執(zhí)行)屬性在Constrained活動(dòng)結(jié)束其執(zhí)行時(shí)遞增。只有在父CAG本身被重新執(zhí)行時(shí)(例如在WhileLoop或者第二個(gè)外部CAG內(nèi)時(shí))才被復(fù)位為零。CAG(ConstrainedActivityGroup)提供對(duì)一組子Constrained活動(dòng)的基于約束的執(zhí)行。元數(shù)據(jù)完成規(guī)則。執(zhí)行CAG只包含Constrained活動(dòng)。當(dāng)CAG執(zhí)行時(shí),它基于對(duì)其啟用和禁用約束的求值執(zhí)行(并且重新執(zhí)行)子活動(dòng)。子活動(dòng)只有在其啟用規(guī)則求值為真并且其禁用規(guī)則求值為假時(shí)才能由CAG執(zhí)行。在一個(gè)實(shí)施例中,CAG步查其子樹并預(yù)定對(duì)所有活動(dòng)的活動(dòng)狀態(tài)改變(這將在調(diào)用邊界停止)。CAG添加預(yù)訂,只要活動(dòng)被動(dòng)態(tài)地添加到其子樹。CAG根據(jù)進(jìn)度表邊界預(yù)訂對(duì)其包圍的作用域和所有父作用域的數(shù)據(jù)改變。這些預(yù)訂是通過分析CAG中所有Constrained活動(dòng)上的啟用和禁用規(guī)則來確定的。引擎?zhèn)魉统膳臄?shù)據(jù)改變通知,并且CAG決定對(duì)哪些規(guī)則求值。注意,由被調(diào)用的進(jìn)度表作出的數(shù)據(jù)改變?cè)谡{(diào)用完成時(shí)發(fā)送。本發(fā)明還標(biāo)識(shí)作用域變量依賴性,即使那些變量是通過代碼分離方法間接訪問的。因此,有可能非常明確地確定在一個(gè)變量改變時(shí)應(yīng)該重新對(duì)哪些約束求值。該同一機(jī)制對(duì)聲明性和代碼規(guī)則兩者起作用。如果Constrained活動(dòng)沒有啟用規(guī)則,則它總是取為真。如果Constrained活動(dòng)沒有禁用規(guī)則,則它總是取為Performed>0。因而,如果在Constrained活動(dòng)上沒有指定規(guī)則,則在CAG執(zhí)行時(shí)立即執(zhí)行它,并且它永遠(yuǎn)不會(huì)被重新執(zhí)行。同樣,如果只在Constrained活動(dòng)上提供一個(gè)自定義啟用規(guī)則,則它在啟用規(guī)則求值為真時(shí)執(zhí)行,并且它只執(zhí)行那一次。如果需要基于約束的重新執(zhí)行,則應(yīng)當(dāng)提供適當(dāng)?shù)淖远x禁用規(guī)則,以及適當(dāng)?shù)膯⒂靡?guī)則。下面的表示出了執(zhí)行Constrained活動(dòng)所需的條件。表A1.Constrained活動(dòng)執(zhí)行如果在活動(dòng)的執(zhí)行期間,該活動(dòng)的禁用規(guī)則求值為真,則CAG取消該活動(dòng)的執(zhí)行。這不排除該活動(dòng)的重新執(zhí)行。一旦CAG的完成規(guī)則求值為真,CAG立即取消任何當(dāng)前正在執(zhí)行的子活動(dòng),并且隨后它自己完成。只要有必要,基于其數(shù)據(jù)和狀態(tài)改變依賴性對(duì)規(guī)則(例如,啟用、禁用、完成)求值。CAG提供兩種操作模式預(yù)覽(Preview)和編輯(Edit)。如果CAG設(shè)計(jì)器處在預(yù)覽模式,則開發(fā)者只能選擇出現(xiàn)在幻燈片中的活動(dòng)。屬性瀏覽器在開發(fā)者選中任何活動(dòng)時(shí)展示啟用和禁用規(guī)則選項(xiàng)。這使開發(fā)者能夠用CAG為每個(gè)活動(dòng)設(shè)置啟用和禁用規(guī)則。如果CAG設(shè)計(jì)器處在設(shè)計(jì)模式,則開發(fā)者能夠在預(yù)覽窗口中的活動(dòng)(稱為Constrained)上點(diǎn)擊。屬性瀏覽器除由特定活動(dòng)正常展示的屬性之外還顯示啟用和禁用規(guī)則選項(xiàng)(如類似于預(yù)覽模式)。CAG設(shè)計(jì)器提供以下所示的附加上下文菜單選項(xiàng)預(yù)覽活動(dòng)給定一個(gè)選中的活動(dòng),CAG將從設(shè)計(jì)模式切換到預(yù)覽模式。編輯活動(dòng)給定一個(gè)選中的活動(dòng),CAG將從預(yù)覽模式切換到設(shè)計(jì)模式。查看前一的活動(dòng)移動(dòng)到緊靠幻燈片中當(dāng)前選中的活動(dòng)之前的活動(dòng)。當(dāng)?shù)竭_(dá)CAG幻燈片中的第一個(gè)活動(dòng)時(shí),該菜單選項(xiàng)被禁用。查看下一的活動(dòng)移動(dòng)到緊靠幻燈片中當(dāng)前選中的活動(dòng)之后的活動(dòng)。當(dāng)?shù)竭_(dá)CAG幻燈片中的最后一個(gè)活動(dòng)時(shí),該菜單選項(xiàng)被禁用。在一個(gè)實(shí)施例中,CAG內(nèi)的每個(gè)活動(dòng)被包裝在一“Constrained活動(dòng)”內(nèi)。這隨后通過CAG的幻燈片向開發(fā)者展示。如果CAG處在預(yù)覽模式且開發(fā)者選中該活動(dòng)并復(fù)制它,則在一個(gè)實(shí)施例中可貼粘它的唯一地點(diǎn)(并且因而啟用作為結(jié)果的上下文菜單)是在另一個(gè)CAG內(nèi)。然而,如果開發(fā)者切換CAG模式到“設(shè)計(jì)”并且選擇預(yù)覽窗格內(nèi)的活動(dòng),則以與其它活動(dòng)相似的方式啟用復(fù)制/粘貼和拖放。Task對(duì)由一個(gè)或多個(gè)主體執(zhí)行的工作的外部單元建模。EventDriven包裝其執(zhí)行由“事件”活動(dòng)觸發(fā)的活動(dòng)。Listen條件地執(zhí)行EventDriven活動(dòng)的n個(gè)子活動(dòng)之一。EventHandlersEventHandlers活動(dòng)簡(jiǎn)單地持有一組EventDriven活動(dòng),以供相關(guān)聯(lián)的Scope使用。ExceptionHandler用表示作用域的捕捉塊(catchblock)的元數(shù)據(jù)包裝活動(dòng)。ExceptionHandlers包裝一組有序的ExceptionHandler活動(dòng)。Compensate補(bǔ)償已完成的子作用域。CompensationHandler包裝被定義為用于作用域的補(bǔ)償處理程序的子活動(dòng)。Scope作用域是事務(wù)邊界;異常處理邊界;補(bǔ)償邊界;事件處理邊界;以及消息、變量、相關(guān)集以及通道聲明(即,共享數(shù)據(jù)狀態(tài))的邊界、Scope內(nèi)活動(dòng)的執(zhí)行是順序的,并且由此,當(dāng)構(gòu)造作用域時(shí),所包含的活動(dòng)是明確地排序的,如同在Sequence中一樣。ScheduleSchedule是配合引擎將執(zhí)行的唯一頂層活動(dòng)。CompositeActivities允許控制流的補(bǔ)償活動(dòng)類型是Sequence、Parallel、Constrained、ActivityGroup、Conditional、While、Listen。另外,Scope和Schedule是擔(dān)當(dāng)容器的補(bǔ)償活動(dòng)類型,該容器具有其中的活動(dòng)的隱含排序。權(quán)利要求1.一種表示工作流模型的計(jì)算機(jī)實(shí)現(xiàn)的系統(tǒng),所述計(jì)算機(jī)實(shí)現(xiàn)的系統(tǒng)包括具有多個(gè)結(jié)構(gòu)化活動(dòng)的工作流,所述工作流還包括多個(gè)非結(jié)構(gòu)化活動(dòng),所述非結(jié)構(gòu)化活動(dòng)的每一個(gè)具有與其相關(guān)聯(lián)的約束;用于通過以下步驟執(zhí)行所述工作流的運(yùn)行時(shí)引擎執(zhí)行所述多個(gè)結(jié)構(gòu)化活動(dòng)的每一個(gè);對(duì)所述多個(gè)非結(jié)構(gòu)化活動(dòng)的每一個(gè)評(píng)估約束;以及將與其相關(guān)聯(lián)的約束的評(píng)估作為函數(shù)來執(zhí)行所述多個(gè)非結(jié)構(gòu)化活動(dòng)的每一個(gè)。2.如權(quán)利要求1所述的計(jì)算機(jī)實(shí)現(xiàn)的系統(tǒng),其特征在于,所述約束包括完成語(yǔ)義。3.如權(quán)利要求1所述的計(jì)算機(jī)實(shí)現(xiàn)的系統(tǒng),其特征在于,所述約束具有輸入?yún)?shù),并且其中,所述運(yùn)行時(shí)引擎還通過以下步驟執(zhí)行所述工作流識(shí)別所述輸入?yún)?shù)中的變化;以及重新評(píng)估所述約束。4.如權(quán)利要求1所述的計(jì)算機(jī)實(shí)現(xiàn)的系統(tǒng),其特征在于,所述多個(gè)結(jié)構(gòu)化活動(dòng)中的一個(gè)包括所述多個(gè)非結(jié)構(gòu)化活動(dòng)中的一個(gè)。5.如權(quán)利要求1所述的計(jì)算機(jī)實(shí)現(xiàn)的系統(tǒng),其特征在于,還包括顯示區(qū)域;所述顯示區(qū)域的基于流程的區(qū)域,用于顯示所述多個(gè)結(jié)構(gòu)化活動(dòng);以及所述顯示區(qū)域的基于流程區(qū)域內(nèi)的基于約束區(qū)域,用于顯示所述多個(gè)非結(jié)構(gòu)化活動(dòng)。6.如權(quán)利要求1所述的計(jì)算機(jī)實(shí)現(xiàn)的系統(tǒng),其特征在于,還包括用于向用戶呈現(xiàn)所述多個(gè)結(jié)構(gòu)化活動(dòng)和所述多個(gè)非結(jié)構(gòu)化活動(dòng)的裝置。7.如權(quán)利要求1所述的計(jì)算機(jī)實(shí)現(xiàn)的系統(tǒng),其特征在于,還包括用于從用戶接收對(duì)所述多個(gè)結(jié)構(gòu)化活動(dòng)的選擇、對(duì)所述多個(gè)非結(jié)構(gòu)化活動(dòng)的選擇、以及與所選擇的活動(dòng)相關(guān)聯(lián)的流程規(guī)范的裝置。8.如權(quán)利要求7所述的計(jì)算機(jī)實(shí)現(xiàn)的系統(tǒng),其特征在于,還包括用于依照所述流程規(guī)范組合對(duì)所述多個(gè)結(jié)構(gòu)化活動(dòng)的選擇和對(duì)所述多個(gè)非結(jié)構(gòu)化活動(dòng)的選擇以創(chuàng)建所述工作流的裝置。9.如權(quán)利要求8所述的計(jì)算機(jī)實(shí)現(xiàn)的系統(tǒng),其特征在于,還包括用于執(zhí)行所創(chuàng)建的工作流的裝置。10.一種用于對(duì)工作流建模的方法,所述工作流表示商業(yè)過程,所述方法包括向用戶呈現(xiàn)多個(gè)活動(dòng);從用戶接收對(duì)所呈現(xiàn)的活動(dòng)的選擇以及與其相關(guān)聯(lián)的流程規(guī)范;依照所接收的流程規(guī)范組合所接收的對(duì)活動(dòng)的選擇;從用戶接收對(duì)所呈現(xiàn)的活動(dòng)的另一選擇以及與其相關(guān)聯(lián)約束;以及將所接收的對(duì)所呈現(xiàn)的活動(dòng)的另一選擇與所組合的活動(dòng)選擇合并,以創(chuàng)建工作流。11.如權(quán)利要求10所述的方法,其特征在于,還包括定義所述約束。12.如權(quán)利要求10所述的方法,其特征在于,還包括通過以下步驟執(zhí)行所創(chuàng)建的工作流評(píng)估所述約束;以及根據(jù)所述評(píng)估,執(zhí)行對(duì)所呈現(xiàn)活動(dòng)的另一選擇中的活動(dòng)。13.如權(quán)利要求10所述的方法,其特征在于,還包括通過依照所述流程規(guī)范用所接收的活動(dòng)選擇執(zhí)行活動(dòng)來執(zhí)行所創(chuàng)建的工作流。14.如權(quán)利要求10所述的方法,其特征在于,向用戶呈現(xiàn)所述多個(gè)活動(dòng)包括在顯示器上顯示所述多個(gè)活動(dòng)。15.如權(quán)利要求10所述的方法,其特征在于,一個(gè)或多個(gè)計(jì)算機(jī)可讀介質(zhì)具有用于執(zhí)行如權(quán)利要求10所述的方法的計(jì)算機(jī)可行指令。16.一個(gè)或多個(gè)具有計(jì)算機(jī)可執(zhí)行組件的計(jì)算機(jī)可讀介質(zhì),所述組件用于對(duì)具有基于流程的區(qū)域和基于約束的區(qū)域的工作流建模,所述組件包括顯示組件,用于向用戶呈現(xiàn)多個(gè)活動(dòng);接口組件,用于從用戶接收對(duì)所呈現(xiàn)的活動(dòng)的選擇以及與其相關(guān)聯(lián)的流程規(guī)范,所述接口組件還從用戶接收對(duì)所呈現(xiàn)的活動(dòng)的另一選擇以及與其相關(guān)聯(lián)約束;以及設(shè)計(jì)器組件,用于依照所接收的流程規(guī)范組合所接收的活動(dòng)選擇,所述設(shè)計(jì)器組件還將所接收的對(duì)所呈現(xiàn)的活動(dòng)的另一選擇與組合的活動(dòng)選擇合并以創(chuàng)建工作流。17.如權(quán)利要求16所述的計(jì)算機(jī)可讀介質(zhì),其特征在于,還包括運(yùn)行時(shí)組件,用于通過以下步驟執(zhí)行所創(chuàng)建的工作流評(píng)估所述約束;以及根據(jù)所述評(píng)估,執(zhí)行所呈現(xiàn)的活動(dòng)的另一選擇中的活動(dòng)。18.如權(quán)利要求16所述的計(jì)算機(jī)可讀介質(zhì),其特征在于,還包括運(yùn)行時(shí)組件,用于通過依照所述流程規(guī)范執(zhí)行所接收的活動(dòng)選擇中的活動(dòng)以執(zhí)行所創(chuàng)建的工作流。19.如權(quán)利要求16所述的計(jì)算機(jī)可讀介質(zhì),其特征在于,所述顯示組件、接口組件以及設(shè)計(jì)器組件在應(yīng)用程序的執(zhí)行環(huán)境中執(zhí)行。20.如權(quán)利要求16所述的計(jì)算機(jī)可讀介質(zhì),其特征在于,所述約束包括完成語(yǔ)義。全文摘要設(shè)計(jì)和執(zhí)行具有基于流程和基于約束的區(qū)域的工作流。用戶選擇一個(gè)或多個(gè)活動(dòng)作為基于約束的區(qū)域的一部分。每一基于約束的區(qū)域具有與其相關(guān)聯(lián)的約束。工作流通過執(zhí)行基于流程的區(qū)域和基于約束的區(qū)域來執(zhí)行?;诹鞒痰膮^(qū)域順序地執(zhí)行。評(píng)估約束,且響應(yīng)于所評(píng)估的約束執(zhí)行基于約束的區(qū)域。文檔編號(hào)G06Q10/00GK1825343SQ200510099840公開日2006年8月30日申請(qǐng)日期2005年9月1日優(yōu)先權(quán)日2004年10月1日發(fā)明者A·V·帕拉斯尼斯,D·K·舒克拉,D·G·格林,B·K·梅塔,S·R·薩特申請(qǐng)人:微軟公司