欧美在线观看视频网站,亚洲熟妇色自偷自拍另类,啪啪伊人网,中文字幕第13亚洲另类,中文成人久久久久影院免费观看 ,精品人妻人人做人人爽,亚洲a视频

對(duì)工作流領(lǐng)域中橫切行為問(wèn)題建模的框架的制作方法

文檔序號(hào):6642794閱讀:178來(lái)源:國(guó)知局

專(zhuān)利名稱(chēng)::對(duì)工作流領(lǐng)域中橫切行為問(wèn)題建模的框架的制作方法
技術(shù)領(lǐng)域
:本申請(qǐng)的實(shí)施例涉及工作流建模領(lǐng)域。更為具體地,本發(fā)明的實(shí)施例涉及組件化和可擴(kuò)展工作流模型。
背景技術(shù)
:現(xiàn)有系統(tǒng)試圖通過(guò)對(duì)商業(yè)問(wèn)題建模而將商業(yè)問(wèn)題映射到高級(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)與核心工作流過(guò)程的弱或強(qiáng)商業(yè)邏輯關(guān)聯(lián)?,F(xiàn)有模型無(wú)法容納所有這些因素。此外,大多數(shù)現(xiàn)有工作流模型是以基于語(yǔ)言的方法(例如,BPEL4WS、XLANG/S和WSFL)或基于應(yīng)用程序的方法為基礎(chǔ)的。基于語(yǔ)言的方法是具有一閉合的預(yù)定義構(gòu)造集的高級(jí)工作流語(yǔ)言,它幫助向用戶(hù)/程序員建模該工作流過(guò)程。工作流語(yǔ)言載有供該閉合構(gòu)造集使用的所有語(yǔ)義信息,以使用戶(hù)能夠構(gòu)建工作流模型。然而,語(yǔ)言無(wú)法由開(kāi)發(fā)者來(lái)擴(kuò)展,且表示構(gòu)成該工作流模型的閉合的原語(yǔ)集。語(yǔ)言被綁定到由工作流系統(tǒng)銷(xiāo)售商發(fā)貨的語(yǔ)言編譯器。僅該工作流系統(tǒng)產(chǎn)品銷(xiāo)售商可通過(guò)在該產(chǎn)品的未來(lái)版本中用一新的構(gòu)造集擴(kuò)展該語(yǔ)言來(lái)擴(kuò)展該模型。這通常要求升級(jí)與該語(yǔ)言相關(guān)聯(lián)的編譯器?;趹?yīng)用程序的方法是這樣一種應(yīng)用程序,它在該應(yīng)用程序內(nèi)具有工作流能力以解決領(lǐng)域?qū)S脝?wèn)題。這些應(yīng)用程序不是真正可擴(kuò)展的,也沒(méi)有可編程模型。采用現(xiàn)有方法,復(fù)雜性、預(yù)知、動(dòng)態(tài)工作流、創(chuàng)作簡(jiǎn)易性以及與商業(yè)邏輯和核心工作流的關(guān)聯(lián)強(qiáng)度等問(wèn)題未被充分地解決。沒(méi)有可擴(kuò)展、可定制以及可重新主宿工作流設(shè)計(jì)器框架可用于構(gòu)建可視工作流設(shè)計(jì)器來(lái)對(duì)不同的工作流類(lèi)別建?!,F(xiàn)有系統(tǒng)缺乏一種快速應(yīng)用程序開(kāi)發(fā)(RAD)風(fēng)格工作流設(shè)計(jì)體驗(yàn),它允許用戶(hù)圖形地設(shè)計(jì)工作流過(guò)程,并以開(kāi)發(fā)者選擇的編程語(yǔ)言來(lái)關(guān)聯(lián)商業(yè)邏輯。另外,沒(méi)有啟用了墨跡的工作流設(shè)計(jì)器。另外,現(xiàn)有系統(tǒng)無(wú)法提供用于執(zhí)行工作流的無(wú)縫特別或動(dòng)態(tài)編輯。工作流過(guò)程在本質(zhì)上是動(dòng)態(tài)且移動(dòng)的,且其形式不能在設(shè)計(jì)時(shí)完全預(yù)見(jiàn)。該工作流過(guò)程以結(jié)構(gòu)化方式起始,并最終在其執(zhí)行生命周期過(guò)程中發(fā)展和改變。需要一種允許工作流構(gòu)建者能夠在設(shè)計(jì)時(shí)創(chuàng)作各種類(lèi)型的工作流模型,以及以無(wú)縫的方式對(duì)運(yùn)行的工作流做出特別或動(dòng)態(tài)改變的工作流創(chuàng)作框架。即使在部署了工作流過(guò)程之后且該工作流過(guò)程正在運(yùn)行,商業(yè)需求的變化通常迫使改變或編輯當(dāng)前運(yùn)行的工作流過(guò)程。需要一種提供工作流過(guò)程的運(yùn)行時(shí)創(chuàng)作的系統(tǒng)。另外,工作流過(guò)程處理跨越工作流過(guò)程模型的多個(gè)步驟的橫切的、互不相關(guān)且紊亂的問(wèn)題。例如,盡管工作流過(guò)程的各部分被設(shè)計(jì)成參與長(zhǎng)期運(yùn)行的事務(wù),然而同一過(guò)程的其它部分被設(shè)計(jì)成用于并發(fā)執(zhí)行。同一工作流過(guò)程的另外一些部分要求跟蹤,而其它部分處理商業(yè)或應(yīng)用程序級(jí)例外。需要向工作流過(guò)程的一個(gè)或多個(gè)部分應(yīng)用特定的行為。某些工作流建模方法是不實(shí)用的,因?yàn)樗鼈冃枰麄€(gè)商業(yè)過(guò)程的基于流的完整描述,包括所有例外以及人類(lèi)干預(yù)。這些方法中的一些提供了當(dāng)出現(xiàn)例外時(shí)的附加功能,而其它方法獨(dú)占地采用基于約束的方法而非基于流的方法來(lái)對(duì)商業(yè)過(guò)程建?!,F(xiàn)有系統(tǒng)實(shí)現(xiàn)基于流或基于約束的方法中的任一種。這些系統(tǒng)該不靈活,以致于無(wú)法對(duì)許多常見(jiàn)商業(yè)情況進(jìn)行建模。因此,需要一種組件化且可擴(kuò)展的工作流模型來(lái)解決這些和其它缺點(diǎn)的一個(gè)或多個(gè)。
發(fā)明內(nèi)容本發(fā)明的實(shí)施例提供了一種用于構(gòu)建組件化工作流模型的可擴(kuò)展框架。具體地,工作流過(guò)程中的每一步驟具有描述工作流步驟的設(shè)計(jì)時(shí)方面、編譯時(shí)方面以及運(yùn)行時(shí)方面的相關(guān)聯(lián)組件模型。此外,任何開(kāi)發(fā)者可通過(guò)創(chuàng)作這些組件來(lái)擴(kuò)展核心工作流模型。本發(fā)明包括一工作流引擎,它足夠靈活和強(qiáng)大來(lái)協(xié)調(diào)各種工作流的執(zhí)行,包括高度形式的機(jī)器到機(jī)器過(guò)程、基于約束的特別人類(lèi)工作流、以及具有基于流和基于約束的方法的混合的工作流。該工作流引擎準(zhǔn)許對(duì)執(zhí)行工作流的激活、執(zhí)行、查詢(xún)和控制能力。例如,本發(fā)明準(zhǔn)許對(duì)執(zhí)行工作流的特別和動(dòng)態(tài)改變。該工作流引擎可以在包括服務(wù)器和客戶(hù)機(jī)環(huán)境兩者的各種宿主環(huán)境中重新主宿或嵌入。每一特定宿主環(huán)境將工作流引擎與一組服務(wù)提供者相結(jié)合。服務(wù)提供者的總能力確定了可在該特定宿主環(huán)境中執(zhí)行的工作流的種類(lèi)。本發(fā)明的其它實(shí)施例提供了一種用于序列化工作流模型的聲明性格式,諸如可擴(kuò)展配合(orchestration)標(biāo)記語(yǔ)言(XOML)。該聲明性格式使用戶(hù)能夠通過(guò)編寫(xiě)一組組件來(lái)擴(kuò)展工作流模型。對(duì)應(yīng)于工作流過(guò)程的各步驟的語(yǔ)義被封裝在活動(dòng)確認(rèn)器組件中,該組件在編譯時(shí)確認(rèn)并實(shí)施給定組件的語(yǔ)義。本發(fā)明的聲明性格式的實(shí)施例還能夠進(jìn)行數(shù)據(jù)聲明以及與工作流模型的各元素的數(shù)據(jù)相關(guān)。該聲明性格式支持?jǐn)?shù)據(jù)通過(guò)工作流的變換。例如,該格式聲明性地表示外部數(shù)據(jù)源,如數(shù)據(jù)庫(kù)或文件、代碼片斷以及工作流模型內(nèi)的商業(yè)規(guī)則。本發(fā)明的一個(gè)實(shí)施例提供了一種構(gòu)建圖形/可視工作流設(shè)計(jì)器的可擴(kuò)展、可定址以及可重新主宿的工作流設(shè)計(jì)器框架,以對(duì)不同類(lèi)別的工作流建模。本發(fā)明的另一實(shí)施例支持快速應(yīng)用程序開(kāi)發(fā)風(fēng)格的工作流設(shè)計(jì)體驗(yàn),以允許用戶(hù)圖形地設(shè)計(jì)工作流過(guò)程,并以任何編程語(yǔ)言來(lái)關(guān)聯(lián)商業(yè)邏輯。本發(fā)明的實(shí)施例也使用筆和圖形輸入板技術(shù)提供了墨跡支持。本發(fā)明提供了一種自由形式的繪圖表面,其中,由用戶(hù)繪制的工作流被轉(zhuǎn)移到內(nèi)部表示。本發(fā)明支持通過(guò)在現(xiàn)有繪圖表面上的墨跡編輯(例如,添加/刪除活動(dòng))以及現(xiàn)有工作流的墨跡注釋(例如,書(shū)寫(xiě)表面上的注解、建議或提醒等手繪物)對(duì)工作流的創(chuàng)建和修改。本發(fā)明的其它一些實(shí)施例提供了用于以聲明性方式捕捉橫切行為并將行為應(yīng)用于工作流模型的選中部分的組件。本發(fā)明的其它實(shí)施例在與其相關(guān)聯(lián)的行為的上下文中執(zhí)行工作流模型的選中部分。本發(fā)明的實(shí)施例提供了處理工作流模型的多個(gè)步驟的橫切的、互不相關(guān)且紊亂的問(wèn)題的框架、可重新使用組件和語(yǔ)言。依照本發(fā)明的一方面,一種計(jì)算機(jī)實(shí)現(xiàn)的方法向工作流中一個(gè)或多個(gè)選中的活動(dòng)應(yīng)用出錯(cuò)和異常處理。該計(jì)算機(jī)實(shí)現(xiàn)的方法包括選擇預(yù)定義的行為組件。該方法還包括選擇工作流中的一個(gè)或多個(gè)活動(dòng)。該方法還包括將所選中的行為組件與所選中的活動(dòng)相關(guān),以使所選中的行為組件能夠響應(yīng)于所選中的活動(dòng)而操作。依照本發(fā)明的另一方面,一個(gè)或多個(gè)計(jì)算機(jī)可讀介質(zhì)具有用于向工作流中一個(gè)或多個(gè)選中的活動(dòng)應(yīng)用出錯(cuò)和異常處理的計(jì)算機(jī)可執(zhí)行模塊。該模塊包括用于選擇預(yù)定義行為組件和用于選擇工作流中一個(gè)或多個(gè)活動(dòng)的設(shè)計(jì)器模塊。該模塊還包括用于將由設(shè)計(jì)器模塊選擇的行為組件和活動(dòng)組件相關(guān)以使選中的行為組件能夠響應(yīng)于選中的活動(dòng)而操作的上下文模塊。該模塊還包括用于根據(jù)由上下文模塊相關(guān)的行為組件執(zhí)行由設(shè)計(jì)器模塊選擇的活動(dòng)的運(yùn)行時(shí)引擎模塊。依照本發(fā)明的又一方面,一種系統(tǒng)向工作流中的一個(gè)或多個(gè)選中的活動(dòng)應(yīng)用出錯(cuò)和異常處理。該系統(tǒng)包括儲(chǔ)存具有定義的接口的多個(gè)活動(dòng)的存儲(chǔ)器區(qū)域。該存儲(chǔ)器區(qū)域還儲(chǔ)存多個(gè)行為組件,其每一個(gè)符合所定義的接口。每一行為組件與至少兩個(gè)活動(dòng)相關(guān)。該系統(tǒng)還包括被配置成執(zhí)行計(jì)算機(jī)可執(zhí)行指令的處理器,該指令用于從用戶(hù)接收對(duì)儲(chǔ)存在存儲(chǔ)器區(qū)域中的行為組件之一的選擇、從用戶(hù)接收對(duì)儲(chǔ)存在存儲(chǔ)器區(qū)域中的至少兩個(gè)活動(dòng)的接收、創(chuàng)建與所選擇的行為組件相關(guān)聯(lián)的上下文、以及在所創(chuàng)建的上下文中執(zhí)行所選擇的活動(dòng)??商鎿Q地,本發(fā)明可包括各種其它方法和裝置。其它特征部分是顯而易見(jiàn)的,而部分將在后文指出。圖1是包含任務(wù)和控制流合成活動(dòng)的示例性工作流。圖2示出了一個(gè)示例性活動(dòng)繼承樹(shù)。圖3示出了一個(gè)示例性組件模型。圖4示出了一個(gè)示例性組件模型生命周期。圖5是用于創(chuàng)作依賴(lài)于工作流規(guī)范的向?qū)У墓ぷ髁鞯母呒?jí)應(yīng)用程序用戶(hù)界面。圖6示出了一個(gè)示例性工作流設(shè)計(jì)器。圖7示出了包括接收活動(dòng)及其后的發(fā)送活動(dòng)的配合程序。圖8示出了可視工作流、工作流的XOML序列化表示以及工作流的分離代碼之間的進(jìn)度表定義和關(guān)系。圖9是示出其中可實(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è)過(guò)程等過(guò)程的工作流進(jìn)行建模。商業(yè)過(guò)程是導(dǎo)致可預(yù)測(cè)和可重復(fù)結(jié)果的依賴(lài)性和有序的任務(wù)、活動(dòng)等。包括組織的操作過(guò)程、機(jī)構(gòu)的工作知識(shí)以及信息資源,商業(yè)過(guò)程被設(shè)計(jì)成以有效且及時(shí)的方式滿(mǎn)足所定義的商業(yè)目標(biāo)。在一個(gè)有效的環(huán)境中,過(guò)程的功能性組件可被容易地標(biāo)識(shí)、適應(yīng)和部署來(lái)解決不斷改變的企業(yè)需求。工作流是與商業(yè)過(guò)程中的任務(wù)交互的最終用戶(hù)的體驗(yàn)。任務(wù)被建模為活動(dòng)、組件等,其每一個(gè)表示由個(gè)人或機(jī)器執(zhí)行的工作單元。在一個(gè)實(shí)施例中,向用戶(hù)呈現(xiàn)多個(gè)活動(dòng)。用戶(hù)選擇并組織活動(dòng)來(lái)創(chuàng)建工作流。執(zhí)行所創(chuàng)建的工作流以對(duì)商業(yè)過(guò)程建模。參考圖1,示例性工作流100包含任務(wù)和控制流合成活動(dòng)。在一個(gè)示例中,配合引擎工作流模型支持不同類(lèi)別工作流的建模、創(chuàng)作和執(zhí)行。示例包括按照出現(xiàn)在有序序列中或作為一組異步事件出現(xiàn)的一組結(jié)構(gòu)化步驟對(duì)給定問(wèn)題建模。該配合引擎協(xié)調(diào)進(jìn)度表的執(zhí)行。進(jìn)度表是以樹(shù)形結(jié)構(gòu)分層排列的一組經(jīng)組織的活動(dòng)。執(zhí)行活動(dòng)的執(zhí)行上下文以及對(duì)其可見(jiàn)的共享數(shù)據(jù)由一作用域提供。每一活動(dòng)表示封裝工作流過(guò)程中步驟元數(shù)據(jù)的組件?;顒?dòng)是工作流模型中的基本執(zhí)行單元,且具有相關(guān)聯(lián)的屬性、句柄、約束和事件。每一活動(dòng)可以由任何編程語(yǔ)言中的用戶(hù)代碼來(lái)配置。例如,用戶(hù)代碼可表示以公用語(yǔ)言運(yùn)行時(shí)環(huán)境(CLR)語(yǔ)言書(shū)寫(xiě)的商業(yè)或應(yīng)用程序邏輯或規(guī)則。每一活動(dòng)支持對(duì)用戶(hù)代碼中的執(zhí)行的預(yù)截聽(tīng)(pre-interception)掛鉤和后截聽(tīng)(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)沒(méi)有子結(jié)構(gòu)(例如,子活動(dòng)),并由此是樹(shù)結(jié)構(gòu)中的葉節(jié)點(diǎn)。合成活動(dòng)包含子結(jié)構(gòu)(例如,它是一個(gè)或多個(gè)子活動(dòng)的父節(jié)點(diǎn))。在一個(gè)實(shí)施例中,活動(dòng)有三種類(lèi)型簡(jiǎn)單活動(dòng)、容器活動(dòng)和根活動(dòng)。在本實(shí)施例中,在模型中有一個(gè)根活動(dòng),且根活動(dòng)中沒(méi)有或有任何數(shù)量的簡(jiǎn)單活動(dòng)或容器活動(dòng)。容器活動(dòng)可包括簡(jiǎn)單或容器活動(dòng)。整個(gè)工作流過(guò)程可用作構(gòu)建更高階工作流過(guò)程的活動(dòng)。此外,活動(dòng)可以是可中斷或不可中斷的。不可中斷合成活動(dòng)不包括可中斷活動(dòng)。不可中斷活動(dòng)缺少可導(dǎo)致活動(dòng)阻斷的服務(wù)。配合引擎提供一組示例性的活動(dòng)。參考圖2,一活動(dòng)繼承樹(shù)示出了若干示例性活動(dòng)。圖2列出的示例性活動(dòng)在附錄A中更詳細(xì)地描述。另外,任何用戶(hù)可編寫(xiě)一個(gè)或多個(gè)活動(dòng)來(lái)擴(kuò)展工作流模型。例如,用戶(hù)可為特定的商業(yè)問(wèn)題、領(lǐng)域、工作流標(biāo)準(zhǔn)(例如,商業(yè)過(guò)程執(zhí)行語(yǔ)言)或目標(biāo)平臺(tái)編寫(xiě)活動(dòng)。配合引擎可向用戶(hù)提供一組豐富的服務(wù)來(lái)編寫(xiě)活動(dòng),該組服務(wù)包括,例如分析代碼、類(lèi)型分解和類(lèi)型系統(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)抽象基類(lèi)中定義的一組公用元數(shù)據(jù)。每一活動(dòng)依照其需求通過(guò)擴(kuò)展該類(lèi)來(lái)聲明其自己的附加元數(shù)據(jù)屬性。元數(shù)據(jù)屬性的值由該活動(dòng)跨配置該活動(dòng)的進(jìn)度表的實(shí)例的所有實(shí)例共享。例如,如果用戶(hù)創(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í)例專(zhuān)用的數(shù)據(jù)。例如,延遲活動(dòng)可提供其實(shí)例數(shù)據(jù)上的只讀屬性,該實(shí)例數(shù)據(jù)是標(biāo)識(shí)延遲活動(dòng)的超時(shí)值的日期和時(shí)間值。一旦延遲活動(dòng)開(kāi)始執(zhí)行,該值即可用,且它對(duì)延遲活動(dòng)的每一單個(gè)實(shí)例很可能是不同的。通常參考進(jìn)度表的實(shí)例,尤其是活動(dòng)和任務(wù)的實(shí)例,而不用“實(shí)例”來(lái)限定參考。合成活動(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)樹(shù))被影響是可能的。接下來(lái)參考圖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ǔ)義的無(wú)狀態(tài)(stateless)組件?;顒?dòng)執(zhí)行器與活動(dòng)的元數(shù)據(jù)一起工作來(lái)實(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)用程序),并通過(guò)服務(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)于用戶(hù)請(qǐng)求而做出。語(yǔ)義檢查可以在運(yùn)行時(shí)比在編譯時(shí)執(zhí)行的檢查更強(qiáng)大,以確保諸如運(yùn)行實(shí)例的活動(dòng)樹(shù)中活動(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è)邏輯字段來(lái)表示。活動(dòng)執(zhí)行器由儲(chǔ)存用于執(zhí)行儲(chǔ)存在商業(yè)邏輯字段中的軟件代碼的數(shù)據(jù)的執(zhí)行器字段表示。作用域和進(jìn)度表執(zhí)行活動(dòng)的執(zhí)行上下文以及對(duì)其可見(jiàn)的共享數(shù)據(jù)由作用域來(lái)提供。作用域是核心活動(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ì)用戶(hù)變量的沖突讀-寫(xiě)或?qū)?寫(xiě)訪問(wèn)的情況下,向用戶(hù)提供并發(fā)控制。作用域也是事務(wù)邊界、異常處理邊界以及補(bǔ)償邊界。由于作用域可以在進(jìn)度表內(nèi)嵌套,因此用不同作用域內(nèi)相同的名字(即使作用域是嵌套的)來(lái)聲明變量、消息、通道和相關(guān)集而沒(méi)有名字沖突也是可能的。在進(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)類(lèi)型。進(jìn)度表的元數(shù)據(jù)包括參數(shù)的聲明。一旦開(kāi)發(fā)了進(jìn)度表,可執(zhí)行所開(kāi)發(fā)的進(jìn)度表的實(shí)例。激活和控制進(jìn)度表實(shí)例的過(guò)程是由其中嵌入了配合引擎的宿主環(huán)境所決定的。配合引擎提供了可用于測(cè)試進(jìn)度表的不提供必要服務(wù)的“簡(jiǎn)單宿主”。另外,配合引擎提供了一激活服務(wù)來(lái)促進(jìn)同樣由引擎和外部應(yīng)用程序用于與服務(wù)環(huán)境(即,宿主)交互的“服務(wù)提供者”模型(例如,應(yīng)用程序編程接口)的標(biāo)準(zhǔn)化。激活服務(wù)創(chuàng)建了特定進(jìn)度表類(lèi)型的進(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)樹(shù))的引用、以及掛起、恢復(fù)和終止實(shí)例的方法。激活服務(wù)也支持基于給定的進(jìn)度表實(shí)例標(biāo)識(shí)符找出進(jìn)度表實(shí)例。代碼分離(code-beside)作用域活動(dòng)可具有包括用于該作用域活動(dòng)的商業(yè)邏輯的相關(guān)聯(lián)的代碼分離類(lèi)。由于進(jìn)度表本身是作用域,因此進(jìn)度表也可具有代碼分離的類(lèi)。在進(jìn)度表內(nèi)嵌套的作用域也可具有其自己的代碼分離類(lèi)。在作用域內(nèi)嵌套的活動(dòng)共享該作用域的代碼分離類(lèi),它擔(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ù);寫(xiě)活動(dòng)實(shí)例數(shù)據(jù)(例如,設(shè)置將要執(zhí)行的活動(dòng)的屬性);引發(fā)事件;拋出異常;枚舉和導(dǎo)航運(yùn)行進(jìn)度表實(shí)例的活動(dòng)樹(shù)中的活動(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ì)其的操縱。行為組件本發(fā)明的配合引擎允許開(kāi)發(fā)按照跨越工作流活動(dòng)的行為對(duì)交錯(cuò)的、互不相關(guān)問(wèn)題建模。交錯(cuò)或紊亂的問(wèn)題的示例包括事務(wù)(例如,分布式事務(wù)協(xié)調(diào)器和長(zhǎng)期運(yùn)行)、并發(fā)性、跟蹤、持久性、出錯(cuò)處理、日志記錄等等。向工作流過(guò)程建模應(yīng)用行為組件允許復(fù)雜的過(guò)程模塊化,并允許構(gòu)建可重復(fù)使用的、極其靈活且反應(yīng)靈敏的工作流過(guò)程。它不僅有助于將系統(tǒng)級(jí)問(wèn)題具體化(例如,進(jìn)程監(jiān)視、跟蹤、持久性、事務(wù)和同步),也有助于基于運(yùn)行過(guò)程的聲明性準(zhǔn)則和/或狀態(tài)將商業(yè)級(jí)問(wèn)題具體化(例如,基于服務(wù)質(zhì)量準(zhǔn)則動(dòng)態(tài)地選取web服務(wù),以及在運(yùn)行的過(guò)程中有條件地跳過(guò)、替換、重復(fù)、添加或移除一組執(zhí)行步驟以履行商業(yè)合同等等)。應(yīng)用行為組件提供了更好的模塊化模型,并有助于分隔橫切任何程序或基于組件的系統(tǒng)的紊亂問(wèn)題。橫切問(wèn)題在被稱(chēng)為行為組件的模塊性邊界內(nèi)捕捉。行為組件提供橫切功能。一般而言,只要所編程的兩個(gè)屬性必須被不同地創(chuàng)作但仍需協(xié)調(diào),這兩個(gè)屬性就彼此橫切。如果任何實(shí)現(xiàn)的屬性可被干凈地封裝或良好地定位、容易地訪問(wèn)、并且在必要時(shí)在廣義過(guò)程(例如,對(duì)象、方法、過(guò)程、API)中創(chuàng)作,它就被定義為組件。在一個(gè)示例中,組件是系統(tǒng)的功能分解的單元,諸如圖像過(guò)濾器、銀行賬號(hào)、圖形用戶(hù)界面小部件、或工作流模型中的步驟??缭焦ぷ髁骰顒?dòng)的橫切問(wèn)題可以被表示為工作流行為組件。工作流行為組件可以被視為聲明性模塊構(gòu)造。這些行為組件被疊加到工作流應(yīng)用程序或應(yīng)用程序的各部分上。這些是聲明性的,因?yàn)樗鼈円月暶餍缘姆绞絹?lái)圖式化和描述。事務(wù)、同步和異常處理是極不適合于被建模為合成活動(dòng)的示例性行為特性/問(wèn)題。這些是跨越且橫切活動(dòng)和商業(yè)邏輯的互不相關(guān)的問(wèn)題。這些如同諸如跟蹤、記錄和追蹤等其它問(wèn)題一樣基本上在本質(zhì)上是橫切的。示例性建模規(guī)則包括如果執(zhí)行邏輯可被干凈地封裝為組件,則將任何執(zhí)行邏輯表示為活動(dòng),以及如果語(yǔ)義跨越一組活動(dòng)或組件,則將行為問(wèn)題表示為行為組件。行為組件和活動(dòng)共享關(guān)于其組件模型的相似性。與活動(dòng)一樣,每一行為組件按照屬性、方法和事件聲明性地描述其元數(shù)據(jù)。另外,每一行為組件具有相關(guān)聯(lián)的設(shè)計(jì)器、序列化器和運(yùn)行時(shí)組件。然而,在一個(gè)實(shí)施例中,實(shí)際實(shí)現(xiàn)行為/語(yǔ)義的運(yùn)行時(shí)組件與活動(dòng)執(zhí)行器不同。例如,調(diào)度器和行為組件執(zhí)行器之間的接口合約與行為執(zhí)行器不同。示例性行為組件涉及以下的一個(gè)或多個(gè)出錯(cuò)處理、異常處理和消息通信。例如,行為組件可包括作用域組件和過(guò)程組件。作用域組件涉及以下的一個(gè)或多個(gè)過(guò)程分析、狀態(tài)管理、事務(wù)、同步以及異常出錯(cuò)處理。過(guò)程組件涉及以下的一個(gè)或多個(gè)事務(wù)處理、同步和異常出錯(cuò)處理。行為組件表示跨越活動(dòng)邊界的橫切問(wèn)題?;顒?dòng)駐留在行為組件內(nèi),并且依賴(lài)于該排列,繼承行為組件的行為。例如,如果活動(dòng)駐留在原子事務(wù)行為組件內(nèi),則它在其執(zhí)行期間繼承ACID語(yǔ)義。另外,DTC事務(wù)在其執(zhí)行期間也在傳遞給它的上下文中可用。在一個(gè)實(shí)施例中,活動(dòng)參與多個(gè)行為組件。具體地,一個(gè)活動(dòng)生存在被稱(chēng)為上下文的一組行為組件的并集中。上下文是由一組包含1-n個(gè)行為組件的并集定義的區(qū)域。在編譯時(shí)要求每一行為組件確認(rèn)其自身。它接收上下文,從該上下文中,它可獲得所有其它兄弟方面的列表、包含在上下文中的活動(dòng)等等。確認(rèn)和錯(cuò)誤傳播類(lèi)似于活動(dòng)的確認(rèn)和錯(cuò)誤傳播。在運(yùn)行時(shí),調(diào)度器給予上下文的每一行為組件執(zhí)行器解釋和實(shí)現(xiàn)行為組件支持的行為的機(jī)會(huì)。在一個(gè)實(shí)施例中,在活動(dòng)的執(zhí)行期間發(fā)生以下操作。-調(diào)度器通過(guò)讀取對(duì)象模型按需創(chuàng)建適當(dāng)?shù)姆矫妗?調(diào)度器通過(guò)詢(xún)問(wèn)行為組件(BehavioralComponentExecutor.GetService())并將其推入服務(wù)容器中來(lái)創(chuàng)建適當(dāng)?shù)姆?wù)。-調(diào)度器調(diào)用BehavioralComponentExecutor.Load(),給予行為組件初始化其自身的機(jī)會(huì)。-調(diào)度器在其中放置了活動(dòng)的上下文的每一行為組件上調(diào)用PreProcess(),然后調(diào)用ActivityExecutor.Execute(),傳遞ContextService(上下文服務(wù))。-調(diào)度器在每一吞沒(méi)(engulfing)行為組件上調(diào)用AspectExecutor.Unload。參考圖4,一框圖示出了示例性組件模型生命周期。用戶(hù)與儲(chǔ)存在一個(gè)或多個(gè)計(jì)算機(jī)可讀介質(zhì)上的計(jì)算機(jī)可執(zhí)行模塊交互,以向工作流中一個(gè)或多個(gè)選中的活動(dòng)應(yīng)用出錯(cuò)和異常處理。計(jì)算機(jī)可執(zhí)行模塊包括選項(xiàng)板模塊408、設(shè)計(jì)器模塊402、上下文模塊404、運(yùn)行時(shí)引擎模塊406。用戶(hù)與選項(xiàng)板模塊408交互以定義行為組件。行為組件包括描述該行為組件的功能的用戶(hù)可編輯元數(shù)據(jù)。用戶(hù)與設(shè)計(jì)器模塊402(例如,用戶(hù)界面)交互以選擇預(yù)定義的行為組件,并選擇工作流中的一個(gè)或多個(gè)活動(dòng)。用戶(hù)還與上下文模塊404交互,以將通過(guò)設(shè)計(jì)器模塊402選擇的行為組件和活動(dòng)相關(guān),以使選中的行為組件能夠響應(yīng)于所選中的活動(dòng)而運(yùn)作。即,設(shè)計(jì)器模塊402使選中的行為組件能夠響應(yīng)于選中的活動(dòng)的執(zhí)行而執(zhí)行操作。例如,選中的行為組件可捕捉由選中的活動(dòng)之一拋出的異?;虺鲥e(cuò)。一般而言,選中的行為組件響應(yīng)于來(lái)自選中活動(dòng)的輸出而執(zhí)行操作。用戶(hù)與運(yùn)行時(shí)引擎莫跨跨406教育,以根據(jù)由上下文模塊404相關(guān)的行為組件執(zhí)行通過(guò)設(shè)計(jì)器模塊402選擇的活動(dòng)。運(yùn)行時(shí)引擎模塊406與選中的行為組件協(xié)調(diào)地執(zhí)行選中的活動(dòng)。例如,運(yùn)行時(shí)引擎模塊406創(chuàng)建與選中的行為組件相關(guān)聯(lián)的上下文,并在所創(chuàng)建的上下文內(nèi)執(zhí)行選中的活動(dòng)。在一個(gè)實(shí)施例中,行為組件包括一個(gè)或多個(gè)規(guī)則,并且選中的行為組件將規(guī)則應(yīng)用于選中的活動(dòng)。本發(fā)明也支持向其應(yīng)用行為組件的活動(dòng)的釘子。在一個(gè)示例中,本發(fā)明包括從用戶(hù)接收具有與其相關(guān)聯(lián)的一個(gè)或多個(gè)語(yǔ)義的用戶(hù)定義的活動(dòng)、評(píng)估該語(yǔ)義以找出與預(yù)定義接口要求的一致性、以及根據(jù)該評(píng)估在由運(yùn)行時(shí)引擎模塊406創(chuàng)建的上下文內(nèi)執(zhí)行所接收的用戶(hù)定義的活動(dòng)。在諸如圖4所示的系統(tǒng)中,存儲(chǔ)器區(qū)域儲(chǔ)存多個(gè)活動(dòng),其每一個(gè)具有定義的接口以及多個(gè)行為組件,每一行為組件符合定義的接口。每一行為組件與一個(gè)或多個(gè)活動(dòng)相關(guān)。存儲(chǔ)器區(qū)域還包括每一行為組件的數(shù)據(jù)結(jié)構(gòu)(例如,組件模型)。示例性數(shù)據(jù)結(jié)構(gòu)包括屬性、方法、事件、設(shè)計(jì)器、序列化器和/或運(yùn)行時(shí)組件。另外,該系統(tǒng)包括被配置成執(zhí)行計(jì)算機(jī)可執(zhí)行指令的處理器,該指令用于從用戶(hù)接收對(duì)儲(chǔ)存在存儲(chǔ)器區(qū)域中的行為組件之一的選擇、從用戶(hù)接收對(duì)儲(chǔ)存在存儲(chǔ)器區(qū)域中的至少兩個(gè)活動(dòng)的選擇、創(chuàng)建與所選擇的行為組件相關(guān)聯(lián)的上下文、以及在所創(chuàng)建的上下文內(nèi)執(zhí)行所選擇的活動(dòng)。一個(gè)或多個(gè)計(jì)算機(jī)可讀介質(zhì)具有用于執(zhí)行此處所描述的方法的計(jì)算機(jī)可執(zhí)行指令。工作流模板(stencil)工作流模板(例如,工作流樣板或活動(dòng)包)包括根活動(dòng)和一組活動(dòng)。模板可以是域或宿主專(zhuān)用的。模型的示例包括結(jié)構(gòu)化的工作流模板、人類(lèi)工作流模板以及非結(jié)構(gòu)化的工作流模板。某些模板可以作為一組活動(dòng)是“閉合的”,包括被設(shè)計(jì)成可能在特定的宿主環(huán)境中共同工作的一個(gè)或多個(gè)根。其它模板可能是“開(kāi)放”到各種程度的。模板定義了其可擴(kuò)展性點(diǎn)。例如,開(kāi)發(fā)者編寫(xiě)CustomRoot(自定義根)和新的抽象CustomActivity(自定義活動(dòng)),并聲明包是CustomRoot加上從CustomActivity導(dǎo)出的任何活動(dòng)。示例性BPEL或XLANG/S模板包括具有以下特征的根活動(dòng)狀態(tài)管理和事務(wù)中的參與具有相關(guān)聯(lián)的事件和異常處理程序、支持合約第一模型、可被分析、并具有定義良好的激活和終止行為。示例性模板還包括一組消息通信專(zhuān)用活動(dòng)(例如,Send(發(fā)送)和Receive(接收)及其變體),以及諸如Scope(作用域)、Loop(循環(huán))、Condition(條件)、Listen(監(jiān)聽(tīng))和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ì)器框架(用戶(hù)界面)配合引擎提供了用于以WYSWYG方式設(shè)計(jì)各種類(lèi)別的工作流模型的框架。例如,參考圖5,一種用于創(chuàng)作工作流的高級(jí)應(yīng)用程序用戶(hù)界面依賴(lài)于工作流規(guī)范的向?qū)?。該框架包括使開(kāi)發(fā)者能夠編寫(xiě)可視工作流設(shè)計(jì)器的一組服務(wù)和行為。這些服務(wù)提供了呈現(xiàn)工作流過(guò)程的有效方式、支持用于繪制工作流的墨跡/圖形輸入板、以及支持諸如撤消/回復(fù)、拖/放、剪切/復(fù)制/粘貼、縮放、掃視、搜索/替換等設(shè)計(jì)器操作、書(shū)簽、裝飾、用于確認(rèn)錯(cuò)誤的智能標(biāo)簽、用于活動(dòng)的有效拖動(dòng)目標(biāo)指示符、自動(dòng)布局、視圖分頁(yè)、導(dǎo)航標(biāo)記器、拖動(dòng)指示符、具有頁(yè)眉/頁(yè)腳的打印和預(yù)覽等等。通過(guò)這一用戶(hù)界面,可構(gòu)造包含任務(wù)和控制流合成活動(dòng)(例如,順序、并行和條件)的簡(jiǎn)單工作流。對(duì)規(guī)則規(guī)范(例如,條件分支邏輯、while循環(huán)邏輯)或數(shù)據(jù)流規(guī)范(例如,任務(wù)A的輸出是任務(wù)B的輸入)不要求代碼輸入(或依賴(lài)于現(xiàn)有的已編譯代碼)。進(jìn)度表的序列化表示(包括規(guī)則和數(shù)據(jù)流)是自包含的,且在不需要代碼分離的某些情形中完成。使用本發(fā)明的設(shè)計(jì)器框架,本發(fā)明的配合引擎包括一種快速應(yīng)用程序開(kāi)發(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ù)來(lái)編寫(xiě)的。本發(fā)明的框架也包含一可視設(shè)計(jì)器模型。該可視設(shè)計(jì)器模型包括通過(guò)該工作流模型中的關(guān)系彼此鏈接的一組活動(dòng)設(shè)計(jì)器。圖6示出了一個(gè)示例性工作流設(shè)計(jì)器。本發(fā)明包括將代碼與工作流模型相關(guān)聯(lián)的各種模式,包括“代碼分離”、“代碼嵌入”和允許用戶(hù)代碼實(shí)時(shí)在工作流模型中往返的“僅代碼”。本發(fā)明也提供了當(dāng)用戶(hù)在構(gòu)建工作流時(shí)的實(shí)時(shí)語(yǔ)義錯(cuò)誤。在一個(gè)實(shí)施例中,本發(fā)明向用戶(hù)呈現(xiàn)了標(biāo)識(shí)設(shè)計(jì)器框架用戶(hù)界面中的多個(gè)活動(dòng)的包。本發(fā)明還從用戶(hù)接收對(duì)所呈現(xiàn)的活動(dòng)的選擇和分層組織。本發(fā)明序列化所接收的活動(dòng)來(lái)創(chuàng)建工作流的持久表示。本發(fā)明還從用戶(hù)接收表示用于與工作流中的多個(gè)活動(dòng)之一相關(guān)聯(lián)的商業(yè)邏輯的軟件代碼。本發(fā)明也可接收具有與其相關(guān)聯(lián)的一個(gè)或語(yǔ)義的用戶(hù)定義活動(dòng)。本發(fā)明包括用于評(píng)估語(yǔ)義以找出其對(duì)預(yù)定義接口要求的一致性的語(yǔ)義檢查器或確認(rèn)器。如果語(yǔ)義與預(yù)定義的接口要求相一致,則本發(fā)明呈現(xiàn)該用戶(hù)定義的活動(dòng)作為多個(gè)活動(dòng)之一。本發(fā)明還編譯軟件代碼來(lái)創(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ì)器允許用戶(hù)通過(guò)使用其它所創(chuàng)建的進(jìn)度表來(lái)遞歸地組成更高階進(jìn)度表并使用它們。進(jìn)度表的內(nèi)聯(lián)擴(kuò)充允許用戶(hù)內(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ì)器由用戶(hù)擴(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)的上下文是否為可寫(xiě)的。對(duì)于主宿的設(shè)計(jì)器,這些函數(shù)返回假。另外,防止屬性被修改。其它函數(shù)從適當(dāng)?shù)慕M件中取出活動(dòng)設(shè)計(jì)器internalstaticServiceDesignerGetSafeRootDesigner(IServiceProviderserviceProvider)internalstaticICompositeActivityDesignerGetSafeParentDesigner(objectobj)internalstaticIActivityDesignerGetSafeDesigner(objectobj)在一個(gè)示例中,用戶(hù)創(chuàng)建進(jìn)度表并將其編譯為活動(dòng)。在成功地編譯之后,該進(jìn)度表出現(xiàn)在工具箱中。用戶(hù)打開(kāi)或創(chuàng)建其中需要所編譯的進(jìn)度表的進(jìn)度表。用戶(hù)從工具箱中拖放所編譯的進(jìn)度表。在設(shè)計(jì)表面上示出層疊的進(jìn)度表設(shè)計(jì)器。當(dāng)用戶(hù)希望查看放下的所編譯的進(jìn)度表的內(nèi)容時(shí),用戶(hù)擴(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)使用戶(hù)能夠查看所調(diào)用的進(jìn)度表,而無(wú)需在不同的進(jìn)度表設(shè)計(jì)器之間切換。該特征對(duì)于通過(guò)重復(fù)使用現(xiàn)有進(jìn)度表來(lái)組成更高階進(jìn)度表的開(kāi)發(fā)者而言是有用的。對(duì)使用主題/皮膚的設(shè)計(jì)器框架的定制的支持使用設(shè)計(jì)器框架編寫(xiě)的工作流設(shè)計(jì)器可使用工作流主題來(lái)定制。這些可以是聲明性地描述設(shè)計(jì)器的各方面的可擴(kuò)展標(biāo)記語(yǔ)言(XML)文件。工作流設(shè)計(jì)器提供伙伴擴(kuò)展活動(dòng)的向?qū)еС?。工作流設(shè)計(jì)器支持的示例性用戶(hù)界面特征包括,但不限于,撤消/恢復(fù)、拖/放、剪切/復(fù)制/粘貼、縮放、掃視、搜索/替換、書(shū)簽、裝飾、用于確認(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ì)器主題/皮膚來(lái)允許使用XML元數(shù)據(jù)定制設(shè)計(jì)器的外觀和感覺(jué)。工作流設(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)。該過(guò)程接收消息并將其發(fā)送出去。用戶(hù)創(chuàng)建名為“HelloWorld”的項(xiàng)目,并向該項(xiàng)目添加配合項(xiàng)。用戶(hù)然后將作用域活動(dòng)拖放至設(shè)計(jì)表面。下一步,用戶(hù)將接收活動(dòng)以及其后的發(fā)送活動(dòng)放到該作用域上。圖7示出了設(shè)計(jì)器中的所得工作流700。每一活動(dòng)設(shè)計(jì)器提供了對(duì)象模型上的用戶(hù)界面表示。開(kāi)發(fā)者能夠直接對(duì)對(duì)象模型編程,并設(shè)置活動(dòng)上的屬性或使用該設(shè)計(jì)器。配合引擎設(shè)計(jì)器允許開(kāi)發(fā)者從工具箱中選擇活動(dòng)并將其拖到設(shè)計(jì)器表面上。如果活動(dòng)已被放置到進(jìn)度表中并需要移動(dòng),則開(kāi)發(fā)者能夠選擇它(通過(guò)點(diǎn)擊它)并將其拖至它需要去往的進(jìn)度表區(qū)域。如果開(kāi)發(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)前不在視見(jiàn)區(qū)中的設(shè)計(jì)器區(qū)域的導(dǎo)航可通過(guò)將該活動(dòng)拖向要放置的進(jìn)度表區(qū)域來(lái)訪問(wèn)。拖放可跨統(tǒng)一項(xiàng)目中的進(jìn)度表以及跨統(tǒng)一解決方案中的其它項(xiàng)目中的進(jìn)度表得到支持。在活動(dòng)被放置到設(shè)計(jì)表面上之后,開(kāi)發(fā)者配置該活動(dòng)。每一活動(dòng)具有一組屬性,開(kāi)發(fā)者配置該屬性以使進(jìn)度表有效。這些屬性可在屬性瀏覽器中編輯。每一活動(dòng)控制什么屬性在屬性瀏覽器中是可查看的。為幫助開(kāi)發(fā)者配置各活動(dòng),設(shè)計(jì)器提供了各種對(duì)話(huà)框或“子設(shè)計(jì)器”。對(duì)活動(dòng)的各屬性調(diào)用每一對(duì)話(huà)框。配合引擎能夠定制工具箱中呈現(xiàn)的活動(dòng)。當(dāng)開(kāi)發(fā)者創(chuàng)建自定義活動(dòng)或進(jìn)度表時(shí),最終的結(jié)果是程序集。使用對(duì)話(huà)框,開(kāi)發(fā)者能夠?yàn)g覽程序集位置并選擇該程序集以使其作為配合引擎活動(dòng)出現(xiàn)。或者,開(kāi)發(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)來(lái)創(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ā)明也包括用于將類(lèi)型與工作流中的每一活動(dòng)相關(guān)聯(lián)的類(lèi)型提供者應(yīng)用程序編程接口。類(lèi)型提供者應(yīng)用程序編程接口包括用于將該類(lèi)型與工作流中的每一活動(dòng)相關(guān)聯(lián)的裝置,以及用于將一類(lèi)型與工作流中的每一活動(dòng)相關(guān)聯(lián)的裝置。一個(gè)或多個(gè)API構(gòu)成了用于創(chuàng)作工作流的示例性裝置、用于選擇一個(gè)或多個(gè)活動(dòng)來(lái)創(chuàng)建工作流的示例性裝置、用于序列化工作流的示例性裝置、用于定制工作流的可視外觀的示例性裝置、用于確認(rèn)工作流的示例性裝置、用于編譯工作流的示例性裝置、以及用于將類(lèi)型與工作流中的每一活動(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í)行方法返回而沒(méi)有向其活動(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ī)則來(lái)觸發(fā)在其上執(zhí)行配合引擎活動(dòng)的事件。配合引擎設(shè)計(jì)器向用戶(hù)提供了在運(yùn)行時(shí)關(guān)聯(lián)要評(píng)估的規(guī)則來(lái)觸發(fā)事件的能力。配合引擎設(shè)計(jì)器通過(guò)提供可擴(kuò)展性體系結(jié)構(gòu)使用戶(hù)能夠使用不同類(lèi)型的規(guī)則技術(shù)。該設(shè)計(jì)器對(duì)于所使用的規(guī)則技術(shù)的類(lèi)型是不可知的。在一個(gè)實(shí)施例中,設(shè)計(jì)器支持布爾表達(dá)式處理程序,作為將規(guī)則與活動(dòng)相關(guān)聯(lián)的一種方式。這意味著在用戶(hù)代碼文件中,用戶(hù)編寫(xiě)返回真或假值的方法,基于該方法觸發(fā)規(guī)則。當(dāng)前有多種可用于評(píng)估規(guī)則的技術(shù),包括信息代理(InfoAgent)和商業(yè)規(guī)則引擎(BRE)。為實(shí)現(xiàn)這一目標(biāo),設(shè)計(jì)器包括使規(guī)則技術(shù)開(kāi)發(fā)者能夠在設(shè)計(jì)器中主宿自定義用戶(hù)界面的可擴(kuò)展性體系結(jié)構(gòu)。該設(shè)計(jì)器提供了一種自定義用戶(hù)界面編寫(xiě)者以代碼語(yǔ)句集合的形式序列化規(guī)則的方法。該設(shè)計(jì)器在用戶(hù)代碼文件中發(fā)放布爾處理程序,并向其插入代碼語(yǔ)句集合。配合引擎包括可由規(guī)則編寫(xiě)者使用的默認(rèn)用戶(hù)界面。規(guī)則技術(shù)提供者通過(guò)創(chuàng)建自定義規(guī)則聲明、編寫(xiě)與自定義規(guī)則聲明相關(guān)聯(lián)的用戶(hù)界面類(lèi)型編輯器、創(chuàng)建自定義用戶(hù)界面來(lái)主宿規(guī)則用戶(hù)界面、以及在保存時(shí)生成代碼語(yǔ)句來(lái)向配合引擎設(shè)計(jì)器添加規(guī)則。在一個(gè)示例中,用戶(hù)選擇要向其附加規(guī)則的活動(dòng)設(shè)計(jì)器、在屬性瀏覽器中定位規(guī)則屬性并在下拉框中選擇“RuleExpressionHandler(規(guī)則表達(dá)式處理程序)”(它使得“Statements(語(yǔ)句)”屬性出現(xiàn)在用戶(hù)界面的Rule(規(guī)則)屬性下方)、在“Statements”屬性中指定用戶(hù)代碼方法名、調(diào)用用戶(hù)界面類(lèi)型編輯器來(lái)調(diào)用主宿規(guī)則專(zhuān)用用戶(hù)界面的對(duì)話(huà)框、以及在對(duì)話(huà)框中通過(guò)創(chuàng)建新的謂詞行并將它們組合在一起來(lái)定義規(guī)則。用戶(hù)界面在用戶(hù)代碼文件中發(fā)放方法。方法名將與由用戶(hù)在屬性瀏覽器中指定的名稱(chēng)相同。等效于創(chuàng)建規(guī)則的代碼語(yǔ)句將被插入到該規(guī)則的用戶(hù)代碼方法中。執(zhí)行期間的消息通信在運(yùn)行工作流中,發(fā)送到進(jìn)度表的消息是預(yù)期供特定進(jìn)度表實(shí)例使用的。例如,購(gòu)買(mǎi)定單#123的發(fā)票必須被發(fā)送回發(fā)起(例如,發(fā)送出)該購(gòu)買(mǎi)定單的同一進(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í)例持有的相同類(lèi)型的標(biāo)識(shí)符進(jìn)行匹配。多屬性相關(guān)集也是可能的,且類(lèi)似于數(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ù)期類(lèi)型的入站消息所持有的標(biāo)識(shí)符字段進(jìn)行匹配。當(dāng)找到匹配,則滿(mǎn)足該相關(guān)集,且該消息被傳遞到進(jìn)度表實(shí)例。盡管相關(guān)集的實(shí)現(xiàn)是由配合引擎和宿主環(huán)境所決定的,但是在一個(gè)實(shí)施例中,用戶(hù)聲明該相關(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))與用戶(hù)無(wú)關(guān)地設(shè)置相關(guān)集。由發(fā)送和接收活動(dòng)執(zhí)行各種各樣的確認(rèn)檢查,以確保相關(guān)集是正確初始化和遵循的。執(zhí)行工作流的動(dòng)態(tài)編輯配合引擎提供了用于創(chuàng)作(以及隨后可視化和執(zhí)行)各種類(lèi)型的工作流的框架。示例包括事件-條件-動(dòng)作(ECA)風(fēng)格的工作流或結(jié)構(gòu)化工作流或規(guī)則驅(qū)動(dòng)工作流。此外,不論是如何對(duì)工作流建模的,工作流都允許用戶(hù)在設(shè)計(jì)時(shí)或甚至在工作流過(guò)程正在運(yùn)行時(shí)以同一方式創(chuàng)作或編輯工作流,而無(wú)需重新編譯該工作流過(guò)程。該框架允許用戶(hù)以高保真度在運(yùn)行時(shí)和設(shè)計(jì)時(shí)表示之間進(jìn)行往返。特別(adhoc)改變是在運(yùn)行時(shí)對(duì)過(guò)程模型做出的改變。用戶(hù)可向運(yùn)行的實(shí)例要求其進(jìn)度表模型,并向該模型做出改變。例如,用戶(hù)可按批添加、移除或替換活動(dòng),然后提交或回退批處理的改變。在一個(gè)實(shí)施例中,模型是在更新之后確認(rèn)的。在本發(fā)明的許多工作流情形中,“設(shè)計(jì)時(shí)創(chuàng)作”和“運(yùn)行時(shí)執(zhí)行”之間的分隔存在模糊或甚至是消除。進(jìn)度表實(shí)例有效地與其它實(shí)例共享為那些實(shí)例的進(jìn)度表類(lèi)型所定義的活動(dòng)類(lèi)型(元數(shù)據(jù))樹(shù)。但是一旦開(kāi)始執(zhí)行,任何進(jìn)度表實(shí)例可通過(guò)添加新活動(dòng)或操縱聲明性規(guī)則在進(jìn)行中改變。采取這一修改的進(jìn)度表實(shí)例并“保存為”新進(jìn)度表類(lèi)型,或更一般地,僅從實(shí)例中恢復(fù)序列化的表示是可能的。即,運(yùn)行的進(jìn)度表實(shí)例可被序列化,然后將其帶入任何設(shè)計(jì)器(例如,創(chuàng)作環(huán)境)或運(yùn)行時(shí)可視化工具。此外,對(duì)于高級(jí)開(kāi)發(fā)者而言,將進(jìn)度表完全作為軟件代碼來(lái)創(chuàng)作是可能的。為直接創(chuàng)作進(jìn)度表類(lèi)型,開(kāi)發(fā)者只需在該進(jìn)度表的代碼分離類(lèi)的軟件代碼中包括稱(chēng)為InitializeScheduleModel(初始化進(jìn)度表模型)的方法,然后用[ScheduleCreator](進(jìn)度表創(chuàng)建器)元屬性來(lái)標(biāo)記該方法。在一個(gè)實(shí)施例中,該靜態(tài)方法不采用任何參數(shù),并返回一Schedule(進(jìn)度表)對(duì)象。沒(méi)有伴隨的序列化文件,盡管可從所創(chuàng)建的Schedule對(duì)象中恢復(fù)該進(jìn)度表的序列化表示。盡管這意味著可使用單個(gè)軟件代碼文件來(lái)開(kāi)發(fā)進(jìn)度表,然而可能不在該文件上執(zhí)行確認(rèn)檢查。配合引擎編譯確保作為進(jìn)度表類(lèi)型的基礎(chǔ)的活動(dòng)樹(shù)的結(jié)構(gòu)和語(yǔ)義有效性。在另一實(shí)施例中,編譯和確認(rèn)內(nèi)部地運(yùn)行,以產(chǎn)生所執(zhí)行的實(shí)際類(lèi)型,而不要求任何代碼輸入。進(jìn)度表類(lèi)型編譯變?yōu)橐环N非常容易的過(guò)程,因?yàn)闆](méi)有從編譯時(shí)對(duì)象模型到運(yùn)行時(shí)對(duì)象模型的轉(zhuǎn)換。本質(zhì)上,編譯只需將進(jìn)度表的對(duì)象模型表示與代碼分離相組合以產(chǎn)生新類(lèi)型。在一個(gè)實(shí)施例中,如果所編譯的代碼分離與對(duì)象模型中的活動(dòng)所需求的相匹配,對(duì)特定的進(jìn)度表可能完全沒(méi)有任何基本需求來(lái)提供任何代碼分離,或者代碼分離可能已經(jīng)以編譯的形式(程序集)存在。當(dāng)編譯序列化進(jìn)度表時(shí),指向有效地?fù)?dān)當(dāng)該進(jìn)度表的代碼分離的現(xiàn)有已編譯類(lèi)型是可能的。創(chuàng)建該已編譯類(lèi)型的派生類(lèi)型,且該新類(lèi)型擔(dān)當(dāng)代碼分離以確保創(chuàng)建了唯一的類(lèi)型來(lái)表示該新進(jìn)度表。序列化體系結(jié)構(gòu)序列化基礎(chǔ)結(jié)構(gòu)提供了一種模塊化的、格式中立且容易擴(kuò)展的機(jī)制來(lái)序列化配合引擎活動(dòng)樹(shù)。具體地,調(diào)用者(例如,應(yīng)用程序或用戶(hù))向序列化管理器請(qǐng)求對(duì)象(或活動(dòng))A的序列化器。對(duì)象A的類(lèi)型的元數(shù)據(jù)元屬性將對(duì)象A綁定到所請(qǐng)求類(lèi)型的序列化器。調(diào)用者然后要求序列化器序列化對(duì)象A。對(duì)象A的序列化器然后序列化對(duì)象A。對(duì)于在序列化時(shí)遇到的每一對(duì)象,序列化器向序列化管理器請(qǐng)求另外的序列化器。序列化的結(jié)果被返回給調(diào)用者。配合引擎組件模型中的每一活動(dòng)可參與序列化。在一個(gè)實(shí)施例中,序列化器組件不是活動(dòng)類(lèi)本身的一部分。相反,該組件通過(guò)在與該活動(dòng)相關(guān)聯(lián)的類(lèi)中注釋序列化器元屬性來(lái)指定。序列化器元屬性指向用于序列化該活動(dòng)類(lèi)型的對(duì)象的類(lèi)。在另一實(shí)施例中,活動(dòng)類(lèi)型的提供者組件覆蓋了由該活動(dòng)提供的默認(rèn)序列化器。設(shè)計(jì)器序列化基于元數(shù)據(jù)、序列化器和序列化管理器。元數(shù)據(jù)元屬性用于將類(lèi)型與序列化器相關(guān)?!俺绦蛞龑?dǎo)”元屬性可用于安裝為沒(méi)有序列化器的類(lèi)型提供序列化器的對(duì)象。序列化器是知道如何序列化特定類(lèi)型或類(lèi)型作用域的對(duì)象。對(duì)每一數(shù)據(jù)格式存在一基類(lèi)。例如,可以有知道如何將對(duì)象轉(zhuǎn)換成XML的XmlSerializer(XML序列化器)基類(lèi)。本發(fā)明是獨(dú)立于任何特定序列化格式的通用體系結(jié)構(gòu)。序列化管理器是對(duì)用于序列化對(duì)象圖的所有各種序列化器提供信息存儲(chǔ)的對(duì)象。例如,五十個(gè)推想的圖可具有五十個(gè)不同的序列化器,它們都生成其自己的輸出。序列化管理器可由這些序列化器使用以在必要時(shí)彼此通信。在一個(gè)實(shí)施例中,與使用類(lèi)屬對(duì)象元數(shù)據(jù)的序列化器耦合的序列化提供者的使用提供了一種回叫機(jī)制,其中,給予對(duì)象向給定類(lèi)型提供序列化器的機(jī)會(huì)。可通過(guò)諸如AddSerializationProvider(添加序列化提供者)等方法來(lái)向序列化管理器給予序列化提供者。序列化提供者可通過(guò)向序列化器添加諸如DefaultSerializationProviderAttribute(默認(rèn)序列化提供者屬性)等元屬性而被自動(dòng)添加到序列化管理器。在一個(gè)實(shí)施例中,格式由以下規(guī)則來(lái)規(guī)定對(duì)象被序列化為xml元素、對(duì)象的屬性被歸類(lèi)為簡(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=″sendl″><MessageName=″msgl″Type=″System.UInt32″/><OnBeforeSendName=″onBeforeSendl″/><TypedChannelType=″System.Collections.IList″Operation=″AddIndex″Name=″Foo″/></Send></While>在其中用于序列化的語(yǔ)言是XOML的實(shí)施例中,當(dāng)編譯進(jìn)度表時(shí),每一XOML元素被序列化成其各自的對(duì)象。對(duì)象包括簡(jiǎn)單和復(fù)雜類(lèi)型兩者。接下來(lái)描述每一活動(dòng)的XOML表示之問(wèn)的映射及其到創(chuàng)作對(duì)象模型的映射。XOML的序列化在原語(yǔ)(Primitive)和合成(Composite)活動(dòng)之間有所不同。原語(yǔ)活動(dòng)的簡(jiǎn)單類(lèi)型被序列化為該活動(dòng)類(lèi)型上的元屬性。原語(yǔ)活動(dòng)的復(fù)雜類(lèi)型被序列化為子元素。作為一個(gè)示例,以下是Send活動(dòng)的XOML表示。<SendID=″sendl″HasTypedChannel=″False″><MessageName=″messagel″Type=″System.String″/><UntypedChannelName=″cl″/></Send>以與原語(yǔ)類(lèi)型序列化類(lèi)似的方式,合成活動(dòng)的簡(jiǎn)單類(lèi)型被序列化為該活動(dòng)類(lèi)型上的元屬性。然而,按照定義,合成活動(dòng)封裝了嵌套的活動(dòng)。每一嵌套的活動(dòng)被序列化為另一子元素。作為一個(gè)示例,以下是While活動(dòng)的XOML表示。<WhileID=″whilel″><ConditionRule><CodeExpressionRule><ExpressionName=″test″/></CodeExpressionRule></ConditionRule></While>過(guò)程/工作流視圖和序列化的表示之間存在強(qiáng)關(guān)系。圖8示出了可視工作流、該工作流的序列化(例如,XOML)表示以及該工作流的分離代碼之間的進(jìn)度表定義和關(guān)系。當(dāng)以任一表示創(chuàng)作時(shí),其它表示將招致改變。由此,當(dāng)開(kāi)發(fā)者在XOML和過(guò)程/工作流視圖之間切換時(shí),修改活動(dòng)的XOML(或在合成活動(dòng)的情況下修改其構(gòu)成部分)直接在過(guò)程/工作流視圖中得到反映。反過(guò)來(lái)也是適用的。修改過(guò)程/工作流視圖中的活動(dòng)導(dǎo)致XOML內(nèi)的適當(dāng)修改。作為一個(gè)示例,過(guò)程/工作流中的活動(dòng)的刪除導(dǎo)致同一活動(dòng)的XOML中XML元素的移除。在過(guò)程/工作流視圖和分離的代碼之間也發(fā)生往返。在創(chuàng)建XOML代碼的過(guò)程中,如果XOML定義不符合預(yù)定義的接口要求,則在違反的XML元素下加下劃線,或用其它方式可視地向開(kāi)發(fā)者標(biāo)識(shí)。如果開(kāi)發(fā)者切換到過(guò)程視圖,則將向他們警告在XOML內(nèi)存在錯(cuò)誤,且設(shè)計(jì)器提供一鏈接,開(kāi)發(fā)者可點(diǎn)擊該鏈接并且會(huì)被導(dǎo)航到違反的元素。該同一錯(cuò)誤出現(xiàn)在任務(wù)面板中,并且在雙擊該錯(cuò)誤之后,開(kāi)發(fā)者將會(huì)被導(dǎo)航到XOML中違反的元素。從XOML文件創(chuàng)建活動(dòng)樹(shù)(反序列化)在一個(gè)實(shí)施例中,CreateEditorInstance()函數(shù)(創(chuàng)建編輯器實(shí)例)創(chuàng)建DesignSurface(設(shè)計(jì)表面)對(duì)象,然后對(duì)DesignSurface對(duì)象調(diào)用BeginLoad()函數(shù)(開(kāi)始加載),向其傳遞實(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)聽(tīng)對(duì)XOML文件的改變以跟蹤分層結(jié)構(gòu)和項(xiàng)標(biāo)識(shí)改變,來(lái)更新視件工作室高速緩存中的值。次要文檔數(shù)據(jù)列表包括對(duì)用戶(hù)不可見(jiàn)的次要文檔的列表,配合引擎設(shè)計(jì)器在這些次要文檔上工作。例如,用戶(hù)尚未打開(kāi)分離代碼文件,但當(dāng)用戶(hù)在配合引擎設(shè)計(jì)器中做出改變時(shí),對(duì)該分離代碼文件做出改變是可能的。由于該文件對(duì)用戶(hù)是不可見(jiàn)的,因此該文件作為次要文檔來(lái)維護(hù)。只要保存XOML文件,就自動(dòng)保存次要文檔。如果這些文件之一的名字改變,或者文件被刪除,則本發(fā)明相應(yīng)地更新對(duì)應(yīng)的次要文檔對(duì)象。對(duì)象樹(shù)的示例性反序列化準(zhǔn)則如下。xml元素首先作為父對(duì)象的屬性來(lái)處理。如果父對(duì)象沒(méi)有具有該元素標(biāo)簽名的屬性,則該元素作為父對(duì)象的子對(duì)象來(lái)處理。xml元屬性作為父對(duì)象上的簡(jiǎn)單屬性來(lái)處理。在適用上述序列化代碼的一個(gè)示例性反序列化中,<While>元素作為適用xml名字空間信息創(chuàng)建的對(duì)象來(lái)處理。<ConditionRule>元素作為While活動(dòng)的屬性來(lái)處理。<CodeExpressionRuleDeclaration>元素作為其值將被應(yīng)用于ConditionRule屬性的對(duì)象來(lái)處理。<Send>元素首先作為While活動(dòng)的屬性來(lái)嘗試,但“While”活動(dòng)沒(méi)有具有名字為“Send”的屬性,因此<Send>元素作為對(duì)象來(lái)處理,并作為子活動(dòng)添加到while活動(dòng)。<Message>元素作為Send活動(dòng)的屬性來(lái)處理。由于Send上的Message屬性是只讀的,因此Message元素的內(nèi)容被認(rèn)為是Message對(duì)象的內(nèi)容。類(lèi)似的規(guī)則也適用于<OnBeforeSend>和<TypedChannel>元素的反序列化。在以下條件下,XOML反序列化將會(huì)嚴(yán)重失敗XOML代碼不是良好形成的、XomlDocument不是XOML代碼中的第一個(gè)元素、以及XOML代碼中的第一個(gè)活動(dòng)不能被反序列化。將向開(kāi)發(fā)者呈現(xiàn)出錯(cuò)消息,當(dāng)從XOML視圖切換到過(guò)程/工作流視圖時(shí),通過(guò)該消息他們可被導(dǎo)航到違反的XML元素。主宿配合引擎設(shè)計(jì)器設(shè)計(jì)器框架可被主宿在任何應(yīng)用程序中。這對(duì)于第三方應(yīng)用程序要在其各自的環(huán)境中呈現(xiàn)工作流而言是非常有用的特征。它也允許第三方通過(guò)重新主宿和定址設(shè)計(jì)器表面來(lái)開(kāi)發(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í)行以下代碼來(lái)加載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ù)(類(lèi)型提供者)啟用類(lèi)型系統(tǒng)。另外,可以有由設(shè)計(jì)器主宿環(huán)境提供的其它服務(wù),以啟用高級(jí)的設(shè)計(jì)器特征。類(lèi)型流是本發(fā)明的組件模型框架中的一個(gè)組件。當(dāng)設(shè)計(jì)器主宿在項(xiàng)目系統(tǒng)內(nèi)部時(shí),在每一項(xiàng)目的基礎(chǔ)上創(chuàng)建TypeProvider(類(lèi)型提供者)對(duì)象。項(xiàng)目中的程序集引用被壓入類(lèi)型提供者。此外,對(duì)項(xiàng)目中的用戶(hù)代碼文件進(jìn)行語(yǔ)法分析,并創(chuàng)建單個(gè)代碼編譯且將其壓入類(lèi)型提供者。同樣,本發(fā)明監(jiān)聽(tīng)項(xiàng)目系統(tǒng)中將導(dǎo)致類(lèi)型系統(tǒng)中的類(lèi)型改變的事件,并響應(yīng)于改變對(duì)類(lèi)型提供者做出適當(dāng)?shù)恼{(diào)用來(lái)重新加載類(lèi)型。撤消/恢復(fù)在創(chuàng)建且正確地構(gòu)造了進(jìn)度表之后,開(kāi)發(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)用程序中使用的常見(jiàn)特征,且其意義是被普遍理解的。在配合引擎設(shè)計(jì)器中,撤消/恢復(fù)項(xiàng)在保存時(shí)不被清除。此外,撤消/恢復(fù)可在過(guò)程/工作流視圖中、XOML視圖中、當(dāng)開(kāi)發(fā)者在視圖之間切換時(shí)、以及在分離代碼中執(zhí)行。對(duì)過(guò)程/工作流視圖中的以下動(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ì)器向開(kāi)發(fā)者提供了反饋,指示過(guò)程/工作流視圖中做出改變?nèi)缓笤谛蛄谢晥D中撤消將導(dǎo)致序列化代碼的丟失。當(dāng)開(kāi)發(fā)者在過(guò)程/工作流視圖中構(gòu)造進(jìn)度表的一部分時(shí),切換到序列化視圖然后決定執(zhí)行撤消/恢復(fù)操作,將出現(xiàn)警告。示例性操作環(huán)境圖9以計(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表示若干類(lèi)型總線結(jié)構(gòu)的任一種的一個(gè)或多個(gè),包括存儲(chǔ)器總線或存儲(chǔ)器控制器、外圍總線、加速圖形端口、以及使用各種總線體系結(jié)構(gòu)的任一種的處理器或局部總線。作為示例而非局限,這類(lèi)體系結(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)總線,也稱(chēng)為Mezzanine總線。計(jì)算機(jī)130通常具有至少某種形式的計(jì)算機(jī)可讀介質(zhì)。計(jì)算機(jī)可讀介質(zhì)可以是可由計(jì)算機(jī)130訪問(wèn)的任何可用介質(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ù)字多功能盤(pán)(DVD)或其它光盤(pán)存儲(chǔ)、磁盒、磁帶、磁盤(pán)存儲(chǔ)或其它磁存儲(chǔ)設(shè)備、或可以用來(lái)儲(chǔ)存所期望的信息并可由計(jì)算機(jī)130訪問(wèn)的任一其它介質(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ò)或直接連線連接,以及無(wú)線介質(zhì),如聲學(xué)、RF、紅外和其它無(wú)線介質(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立即可訪問(wèn)或者當(dāng)前正在操作的數(shù)據(jù)和/或程序模塊。作為示例而非局限,圖9示出了操作系統(tǒng)144、應(yīng)用程序146、其它程序模塊148和程序數(shù)據(jù)150。計(jì)算機(jī)130也可包括其它可移動(dòng)/不可移動(dòng)、易失性/非易失性計(jì)算機(jī)存儲(chǔ)介質(zhì)。例如,圖9示出了對(duì)不可移動(dòng)、非易失性磁介質(zhì)進(jìn)行讀寫(xiě)的硬盤(pán)驅(qū)動(dòng)器154。圖9也示出了對(duì)可移動(dòng)、非易失性磁盤(pán)158進(jìn)行讀寫(xiě)的磁盤(pán)驅(qū)動(dòng)器156以及對(duì)可移動(dòng)、非易失性光盤(pán)162,如CDROM或其它光介質(zhì)進(jìn)行讀寫(xiě)的光盤(pán)驅(qū)動(dòng)器160。可以在示例性操作環(huán)境中使用的其它可移動(dòng)/不可移動(dòng)、易失性/非易失性計(jì)算機(jī)存儲(chǔ)介質(zhì)包括但不限于,磁帶盒、閃存卡、數(shù)字多功能盤(pán)、數(shù)字視頻帶、固態(tài)RAM、固態(tài)ROM等等。硬盤(pán)驅(qū)動(dòng)器154、磁盤(pán)驅(qū)動(dòng)器156和光盤(pán)驅(qū)動(dòng)器160通常通過(guò)非易失性存儲(chǔ)器接口,如接口160連接到系統(tǒng)總線136。上文討論并在圖9示出的驅(qū)動(dòng)器及其關(guān)聯(lián)的計(jì)算機(jī)存儲(chǔ)介質(zhì)為計(jì)算機(jī)130提供了計(jì)算機(jī)可讀指令、數(shù)據(jù)結(jié)構(gòu)、程序模塊和其它數(shù)據(jù)的存儲(chǔ)。例如,在圖9中,示出硬盤(pán)驅(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)來(lái)說(shuō)明至少它們是不同的副本。用戶(hù)可以通過(guò)輸入設(shè)備或用戶(hù)界面選擇設(shè)備,如鍵盤(pán)180和定位設(shè)備182(例如,鼠標(biāo)、跟蹤球或觸摸墊)向計(jì)算機(jī)130輸入命令和信息。其它輸入設(shè)備(未示出)可包括麥克風(fēng)、操縱桿、游戲墊、圓盤(pán)式衛(wèi)星天線、掃描儀等等。這些和其它輸入設(shè)備通常通過(guò)耦合至系統(tǒng)總線136的用戶(hù)輸入接口184連接至處理單元132,但是也可以通過(guò)其它接口和總線結(jié)構(gòu)連接,如并行端口、游戲端口或通用串行總線(USB)。監(jiān)視器188或其它類(lèi)型的顯示設(shè)備也通過(guò)接口,如視頻接口190連接至系統(tǒng)總線136。除監(jiān)視器188之外,計(jì)算機(jī)通常包括其它外圍輸出設(shè)備(未示出),如打印機(jī)和揚(yáng)聲器,它們可通過(guò)輸出外圍接口(未示出)連接。計(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所描述的元件。圖9描述的邏輯連接包括局域網(wǎng)(LAN)196和廣域網(wǎng)(WAN)198,但也可包括其它網(wǎng)絡(luò)。LAN136和/或WAN138可以是有線網(wǎng)絡(luò)、無(wú)線網(wǎng)絡(luò)、其組合等等。這類(lèi)網(wǎng)絡(luò)環(huán)境常見(jià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通過(guò)網(wǎng)絡(luò)接口或適配器186連接至LAN196。當(dāng)在廣域網(wǎng)網(wǎng)絡(luò)環(huán)境中使用時(shí),計(jì)算機(jī)130通常包括調(diào)制解調(diào)器178或用于通過(guò)WAN198,如因特網(wǎng)建立通信的其它裝置。調(diào)制解調(diào)器178可以是內(nèi)置或外置的,它通過(guò)用戶(hù)輸入接口184或其它適當(dāng)?shù)臋C(jī)制連接至系統(tǒng)總線136。在網(wǎng)絡(luò)化環(huán)境中,相對(duì)于計(jì)算機(jī)130所描述的程序模塊或其部分可儲(chǔ)存在遠(yuǎn)程存儲(chǔ)器存儲(chǔ)設(shè)備(未示出)中。作為示例而非局限,圖9示出遠(yuǎn)程應(yīng)用程序192駐留在存儲(chǔ)器設(shè)備上。示出的網(wǎng)絡(luò)連接是示例性的,也可以使用在計(jì)算機(jī)之間建立通信鏈路的其它裝置。一般而言,計(jì)算機(jī)130的數(shù)據(jù)處理器通過(guò)在不同的時(shí)刻儲(chǔ)存在計(jì)算機(jī)的各種計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)中的指令來(lái)編程。例如,程序和操作系統(tǒng)通常分布在軟盤(pán)或CD-ROM上。從那里,它們被安裝或加載到計(jì)算機(jī)的次級(jí)存儲(chǔ)器中。在執(zhí)行時(shí),它們被至少部分地加載到計(jì)算機(jī)的初級(jí)電子存儲(chǔ)器中。此處描述的本發(fā)明包括這些和其它各種類(lèi)型的計(jì)算機(jī)可讀存儲(chǔ)介質(zhì),這些介質(zhì)包含用于實(shí)現(xiàn)以下結(jié)合微處理器或其它數(shù)據(jù)處理器描述的步驟的指令。當(dāng)依照此處描述的方法和技術(shù)編程時(shí),本發(fā)明也包括計(jì)算機(jī)本身。為說(shuō)明起見(jiàn),諸如操作系統(tǒng)等程序和其它可執(zhí)行程序組件在此被示出為離散的框。然而,可以認(rèn)識(shí)到,這些程序和組件在不同的時(shí)刻駐留在計(jì)算機(jī)的不同存儲(chǔ)組件中,且由計(jì)算機(jī)的數(shù)據(jù)處理器執(zhí)行。盡管結(jié)合包括計(jì)算機(jī)130的示例性計(jì)算系統(tǒng)環(huán)境來(lái)描述,然而本發(fā)明也可用眾多其它通用或?qū)S糜?jì)算系統(tǒng)環(huán)境或配置來(lái)操作。該計(jì)算系統(tǒng)環(huán)境并非對(duì)本發(fā)明的使用作用域或功能提出任何局限。此外,該計(jì)算環(huán)境不應(yīng)當(dāng)被解釋為對(duì)示例性操作環(huán)境中所示的組件的任一個(gè)或其組合具有任何依賴(lài)性或要求??蛇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)電話(huà)、網(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ù)類(lèi)型。本發(fā)明也可以在分布式計(jì)算環(huán)境中實(shí)踐,其中,任務(wù)由通過(guò)通信網(wǎng)絡(luò)連接的遠(yuǎn)程處理設(shè)備來(lái)執(zhí)行。在分布式計(jì)算環(huán)境中,程序模塊可以位于包括存儲(chǔ)器存儲(chǔ)設(shè)備的本地和遠(yuǎn)程計(jì)算機(jī)存儲(chǔ)介質(zhì)中。軟件體系結(jié)構(gòu)上下文中的接口包括軟件模塊、組件、代碼部分或其它計(jì)算機(jī)可執(zhí)行指令序列。例如,接口包括訪問(wèn)第二模塊的第一模塊,以代表該第一模塊執(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ì)象訪問(wèn)協(xié)議)。一般而言,接口包括以下特征的任一組合緊耦合、松耦合、同步和異步。此外,接口可以符合標(biāo)準(zhǔn)協(xié)議、專(zhuān)有協(xié)議或標(biāo)準(zhǔn)和專(zhuā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)在說(shuō)明性而非限制性的意義上解釋。附錄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)聽(tīng))、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ù),因此定義了一抽象基類(lèi)并將其用作所有三個(gè)活動(dòng)的超類(lèi)。Receive活動(dòng)配合引擎提供了用于接收消息的三種活動(dòng)(例如,Receive、ReceiveRequest以及ReceiveResponse),其每一個(gè)著重于一個(gè)不同的使用情況。另外,由于三個(gè)活動(dòng)共享某一元數(shù)據(jù),因此定義了一抽象基類(lèi)并將其用作所有三個(gè)活動(dòng)的超類(lèi)。CodeCode活動(dòng)執(zhí)行元數(shù)據(jù)中指示的代碼分離方法。DelayDelay活動(dòng)執(zhí)行其強(qiáng)制的代碼分離方法來(lái)生成DateTime(日期時(shí)間)值。它內(nèi)部地將其實(shí)例上的TimeoutValue(超時(shí)值)屬性設(shè)為該值。如果DateTime是過(guò)去的,則Delay立即完成。否則,它設(shè)置一定時(shí)器預(yù)定,使得當(dāng)定時(shí)器激發(fā)時(shí)將通知Delay。當(dāng)定時(shí)器激發(fā)時(shí),通知Delay并且它完成。FaultFault活動(dòng)執(zhí)行其強(qiáng)制的代碼分離方法來(lái)生成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通過(guò)代理類(lèi)調(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)CAG告知要執(zhí)行Constrained活動(dòng)時(shí),它僅僅執(zhí)行它所包裝的活動(dòng)。CAG(ConstrainedActivityGroup)當(dāng)CAG執(zhí)行時(shí),它基于其啟用和禁用的約束的評(píng)估來(lái)執(zhí)行(并重新執(zhí)行)子活動(dòng)。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)類(lèi)型是Sequence、Parallel、Constrained、ActivityGroup、Conditional、While、Listen。另外,Scope和Schedule是擔(dān)當(dāng)容器的補(bǔ)償活動(dòng)類(lèi)型,該容器具有其中的活動(dòng)的隱含排序。權(quán)利要求1.一種將出錯(cuò)和異常處理應(yīng)用于工作流中一個(gè)或多個(gè)選中活動(dòng)的計(jì)算機(jī)實(shí)現(xiàn)的方法,所述計(jì)算機(jī)實(shí)現(xiàn)的方法包括選擇一預(yù)定義的行為組件;選擇工作流中一個(gè)或多個(gè)的活動(dòng);以及將所選擇的行為組件與所選擇的活動(dòng)相關(guān),以使所選擇的行為組件能夠響應(yīng)于所選擇的活動(dòng)而運(yùn)作。2.如權(quán)利要求1所述的計(jì)算機(jī)實(shí)現(xiàn)的方法,其特征在于,所述行為組件包括一個(gè)或多個(gè)規(guī)則,并且其中,所選擇的行為組件將所述規(guī)則應(yīng)用于所選擇的活動(dòng)。3.如權(quán)利要求1所述的計(jì)算機(jī)實(shí)現(xiàn)的方法,其特征在于,還包括與所選擇的行為組件協(xié)調(diào)地執(zhí)行所選擇的活動(dòng)。4.如權(quán)利要求1所述的計(jì)算機(jī)實(shí)現(xiàn)的方法,其特征在于,執(zhí)行所選擇的活動(dòng)包括創(chuàng)建與所選擇的行為組件相關(guān)聯(lián)的上下文;在所創(chuàng)建的上下文中執(zhí)行所選擇的活動(dòng)。5.如權(quán)利要求1所述的計(jì)算機(jī)實(shí)現(xiàn)的方法,其特征在于,還包括從用戶(hù)接收用戶(hù)定義的活動(dòng),所述用戶(hù)定義的活動(dòng)具有與其相關(guān)聯(lián)的一個(gè)或多個(gè)語(yǔ)義;評(píng)估所述語(yǔ)義學(xué),以找出與預(yù)定義接口要求的一致性;根據(jù)所述評(píng)估,在所創(chuàng)建的上下文中執(zhí)行所接收的用戶(hù)定義活動(dòng)。6.如權(quán)利要求1所述的計(jì)算機(jī)實(shí)現(xiàn)的方法,其特征在于,所述行為組件包括描述所述行為組件的功能的元數(shù)據(jù)。7.如權(quán)利要求1所述的計(jì)算機(jī)實(shí)現(xiàn)的方法,其特征在于,還包括從用戶(hù)處接收對(duì)所述元數(shù)據(jù)的修改。8.如權(quán)利要求1所述的計(jì)算機(jī)實(shí)現(xiàn)的方法,其特征在于,一個(gè)或多個(gè)計(jì)算機(jī)可讀介質(zhì)具有用于執(zhí)行如權(quán)利要求1所述的計(jì)算機(jī)實(shí)現(xiàn)的方法的計(jì)算機(jī)可執(zhí)行指令。9.如權(quán)利要求1所述的計(jì)算機(jī)實(shí)現(xiàn)的方法,其特征在于,還包括定義所述一個(gè)或多個(gè)活動(dòng)。10.如權(quán)利要求1所述的計(jì)算機(jī)實(shí)現(xiàn)的方法,其特征在于,還包括定義所述行為組件。11.一個(gè)或多個(gè)具有計(jì)算機(jī)可執(zhí)行模塊的計(jì)算機(jī)可讀介質(zhì),所述模塊用于將出錯(cuò)和異常處理應(yīng)用于工作流中的一個(gè)或多個(gè)活動(dòng),所述模塊包括設(shè)計(jì)器模塊,用于選擇一預(yù)定義的行為組件以及用于選擇工作流中的一個(gè)或多個(gè)活動(dòng)。上下文模塊,用于將由所述設(shè)計(jì)器模塊選擇的行為組件和活動(dòng)相關(guān),以使所選擇的行為組件能夠響應(yīng)于所選擇的活動(dòng)而運(yùn)作;以及運(yùn)行時(shí)引擎模塊,用于根據(jù)由所述上下文模塊相關(guān)的行為組件,執(zhí)行由所述設(shè)計(jì)器模塊選擇的活動(dòng)。12.如權(quán)利要求11所述的計(jì)算機(jī)可讀介質(zhì),其特征在于,還包括選項(xiàng)板模塊,用于定義所述行為組件。13.如權(quán)利要求11所述的計(jì)算機(jī)可讀介質(zhì),其特征在于,所述上下文模塊還創(chuàng)建與所定義的行為組件相關(guān)聯(lián)的上下文。14.如權(quán)利要求11所述的計(jì)算機(jī)可讀介質(zhì),其特征在于,所述設(shè)計(jì)器模塊包括用戶(hù)界面。15.一種用于將出錯(cuò)和異常處理應(yīng)用于工作流中的一個(gè)或多個(gè)活動(dòng)的系統(tǒng),所述系統(tǒng)包括存儲(chǔ)多個(gè)活動(dòng)的存儲(chǔ)器區(qū)域,每個(gè)活動(dòng)具有定義的接口,所述存儲(chǔ)器區(qū)域還存儲(chǔ)多個(gè)行為組件,每個(gè)行為組件符合所述定義的接口,每個(gè)行為組件涉及至少兩個(gè)活動(dòng);以及處理器,它被配置成執(zhí)行計(jì)算機(jī)可執(zhí)行指令,用于從用戶(hù)接收對(duì)存儲(chǔ)在所述存儲(chǔ)器區(qū)域中的行為組件之一的選擇;從用戶(hù)接收對(duì)存儲(chǔ)在所述存儲(chǔ)器區(qū)域中的至少兩個(gè)活動(dòng)的選擇;創(chuàng)建與所選擇的行為組件相關(guān)聯(lián)的上下文;以及在所創(chuàng)建的上下文中執(zhí)行所選擇的活動(dòng)。16.如權(quán)利要求15所述的系統(tǒng),其特征在于,存儲(chǔ)在所述存儲(chǔ)器區(qū)域中的行為組件涉及下列的一個(gè)或多個(gè)出錯(cuò)處理、異常處理以及消息通信。17.如權(quán)利要求15所述的系統(tǒng),其特征在于,存儲(chǔ)在所述存儲(chǔ)器區(qū)域中的每個(gè)行為組件包括作用域組件和過(guò)程組件。18.如權(quán)利要求17所述的系統(tǒng),其特征在于,所述作用域組件涉及下列的一個(gè)或多個(gè)過(guò)程分析、狀態(tài)管理、事務(wù)、同步以及異常出錯(cuò)處理。19.如權(quán)利要求17所述的系統(tǒng),其特征在于,所述過(guò)程組件涉及下列的一個(gè)或多個(gè)事務(wù)處理、同步以及異常出錯(cuò)處理。20.如權(quán)利要求15所述的系統(tǒng),其特征在于,所述存儲(chǔ)器區(qū)域還包括用于每個(gè)行為組件的數(shù)據(jù)結(jié)構(gòu),所述數(shù)據(jù)結(jié)構(gòu)包括下列的一個(gè)或多個(gè)屬性、方法、事件、設(shè)計(jì)器、序列化器以及運(yùn)行時(shí)組件。全文摘要選擇并向組件化工作流的一部分應(yīng)用行為組件。該行為組件向由用戶(hù)選擇的工作流的該部分定義了出錯(cuò)和異常處理以及其它問(wèn)題。在工作流的執(zhí)行期間,行為組件響應(yīng)于來(lái)自工作流的所選擇部分的輸出而執(zhí)行。文檔編號(hào)G06F9/44GK1808375SQ20051009984公開(kāi)日2006年7月26日申請(qǐng)日期2005年9月1日優(yōu)先權(quán)日2004年10月1日發(fā)明者D·K·舒克拉,R·B·施密特申請(qǐng)人:微軟公司
網(wǎng)友詢(xún)問(wèn)留言 已有0條留言
  • 還沒(méi)有人留言評(píng)論。精彩留言會(huì)獲得點(diǎn)贊!
1
资阳市| 连州市| 和静县| 商水县| 灵寿县| 阜阳市| 萨迦县| 伊川县| 临桂县| 西贡区| 乌拉特前旗| 四会市| 墨玉县| 绥阳县| 繁昌县| 平泉县| 丁青县| 修武县| 济阳县| 五寨县| 临澧县| 滨州市| 广平县| 卢氏县| 社旗县| 潮安县| 武汉市| 安庆市| 舒兰市| 汕尾市| 黑河市| 开封县| 涿州市| 博爱县| 澳门| 莲花县| 莱州市| 尼木县| 克拉玛依市| 普洱| 云龙县|