專利名稱::Xml應(yīng)用程序框架的制作方法版權(quán)公告本專利文獻的公開內(nèi)容的一部分包含受版權(quán)保護的材料。版權(quán)所有者不反對任何人如在美國專利商標局的專利文件或記錄中那樣對本專利文獻或?qū)@_內(nèi)容的影印復制,但是無論如何另外保留所有的版權(quán)。背景一般而言,軟件系統(tǒng)提供了組織和互連計算機系統(tǒng)內(nèi)的軟件組件的軟件體系結(jié)構(gòu)。這些軟件組件執(zhí)行向軟件應(yīng)用程序給予其功能的操作。一般而言,應(yīng)用程序以若干特征來操作,這些特征各自具有一個或多個組件。組件,以及因此的特征可從將操作剖析成更小且更簡單任務(wù)的一個或多個底層軟件組件來形成。當構(gòu)造軟件應(yīng)用程序時,軟件開發(fā)者必須使用諸如C#等開發(fā)語言來創(chuàng)建軟件組件。在創(chuàng)建命令代碼,即向軟件組件給予其功能的軟件代碼時,開發(fā)者必須通過調(diào)用或其它構(gòu)造來創(chuàng)建所有組件之間的鏈接。對于由應(yīng)用程序提供的任何功能,軟件開發(fā)者一般為執(zhí)行應(yīng)用程序?qū)S霉δ艿乃胁煌浖M件創(chuàng)建代碼,并對彼此依賴來完成任務(wù)的軟件組件之間的互連手動書寫代碼。軟件開發(fā)者創(chuàng)建用戶界面(UI)、數(shù)據(jù)構(gòu)造、以及對用戶和應(yīng)用程序之間的交互所需的所有操作。在許多應(yīng)用程序中,UI、操作和數(shù)據(jù)構(gòu)造是應(yīng)用程序?qū)S玫摹S纱?,為了?chuàng)建應(yīng)用程序,軟件開發(fā)者通常創(chuàng)建大量的代碼。另外,軟件開發(fā)者一般組織并創(chuàng)建軟件的不同片段之間的所有相互關(guān)系。為創(chuàng)建任何應(yīng)用程序,軟件開發(fā)者必須是非常熟練的,因為用于創(chuàng)建應(yīng)用程序的底層語言是復雜的。由于用于生成應(yīng)用程序的當前方法的復雜性,且由于用于給定應(yīng)用程序的代碼的特殊性及其不可避免的互連性,軟件開發(fā)者無法容易地在沒有巨大努力以及不冒對現(xiàn)有應(yīng)用程序的損壞的風險的情況下對當前應(yīng)用程序進行修改或擴展。本發(fā)明正是針對這些和其它考慮來作出的。概述提供本概述來以簡化的形式引入以下將在詳細描述中進一步描述的某些概念。本概述并不旨在標識本權(quán)利要求的主題的關(guān)鍵特征或必要特征。本發(fā)明的各實施例通過提供一種軟件應(yīng)用程序框架來解決上述和其它問題,該框架用于為給定軟件應(yīng)用程序生成運行時結(jié)構(gòu)并用于管理該軟件應(yīng)用程序的執(zhí)行。由本發(fā)明的應(yīng)用程序框架生成的應(yīng)用程序由連接的應(yīng)用程序組件的集合或圖組成。根據(jù)該應(yīng)用程序框架配置的應(yīng)用程序的功能通過將各應(yīng)用程序組件組動態(tài)地配置到組件域中來啟用,其中每一域被配置成啟用該應(yīng)用程序的一給定功能,例如顯示字處理文檔中的圖片。為生成用于應(yīng)用程序的運行時結(jié)構(gòu),應(yīng)用程序?qū)⒂糜诿恳凰璧膽?yīng)用程序功能的應(yīng)用程序描述傳遞給應(yīng)用程序描述引擎。該應(yīng)用程序描述提供了用于構(gòu)造和組合組件域的聲明性規(guī)則,且該應(yīng)用程序描述引擎用于基于由應(yīng)用程序接收到的數(shù)據(jù)事件在需要時解釋用于創(chuàng)建和配置組件域的聲明性規(guī)則。由應(yīng)用程序接收到的數(shù)據(jù)事件可由用戶動作,例如,響應(yīng)于對用戶界面中的功能按鈕或控件或數(shù)據(jù)對象的用戶選擇來生成。數(shù)據(jù)事件也可由外部改變,例如作為運行外部進程的結(jié)果由應(yīng)用程序接收或從另一應(yīng)用程序或第三方來源接收的數(shù)據(jù)來生成。根據(jù)一個實施例,應(yīng)用程序描述和應(yīng)用程序描述引擎根據(jù)可擴展標記語言(XML)來結(jié)構(gòu)化和/或操作。盡管可在該應(yīng)用程序框架中使用XML來提供陳述該框架內(nèi)的動作或其它發(fā)生事件的標準且簡單的手段,但是該應(yīng)用程序框架不限于僅使用XML。該應(yīng)用程序描述引擎解釋對每一所需功能的應(yīng)用程序描述,然后獲得為每一所需功能構(gòu)造組件域所需的應(yīng)用程序組件。根據(jù)一個實施例,該應(yīng)用程序描述引擎從與應(yīng)用程序相關(guān)聯(lián)地維護的組件庫中獲得應(yīng)用程序組件。例如,該應(yīng)用程序描述引擎可構(gòu)造用于顯示文檔中的文本的一個域、用于顯示文檔中的圖片對象的第二個域、以及用于格式化應(yīng)用程序的功能的第三個域等等。根據(jù)各實施例,該應(yīng)用程序框架還包括用于管理應(yīng)用程序的執(zhí)行和包括該應(yīng)用程序的域的執(zhí)行管理模型。當在應(yīng)用程序的執(zhí)行期間發(fā)生例如刪除數(shù)據(jù)表中的數(shù)據(jù)項等要求調(diào)用給定應(yīng)用程序功能且因此要求調(diào)用啟用該功能的特定組件域的數(shù)據(jù)事件時,由應(yīng)用程序向主體域分派單個處理線程以執(zhí)行根據(jù)該數(shù)據(jù)驅(qū)動事件的域的組件。一旦單個處理線程進入主體域,該域的組件由該線程根據(jù)執(zhí)行階段模型來執(zhí)行。在第一階段,即讀取/請求階段,讀取所需數(shù)據(jù),例如,要從表對象中刪除的一個值,隨后是所需改變的請求,例如,從示例表對象中刪除所請求的值的請求。在第二階段,即重新確認/重新配置階段期間,由應(yīng)用程序描述引擎根據(jù)所請求的改變重新確認或重新配置該主體域。即,應(yīng)用程序描述引擎在必要時根據(jù)適用于數(shù)據(jù)改變的新配置來重新配置該域。在重新配置階段期間,應(yīng)用程序描述引擎可丟棄該域的某些組件、獲得該域的新組件或?qū)⒃撚蛲耆珡U棄。由此,給定域是具有等于初始配置和后續(xù)的重新配置之間的時間的生存期的組件的集合,其中后續(xù)的重新配置進而開始給定域的下一配置(如果有)的生存期。因此,由應(yīng)用程序描述引擎生成的每一組件域用作執(zhí)行應(yīng)用程序的給定數(shù)據(jù)驅(qū)動功能所需的組件的集合,且該域具有由應(yīng)用程序?qū)υ撚虻姆?wù)的需求所確定的生存期。本發(fā)明及其改進的更全面理解可通過參考以下簡要概述的附圖、以下本發(fā)明示例性實施例的詳細描述以及所附權(quán)利要求書來獲得。附圖簡述圖1A是示出一種計算環(huán)境和基本計算設(shè)備的功能圖,它們可用根據(jù)本發(fā)明的應(yīng)用程序框架來構(gòu)造應(yīng)用程序并在該框架下執(zhí)行應(yīng)用程序。圖1B示出了一計算機屏幕顯示,它示出了由示出一個或多個顯示數(shù)據(jù)對象的示例字處理應(yīng)用程序顯示的一個示例字處理文檔。圖2A是示出根據(jù)本發(fā)明的應(yīng)用程序、應(yīng)用程序描述引擎和一個或多個組件域之間的交互的功能圖。圖2B是示出根據(jù)本發(fā)明的具有連接到一個或多個UI以及一個或多個數(shù)據(jù)存儲的應(yīng)用程序組件的應(yīng)用程序框架的一個示例性實施例的功能圖。圖3是示出根據(jù)本發(fā)明的具有連接在UI和數(shù)據(jù)存儲之間并由示例性應(yīng)用程序描述和示例性XAD引擎配置或重新配置的多個應(yīng)用程序的XML應(yīng)用程序框架的另一示例性實施例的功能圖。圖4是示出根據(jù)本發(fā)明的用于執(zhí)行XAF應(yīng)用程序內(nèi)的事件的方法的一個實施例的流程圖。圖5是示出根據(jù)本發(fā)明的用于創(chuàng)建和配置或重新配置XAF應(yīng)用程序的一個實施例的流程圖。圖6示出了數(shù)據(jù)層的組織并示出了數(shù)據(jù)層和包括數(shù)據(jù)存儲和數(shù)據(jù)客戶端的其它組件之間的連接。圖7示出了事務(wù)變換操作的操作流程。圖8示出了根據(jù)事務(wù)變換操作執(zhí)行的控制操作。圖9示出了在本發(fā)明的一個實施例中執(zhí)行的操作的操作流程。圖10是對根據(jù)本發(fā)明的可在計算環(huán)境中操作以要求軟件方法執(zhí)行的多層分階段模型的一個實施例。圖11是根據(jù)本發(fā)明的具有分階段模型中的用于定制軟件方法執(zhí)行的軟件組件的模塊化軟件系統(tǒng)的一個實施例。圖12是根據(jù)本發(fā)明的在整個計算機系統(tǒng)上操作以對該系統(tǒng)內(nèi)定制任何軟件方法執(zhí)行的第一或頂層階段模型或空間的一個實施例。圖13是根據(jù)本發(fā)明的可在主階段空間的一個或多個階段期間操作以定制對數(shù)據(jù)的檢索和寫入的子-階段空間的一個實施例。圖14A和圖14B是根據(jù)本發(fā)明的可在主階段空間的一個或多個階段期間操作以定制對即插即用系統(tǒng)的配置和操作的子-階段空間的一個實施例。圖15示出了根據(jù)本發(fā)明的包含聲明關(guān)于軟件方法對特定階段的執(zhí)行的約束的階段約束屬性的數(shù)據(jù)結(jié)構(gòu)或語言屬性。圖16A和16B示出了根據(jù)本發(fā)明的用于將計算機系統(tǒng)的操作分階段的方法的一個實施例。圖17是根據(jù)本發(fā)明的可用于提供并儲存在分階段域中操作的用戶聯(lián)系人信息的示例性計算機系統(tǒng)。圖18示出了根據(jù)本發(fā)明的一個實施例的被配置成并發(fā)地執(zhí)行多個對象的示例系統(tǒng)。圖19示出了根據(jù)本發(fā)明的一個實施例的被配置成并發(fā)地執(zhí)行多個對象的另一示例系統(tǒng)。圖20描繪了內(nèi)部、單線程對象和外部對象之間的異步通信。圖21示出了當并發(fā)性域與數(shù)據(jù)庫接口時的示例執(zhí)行路徑。圖22示出了其中第一并發(fā)性域與數(shù)據(jù)庫接口的操作流程圖。圖23示出了當?shù)谝徊l(fā)性域與第二并發(fā)性域接口時的示例執(zhí)行路徑。圖24示出了其中第一并發(fā)性域與第二并發(fā)性域接口的操作流程圖。圖25是與被創(chuàng)建來形成可執(zhí)行應(yīng)用程序的數(shù)據(jù)和對象有關(guān)的應(yīng)用程序描述的高級描繪。圖26示出了在被執(zhí)行來創(chuàng)建并連接應(yīng)用程序組件圖時的圖25中所示的應(yīng)用程序描述。圖27示出了圖25和26的應(yīng)用程序描述的內(nèi)部組件與用于處理和/或查看數(shù)據(jù)的結(jié)果對象之間的相互關(guān)系。圖28是示出其中執(zhí)行標記語言的本發(fā)明的一個實施例的操作特性的流程圖。圖29是示出其中應(yīng)用程序被動態(tài)配置的本發(fā)明的一個實施例的操作特性的流程圖。圖30示出了由本發(fā)明的一個實施例中的創(chuàng)建操作執(zhí)行的操作的操作流程。詳細描述現(xiàn)在將參考其中示出本發(fā)明的實施例的附圖來更全面描述本發(fā)明。然而,本發(fā)明可以用許多不同的形式來具體化,且不應(yīng)被解釋為限于此處所述的實施例。相反,提供這些實施例以致力于使得公開內(nèi)容全面且完整,并使得它能夠向本領(lǐng)域的技術(shù)人員完全傳達本發(fā)明的范圍。如上簡要描述的,本發(fā)明的各實施例提供了一種用于為給定應(yīng)用程序生成運行時結(jié)構(gòu)并用于管理軟件應(yīng)用程序的執(zhí)行的軟件應(yīng)用程序框架。給定軟件應(yīng)用程序的運行時結(jié)構(gòu)由執(zhí)行該軟件應(yīng)用程序的一個或多個相應(yīng)功能所需的一個或多個應(yīng)用程序組件域組合。組件域由應(yīng)用程序描述引擎響應(yīng)于對每一域從應(yīng)用程序接收的應(yīng)用程序描述來生成。在應(yīng)用程序的執(zhí)行期間,每一組件域用作應(yīng)用程序執(zhí)行管理的單元,其中每一域用于執(zhí)行該應(yīng)用程序的相應(yīng)功能。當應(yīng)用程序接收到與給定組件域相關(guān)聯(lián)的數(shù)據(jù)改變時,該組件域由應(yīng)用程序描述引擎按需重新配置以響應(yīng)于該相關(guān)聯(lián)的數(shù)據(jù)。應(yīng)用程序接收的數(shù)據(jù)改變或事件可由用戶動作,例如響應(yīng)于對用戶界面中的功能按鈕或控件或數(shù)據(jù)對象的用戶選擇來生成。數(shù)據(jù)事件也可由外部改變,例如作為運行外部進行的結(jié)果由應(yīng)用程序接收的或從另一應(yīng)用程序或第三方來源接收的數(shù)據(jù)來生成。由此,應(yīng)用程序是基于由應(yīng)用程序接收和/或處理的數(shù)據(jù)來組織和動態(tài)重新配置的連接組件的集合或圖。其中可實現(xiàn)本發(fā)明的合適的計算系統(tǒng)環(huán)境100的一個示例在圖1中示出。計算系統(tǒng)環(huán)境100僅為合適的計算環(huán)境的一個示例,并非對本發(fā)明的使用范圍或功能提出任何局限。也不應(yīng)將計算環(huán)境100解釋為對示例性操作環(huán)境100中示出的任一組件或其組合具有任何依賴或需求。本發(fā)明可以使用眾多其它通用或?qū)S糜嬎阆到y(tǒng)環(huán)境或配置來操作。適用于本發(fā)明的眾所周知的計算系統(tǒng)、環(huán)境和/或配置包括但不限于個人計算機、服務(wù)器計算機、手持式或膝上設(shè)備、多處理器系統(tǒng)、基于微處理器的系統(tǒng)、機頂盒、可編程消費者電子設(shè)備、網(wǎng)絡(luò)PC、小型機、大型機、包括任一上述系統(tǒng)或設(shè)備的分布式計算環(huán)境等等。本發(fā)明可以在諸如程序模塊等由計算機執(zhí)行的計算機可執(zhí)行指令的一般上下文中描述。一般而言,程序模塊包括例程、程序、對象、組件、數(shù)據(jù)結(jié)構(gòu)等等,它們執(zhí)行特定的任務(wù)或?qū)崿F(xiàn)特定的抽象數(shù)據(jù)類型。本發(fā)明也可以在分布式計算環(huán)境中實踐,其中,任務(wù)由通過通信網(wǎng)絡(luò)鏈接的本地和遠程處理設(shè)備來執(zhí)行。在分布式計算環(huán)境中,程序模塊可以位于包括存儲器存儲設(shè)備的本地和遠程計算機存儲介質(zhì)中。參考圖1A,用于實現(xiàn)本發(fā)明的示例性計算機系統(tǒng)100包括計算機110形式的通用計算設(shè)備。計算機110的組件可包括但不限于,處理單元120、系統(tǒng)存儲器130以及將包括系統(tǒng)存儲器130的各類系統(tǒng)組件耦合至處理單元120的系統(tǒng)總線121。系統(tǒng)總線121可以是若干種總線結(jié)構(gòu)類型的任一種,包括存儲器總線或存儲器控制器、外圍總線以及使用各類總線體系結(jié)構(gòu)中的任一種的局部總線。作為示例而非局限,這類體系結(jié)構(gòu)包括工業(yè)標準體系結(jié)構(gòu)(ISA)總線、微通道體系結(jié)構(gòu)(MCA)總線、增強ISA(EISA)總線、視頻電子技術(shù)標準協(xié)會(VESA)局部總線以及外圍部件互連(PCI)總線,也稱為Mezzanine總線。計算機110通常包括各種計算機可讀介質(zhì)。計算機可讀介質(zhì)可以是可由計算機110訪問的任一可用介質(zhì),包括易失性和非易失性介質(zhì)、可移動和不可移動介質(zhì)。作為示例而非局限,計算機可讀介質(zhì)包括計算機存儲介質(zhì)和通信介質(zhì)。計算機存儲介質(zhì)包括以用于儲存諸如計算機可讀指令、數(shù)據(jù)結(jié)構(gòu)、程序模塊或其它數(shù)據(jù)等信息的任一方法或技術(shù)實現(xiàn)的易失性和非易失性,可移動和不可移動介質(zhì)。計算機存儲介質(zhì)包括但不限于,RAM、ROM、EEPROM、閃存或其它存儲器技術(shù)、CD-ROM、數(shù)字多功能盤(DVD)或其它光盤存儲、磁帶盒、磁帶、磁盤存儲或其它磁存儲設(shè)備、或可以用來儲存所預期的信息并可由計算機110訪問的任一其它介質(zhì)。通信介質(zhì)通常具體化為諸如載波或其它傳輸機制的已調(diào)制數(shù)據(jù)信號中的計算機可讀指令、數(shù)據(jù)結(jié)構(gòu)、程序模塊或其它數(shù)據(jù),并包括任一信息傳送介質(zhì)。術(shù)語“已調(diào)制數(shù)據(jù)信號”指以對信號中的信息進行編碼的方式設(shè)置或改變其一個或多個特征的信號。作為示例而非局限,通信介質(zhì)包括有線介質(zhì),如有線網(wǎng)絡(luò)或直接連線連接,以及無線介質(zhì),如聲學、RF、紅外和其它無線介質(zhì)。上述任一的組合也應(yīng)當包括在計算機可讀介質(zhì)的范圍之內(nèi)。系統(tǒng)存儲器130包括以易失性和/或非易失性存儲器形式的計算機存儲介質(zhì),如只讀存儲器(ROM)131和隨機存取存儲器(RAM)132?;据斎?輸出系統(tǒng)133(BIOS)包括如在啟動時幫助在計算機110內(nèi)的元件之間傳輸信息的基本例程,通常儲存在ROM131中。RAM132通常包含處理單元120立即可訪問或者當前正在操作的數(shù)據(jù)和/或程序模塊,諸如在XML應(yīng)用程序框架下構(gòu)造或執(zhí)行的模塊。作為示例而非局限,圖1示出了操作系統(tǒng)134、應(yīng)用程序135、204、304(圖2B、3中示出)、其它程序模塊136和程序數(shù)據(jù)137;XML應(yīng)用程序框架可用于構(gòu)造并執(zhí)行用于儲存在RAM132中或從其中執(zhí)行的所有軟件的應(yīng)用程序。計算機110也可包括其它可移動/不可移動、易失性/非易失性計算機存儲介質(zhì)。僅作示例,圖1A示出了計算機110具有對不可移動、非易失性磁介質(zhì)141,如硬盤驅(qū)動器進行讀寫的不可移動、非易失性存儲器接口140。計算機110還可包括對諸如磁盤驅(qū)動器等設(shè)備151進行讀寫的非易失性存儲器接口150,設(shè)備151對諸如磁盤等可移動、非易失性介質(zhì)152進行讀寫。另外,計算機110可包括對諸如CDROM或其它光學介質(zhì)等可移動、非易失性光盤156進行讀寫的光盤驅(qū)動器155。可以在示例性操作環(huán)境中使用的其它可移動/不可移動、易失性/非易失性計算機存儲介質(zhì)包括但不限于,磁帶盒、閃存卡、數(shù)字多功能盤、數(shù)字錄像帶、固態(tài)RAM、固態(tài)ROM等等。硬盤驅(qū)動器141通常通過不可移動存儲器接口,如接口140連接到系統(tǒng)總線121,磁盤驅(qū)動器151和光盤驅(qū)動器155通常通過可移動存儲器接口,如接口150連接到系統(tǒng)總線121。上文討論并在圖1A中示出的驅(qū)動器及其關(guān)聯(lián)的計算機存儲介質(zhì)為計算機110提供了計算機可讀指令、數(shù)據(jù)結(jié)構(gòu)、程序模塊和其它數(shù)據(jù)的存儲。例如,示出硬盤驅(qū)動器141儲存操作系統(tǒng)144、應(yīng)用程序145、其它程序模塊146和程序數(shù)據(jù)147,它們可以與操作系統(tǒng)134、應(yīng)用程序135、其它程序模塊136和程序數(shù)據(jù)137相同,也可以與它們不同。這里對操作系統(tǒng)144、應(yīng)用程序145、其它程序模塊146和程序數(shù)據(jù)147給予不同的標號來說明至少它們是不同的副本。用戶可以通過鏈接到用戶輸入設(shè)備,如鍵盤162和定位設(shè)備161的用戶輸入接口160向計算機110輸入命令和信息。其它輸入設(shè)備(未示出)可包括話筒、操縱桿、游戲墊、圓盤式衛(wèi)星天線、掃描儀等等。這些和其它輸入設(shè)備通常通過耦合至系統(tǒng)總線121的用戶輸入接口160連接至處理單元120,但是也可以通過其它接口和總線結(jié)構(gòu)連接,如并行端口、游戲端口或通用串行總線(USB)。監(jiān)視器191或其它類型的顯示設(shè)備也通過接口,如視頻接口190連接至系統(tǒng)總線121。除監(jiān)視器之外,計算機110也可包括其它外圍輸出設(shè)備,如揚聲器194和打印機193,它們通過輸出外圍接口192連接。計算機110可以使用到一個或多個遠程計算機,如遠程計算機180的邏輯連接在網(wǎng)絡(luò)化環(huán)境中操作。遠程計算機180可以是個人計算機、服務(wù)器、路由器、網(wǎng)絡(luò)PC、對等設(shè)備或其它常見的網(wǎng)絡(luò)節(jié)點,并通常包括許多或所有以上相對于計算機110所描述的元件,盡管在圖1A中僅示出了存儲器存儲設(shè)備181。圖1A描述的邏輯連接包括局域網(wǎng)(LAN)171和廣域網(wǎng)(WAN)173,但也可包括其它網(wǎng)絡(luò),如無線網(wǎng)絡(luò)。這類網(wǎng)絡(luò)環(huán)境常見于辦公室、企業(yè)范圍計算機網(wǎng)絡(luò)、內(nèi)聯(lián)網(wǎng)以及因特網(wǎng)中。當在LAN網(wǎng)絡(luò)環(huán)境中使用時,計算機110通過網(wǎng)絡(luò)接口或適配器170連接至LAN171。當在WAN網(wǎng)絡(luò)環(huán)境中使用時,計算機110通常包括調(diào)制解調(diào)器172或用于通過WAN173,如因特網(wǎng)建立通信的其它裝置。調(diào)制解調(diào)器172可以是內(nèi)置或外置的,它可通過用戶輸入接口160連接至系統(tǒng)總線121。在網(wǎng)絡(luò)化環(huán)境中,相對于計算機110所描述的程序模塊或其部分可儲存在遠程存儲器存儲設(shè)備181中。作為示例而非局限,遠程應(yīng)用程序185駐留在存儲器設(shè)備181上??梢岳斫猓境龅木W(wǎng)絡(luò)連接是示例性的,且可以使用在計算機之間建立通信鏈路的其它裝置。為理解和說明起見,按照其中顯示示例數(shù)據(jù)對象的示例應(yīng)用程序用戶界面來描述本發(fā)明的各實施例將是有利的。圖1B示出了顯示一示例字處理文檔的計算機屏幕顯示,該文檔由示出一個或多個所顯示的數(shù)據(jù)對象的示例字處理應(yīng)用程序來顯示。示例用戶界面195示出了用戶可用于根據(jù)相關(guān)聯(lián)軟件應(yīng)用程序的功能來輸入、編輯或另外處理一個或多個數(shù)據(jù)對象的典型的軟件應(yīng)用程序用戶界面。例如,用戶界面195示出了一個示例字處理應(yīng)用程序,它在頂部具有一個或多個功能控件,包括“File(文件)”控件、“Edit(編輯)”控件、“View(視圖)”控件和“Other(其它)”控件。應(yīng)當理解,圖1B所示的功能控件僅出于示例的目的,并非對適用于本發(fā)明的軟件應(yīng)用程序中可用的大量用戶界面類型、布局和相關(guān)聯(lián)功能的限制。用戶界面195包括滾動條199,用于如用戶所需地向上或向下滾動用戶界面工作區(qū)中包含的數(shù)據(jù)。一個示例字處理文檔在用戶界面195的工作區(qū)中示出。該示例文檔,例如信、備忘錄、報表等包括文本對象196、嵌入的圖片對象197、以及嵌入的表格對象198。仍參考圖1B,顯示在用戶界面195中的文檔由用戶滾動,使得文本對象196在頁面的頂部,嵌入的圖片對象197被顯示在兩個文本對象之間,而表格對象198在頁面底部部分可見。即,表格對象198正進入視圖,但是尚未完全顯示在用戶界面195的工作區(qū)中。如將在以下詳細描述的,根據(jù)本發(fā)明的各實施例,負責顯示示例用戶界面195和示例數(shù)據(jù)對象196、197、198的軟件應(yīng)用程序是被一起分組在邏輯分組中的相關(guān)組件的集合或圖,或者是用于提供應(yīng)用程序所需的功能的域。在任何給定實例下,應(yīng)用程序包括由這些相關(guān)組件的邏輯分組構(gòu)成的運行時結(jié)構(gòu),此處被稱為域,它是在該實例下提供應(yīng)用程序的功能所需的。當執(zhí)行應(yīng)用程序時,基于應(yīng)用程序接收到的數(shù)據(jù)的改變以及應(yīng)用程序處理該數(shù)據(jù)改變所需的相關(guān)聯(lián)功能來動態(tài)地配置組件域。例如,仍參考圖1B,用于當前顯示在用戶界面195中的文檔的一個說明性運行時結(jié)構(gòu)包括文本域,該文本域包括顯示和處理文本對象196所需的應(yīng)用程序組件。包括了包含顯示和處理圖片對象197所需的應(yīng)用程序組件的圖片域,包括了包含顯示和處理顯示在圖片對象197之下的第二文本對象所需的應(yīng)用程序組件的第二文本域,并包括了包含顯示進入的表格對象198所需的應(yīng)用程序組件的表格域。與本運行時結(jié)構(gòu)相關(guān)聯(lián)的其它組件域包括用于其它功能的應(yīng)用程序組件,包括滾動條199的位置和移動、用戶界面中的功能控件的位置和顯示屬性、以及提供當前要求的功能所需的應(yīng)用程序的任何其它方面。如以下將詳細描述的,在其中數(shù)據(jù)事件由應(yīng)用程序接收的應(yīng)用程序執(zhí)行期間,組件域的運行時結(jié)構(gòu)響應(yīng)于數(shù)據(jù)驅(qū)動的事件按要求被動態(tài)重新確認和/或重新配置。例如,如果用戶選擇圖片對象197來刪除或進行其它修改,則應(yīng)用程序?qū)?shù)據(jù)改變傳遞給應(yīng)用程序描述引擎,后者動態(tài)地重新配置負責顯示圖片對象197的組件域,使得該組件域?qū)ㄓ糜诨谒邮盏臄?shù)據(jù)事件,例如圖片對象197的刪除或其它修改來顯示圖片對象197的適當?shù)膽?yīng)用程序組件。在應(yīng)用程序所需的新功能,例如,諸如將表格對象198等新數(shù)據(jù)對象輸入到用戶界面195中的視圖中的情況下,應(yīng)用程序?qū)⒃L問應(yīng)用程序描述引擎來生成由顯示傳入的數(shù)據(jù)對象所需的一個或多個應(yīng)用程序組件構(gòu)成的新組件域。圖2A是示出應(yīng)用程序、應(yīng)用程序描述引擎以及一個或多個組件域之間的交互的功能圖。根據(jù)本發(fā)明的各實施例,提供了用于將應(yīng)用程序配置為用于執(zhí)行該應(yīng)用程序的一個或多個功能的連接組件圖的應(yīng)用程序框架。參考圖2A,應(yīng)用程序204、304示出了用于根據(jù)對相應(yīng)應(yīng)用程序的編程來提供一個或多個有用功能的任何軟件應(yīng)用程序,例如字處理應(yīng)用程序、電子表格應(yīng)用程序、幻燈片演示應(yīng)用程序、數(shù)據(jù)庫應(yīng)用程序、桌面出版應(yīng)用程序、電子郵件應(yīng)用程序以及日歷應(yīng)用程序等。實際上,如從以下描述中將理解的,本發(fā)明的各實施例不限于任何特定的軟件應(yīng)用程序。根據(jù)本發(fā)明的各實施例,應(yīng)用程序204、304由多個應(yīng)用程序組件構(gòu)成,其每一個都由軟件開發(fā)者創(chuàng)建,用于獨立于其它組件或與其它組件相關(guān)聯(lián)地提供給定功能。例如,一給定應(yīng)用程序組件可被包括在應(yīng)用程序204、304中,用于提供相關(guān)聯(lián)應(yīng)用程序的打印功能。另一應(yīng)用程序組件可被包括在該應(yīng)用程序中,用于提供相關(guān)聯(lián)應(yīng)用程序的特定格式化功能。通常,應(yīng)用程序204、304的給定功能,例如格式化、打印、編輯、數(shù)據(jù)顯示等,是由當一起操作時啟用并提供預期功能的應(yīng)用程序組件來啟用的。例如,以上在圖1B中示出的給定軟件應(yīng)用程序的用于顯示文本對象196或圖片對象197的功能可包括必須根據(jù)提供所需功能的特定序列來執(zhí)行的多個應(yīng)用程序組件。如上所述,應(yīng)用程序204、304在任何時刻,不論在運行時結(jié)構(gòu)的給定實例下還是在給定執(zhí)行期間,都是連接的應(yīng)用程序組件的一個集合或圖。對不同應(yīng)用程序組件以及不同應(yīng)用程序組件之間的交互的詳細描述在以下參考圖2B、3、4、5來描述。如上簡要描述的,在任何給定時刻,應(yīng)用程序204、304包括一運行時結(jié)構(gòu),它是應(yīng)用程序在該時刻所需的連接的應(yīng)用程序組件的實例化。如下所述,在應(yīng)用程序執(zhí)行期間,應(yīng)用程序組件的實例化基于應(yīng)用程序所接收的數(shù)據(jù)按應(yīng)用程序改變所需來動態(tài)地重新配置。為了生成應(yīng)用程序組件的給定運行時結(jié)構(gòu),應(yīng)用程序204、304將每一所需功能的應(yīng)用程序描述從應(yīng)用程序描述318傳遞到應(yīng)用程序描述引擎320。應(yīng)用程序描述318的詳細描述以及應(yīng)用程序描述引擎的操作在以下被提供。例如,回頭參考圖1B,用于用戶界面195的運行時結(jié)構(gòu)的實例化和相關(guān)聯(lián)的數(shù)據(jù)將要求應(yīng)用程序組件顯示用戶界面195及其相關(guān)聯(lián)的功能控件,即文本對象196、圖片對象197、進入的表格對象198,并顯示滾動條199的當前位置。應(yīng)用程序204、304將用于應(yīng)用程序當前所需的功能的應(yīng)用程序描述傳遞給應(yīng)用程序配置或描述引擎320,用于生成和配置提供這些功能中的每一個所需的應(yīng)用程序組件的分組。根據(jù)本發(fā)明的一個實施例,從應(yīng)用程序傳遞給應(yīng)用程序描述引擎的應(yīng)用程序描述包括如下參考圖2B和3描述的根據(jù)可擴展標記語言(XML)結(jié)構(gòu)化并格式化的聲明性規(guī)則。應(yīng)用程序描述引擎320是包含用于解釋從應(yīng)用程序204、304接收到的每一所需功能的應(yīng)用程序描述并用于構(gòu)建和配置向應(yīng)用程序204、304提供所需功能的應(yīng)用程序組件分組(此處稱為組件域或并發(fā)性域)的足夠的計算機可執(zhí)行指令的軟件模塊。根據(jù)一個實施例,應(yīng)用程序描述引擎320如下參考圖2B、3、4、5所述根據(jù)可擴展標記語言來操作。應(yīng)用程序描述引擎的功能和操作在以下參考圖3且在“應(yīng)用程序描述語言”的標題下詳細描述。一旦應(yīng)用程序描述引擎320從應(yīng)用程序204、304接收到與應(yīng)用程序所需的功能相關(guān)聯(lián)的應(yīng)用程序描述,該應(yīng)用程序描述引擎即按照滿足每一所描述的功能,例如如圖1B所示的顯示圖片對象197所需的應(yīng)用程序組件來解釋應(yīng)用程序描述。一旦應(yīng)用程序描述引擎確定了所需的組件以及所需組件之間的關(guān)系,應(yīng)用程序描述引擎320即從組件庫322中獲得所需的應(yīng)用程序組件,包括所需的組件接口。根據(jù)本發(fā)明的各實施例,組件庫322可以是與如字處理應(yīng)用程序等特定應(yīng)用程序相關(guān)聯(lián)的應(yīng)用程序組件的集合或庫,或者組件庫可以是應(yīng)用程序描述引擎320從中可獲得用于向多個不同類型的應(yīng)用程序,如字處理應(yīng)用程序、電子表格應(yīng)用程序、幻燈片演示應(yīng)用程序、數(shù)據(jù)庫應(yīng)用程序等提供功能的組件的組件集合。一旦應(yīng)用程序描述引擎獲得了所需的應(yīng)用程序組件(例如,軟件編程的個別模塊),該應(yīng)用程序描述引擎即創(chuàng)建用于應(yīng)用程序204、304當前所需的功能的每一個的組件域。如圖2A中所示,響應(yīng)于應(yīng)用程序204、304對圖1B所示的數(shù)據(jù)的當前數(shù)據(jù)顯示需求,應(yīng)用程序描述引擎320創(chuàng)建用于文本對象196的第一組件域250、用于圖片對象197的第二組件域、以及用于表格對象198的第三組件域260。即,這些組件域中的每一個由應(yīng)用程序描述引擎320創(chuàng)建,使得每一域包括提供該應(yīng)用目前要求的功能所需的那些應(yīng)用程序組件。例如,圖片域255由應(yīng)用程序描述引擎320生成,以包括應(yīng)用程序204、304以其當前的顯示特性和屬性顯示圖片對象197所需的那些應(yīng)用程序組件。應(yīng)當理解,圖2A中所示的域示出了可對圖1B中所示的數(shù)據(jù)對象生成的域,但是對于用于應(yīng)用程序204、304的運行時結(jié)構(gòu)的任何其它實例,其中顯示了不同的數(shù)據(jù)對象、且顯示或定位或另外配置了不同的用戶界面功能,則由應(yīng)用程序描述引擎320按需生成一組不同的域250、255、260。根據(jù)各實施例,提供了一種執(zhí)行管理模型,其中每一組件域用作為用于應(yīng)用程序204、304的一個執(zhí)行管理單元。當應(yīng)用程序204、304接收數(shù)據(jù)事件時,如以下參考圖2B、3、4、5詳細描述的,應(yīng)用程序204、304將應(yīng)用程序描述318傳遞給應(yīng)用程序描述引擎320,用于動態(tài)重新配置一個或多個當前配置的域250、255、250,或用于按需創(chuàng)建新域。例如,回頭參考圖1B,當向上滾動文檔時,應(yīng)用程序204、304要求來自應(yīng)用程序描述引擎320的用于顯示新數(shù)據(jù)對象的組件域。例如,在將表格對象198滾動進入視圖之前,應(yīng)用程序204、304不要求表格對象域260,這在圖2A中示出,因為應(yīng)用程序204、304當前不要求顯示表格對象198的功能。然而,一旦操作應(yīng)用程序204、304的操作系統(tǒng)134檢測到表格對象正被滾動進入視圖,則操作系統(tǒng)通知應(yīng)用程序204、304,它現(xiàn)在必須顯示表格對象198及其相關(guān)聯(lián)的數(shù)據(jù)。作為響應(yīng),應(yīng)用程序204、304如上所述將用于進入的表格對象198的應(yīng)用程序描述傳遞給應(yīng)用程序描述引擎320。應(yīng)用程序描述引擎320解釋該應(yīng)用程序描述、獲得所需的應(yīng)用程序組件、并動態(tài)地創(chuàng)建其中包括了顯示該進入的表格對象198所需的那些應(yīng)用程序組件的表格對象域260。類似地,如果圖1B所示的文檔被向上滾動使得表格對象滾動離開頁面的底部,則操作系統(tǒng)將通知應(yīng)用程序204、304,不再要求表格對象198的顯示。應(yīng)用程序描述引擎響應(yīng)于從應(yīng)用程序204、304接收到的應(yīng)用程序描述將丟棄為應(yīng)用程序204、304顯示表格對象198所創(chuàng)建的表格對象域260,因為不再要求先前顯示表格對象所需的組件域。由此,應(yīng)用程序描述引擎可基于應(yīng)用程序204、304在執(zhí)行期間的要求來動態(tài)創(chuàng)建或廢棄給定組件域。在應(yīng)用程序204、304的執(zhí)行期間,通過管理每一組件域的操作和組件結(jié)構(gòu)來實現(xiàn)執(zhí)行管理。仍參考圖2A,在應(yīng)用程序204、304的執(zhí)行期間,當應(yīng)用程序204、304接收到調(diào)用給定域250、255、260的功能的數(shù)據(jù)事件時,應(yīng)用程序204經(jīng)由相應(yīng)的域來處理該數(shù)據(jù)事件。例如,如果用戶選擇表格對象198中的一個數(shù)據(jù)項,接著選擇應(yīng)用程序204、304的刪除控件來刪除所選的數(shù)據(jù)項,則應(yīng)用程序204、304接收到域所選的數(shù)據(jù)項和所選的刪除控件相關(guān)聯(lián)的數(shù)據(jù)事件。如本領(lǐng)域的技術(shù)人員所理解的,對數(shù)據(jù)項的選擇和對刪除控件的選擇由負責操作應(yīng)用程序204、304的操作系統(tǒng)來檢測,并且向應(yīng)用程序204、304作出該數(shù)據(jù)事件的適當通知。響應(yīng)于該數(shù)據(jù)事件,應(yīng)用程序204、304向負責處理與表格對象198相關(guān)聯(lián)的數(shù)據(jù)事件的適當域260分派單個處理線程275。在該主體域,此處也稱為并發(fā)性域處,單個處理線程275進入該組件域,并且在一系列階段中處理該數(shù)據(jù)事件。關(guān)于向用于經(jīng)由域的組件來處理數(shù)據(jù)驅(qū)動的事件的主體域分派單個處理線程的詳細描述,見以下在標題“對并發(fā)性域的多線程化”下陳述的描述。繼續(xù)當前示例,一旦選擇了刪除控件來從表格對象198中刪除所選數(shù)據(jù)項,則響應(yīng)于刪除表格項的動作數(shù)據(jù)單個處理線程被分派給域260。一旦該處理線程進入該域,啟動第一處理階段,即讀數(shù)據(jù)/請求數(shù)據(jù)階段。例如,在第一階段期間,由組件域260讀取該數(shù)據(jù)事件以確定表格對象198中將受到該數(shù)據(jù)驅(qū)動的事件的影響的數(shù)據(jù)項或數(shù)據(jù)值。接著,作為第一操作階段的一部分,請求對數(shù)據(jù)的改變,例如從表格對象198中刪除所選數(shù)據(jù)項的請求。作為響應(yīng),表格對象域中的數(shù)據(jù)連接器組件建立從表格對象198中刪除所選數(shù)據(jù)項的請求。對包括數(shù)據(jù)連接器組件的應(yīng)用程序204、205的組件的詳細描述在以下參考圖2B、3、4、5來提供。一旦讀數(shù)據(jù)/請求數(shù)據(jù)階段完成,處理線程將通知分派器對象(以下詳細描述),下一處理階段可以開始。下一處理階段包括其中由應(yīng)用程序描述引擎作出響應(yīng)于數(shù)據(jù)事件的對組件域的改變的重新確認/重新配置階段。在該重新確認/重新配置階段期間,通知與將受到影響的數(shù)據(jù)相關(guān)聯(lián)的所有數(shù)據(jù)連接器組件,例如與將從表格對象198中刪除的數(shù)據(jù)項相關(guān)聯(lián)的數(shù)據(jù)連接器組件標記這些數(shù)據(jù)項以供重新確認/重新配置。根據(jù)一個實施例,對受影響數(shù)據(jù)的標記在讀數(shù)據(jù)/請求數(shù)據(jù)階段的子-階段期間進行。一旦標記了所有受影響數(shù)據(jù)項,重新確認/重新配置階段繼續(xù),且按需處理每一標記的數(shù)據(jù)項。例如,刪除要從表格對象198中刪除的數(shù)據(jù)項,并且按需刪除或添加任何相關(guān)聯(lián)的域組件。例如,如果作為刪除所選數(shù)據(jù)項的結(jié)果需要移除構(gòu)成受影響域260的一個或多個應(yīng)用程序組件,則應(yīng)用程序描述引擎將在響應(yīng)于數(shù)據(jù)事件的重新確認階段期間響應(yīng)于傳遞給應(yīng)用程序描述引擎的應(yīng)用程序描述318重新配置該域以移除這些組件。另一方面,如果該受影響的域需要新的應(yīng)用程序組件,則應(yīng)用程序描述引擎同樣將獲得新的應(yīng)用程序組件以集成到受影響的域中并對該域進行重新配置。由此,受影響的組件域在應(yīng)用程序執(zhí)行期間基于與該域相關(guān)聯(lián)的數(shù)據(jù)事件來動態(tài)地重新配置。此處所描述的組件域250、255、260中用于處理數(shù)據(jù)事件的執(zhí)行階段模型的詳細描述在以下標題“應(yīng)用程序框架分階段模型”中提供。如上所述,每一組件域由應(yīng)用程序描述引擎320基于應(yīng)用程序204、304對組件域的當前需求來配置。并且,如上所述,當應(yīng)用程序204、304的需求響應(yīng)于例如數(shù)據(jù)對象的刪除、數(shù)據(jù)對象的添加或數(shù)據(jù)對象的修改等數(shù)據(jù)事件而改變時,則按需創(chuàng)建新的組件域或者重新配置現(xiàn)有的組件域。給定組件域中的每一新組件具有等于該組件域中的其它組件的生存期,因為給定組件域生存期在其由應(yīng)用程序描述引擎實例化時或在其由應(yīng)用程序描述引擎重新配置時開始,并且在該組件域被丟棄或者隨后由應(yīng)用程序描述引擎重新配置時結(jié)束。由此,給定組件域是在該組件域的特定配置的時間期間內(nèi)生存、并在該組件域的后續(xù)的重新配置時終止或消逝的應(yīng)用程序功能和管理單元,其中組件域的隨后重新配置的版本出于應(yīng)用程序執(zhí)行管理的目的而被認為是一個新的組件域。以上描述了用于作為連接組件的集合或圖來配置軟件應(yīng)用程序并用于經(jīng)由一個或多個組件域來管理應(yīng)用程序的結(jié)構(gòu)和執(zhí)行的應(yīng)用程序框架,以下參考圖2B、3、4、5提供構(gòu)成給定應(yīng)用程序的組件以及這些組件之間的通信的詳細描述。此外,以下對圖2B、3、4和5的討論提供了上述一個示例性實施例的描述,其中應(yīng)用程序框架是基于可擴展標記語言(XML)的應(yīng)用程序框架。XML應(yīng)用程序框架(XAF)提供了如上所述用于執(zhí)行和創(chuàng)建軟件應(yīng)用程序的方法和系統(tǒng)。XAF在標準語言上被構(gòu)建,它在軟件系統(tǒng)中以標準格式表示數(shù)據(jù)改變、數(shù)據(jù)事件、UI事件或所有其它發(fā)生事件。在一個示例性實施例中,XAF采用XML(可擴展標記語言)將數(shù)據(jù)表示為XML數(shù)據(jù),并將應(yīng)用程序表示為XML應(yīng)用程序。之后,將在描述中使用XML來表示標準語言。然而,本領(lǐng)域的技術(shù)人員將認識到,本發(fā)明不限于使用XML。XAF軟件系統(tǒng)是數(shù)據(jù)聚焦、數(shù)據(jù)驅(qū)動的,并提供強大的數(shù)據(jù)變換能力,包括但不限于與來自互不知曉的來源的異類數(shù)據(jù)交互。XAF的所有部分都可被描述為針對或涉及數(shù)據(jù)的事件,包括應(yīng)用程序和應(yīng)用程序的用戶界面的行為。XAF放棄了應(yīng)用程序是數(shù)據(jù)創(chuàng)建者且數(shù)據(jù)是創(chuàng)建的范型。相反,XAF基于數(shù)據(jù)來構(gòu)建應(yīng)用程序。在本發(fā)明的各實施例中,XAF應(yīng)用程序組件實際上基于如何顯示數(shù)據(jù)、數(shù)據(jù)是什么以及如何儲存數(shù)據(jù)來實例化和互連。由此,XAF能夠在運行時創(chuàng)建并縫合“正確的”組件來以正確的方式處理特定數(shù)據(jù)。在構(gòu)建應(yīng)用程序時,XAF允許應(yīng)用程序“作者”提供關(guān)于如何基于數(shù)據(jù)類型和用戶界面(UI)來創(chuàng)建組件并將其連接在一起的規(guī)則。這些規(guī)則和組件可以用XML來編寫。XML允許用于對當前上下文敏感的豐富且可組構(gòu)的UI,并允許軟件開發(fā)者以組構(gòu)的方法來構(gòu)建應(yīng)用程序。軟件作者可以在減少對硬編碼應(yīng)用程序邏輯所需求的聲明性模型中端到端地構(gòu)建特征或應(yīng)用程序。例如,軟件作者只需聲明某一特定UI連接器與某一特定UI和某一特定動作相配。XAF然后將該UI連接器與該UI和動作連接在一起。另外,該XML應(yīng)用程序框架提供了預構(gòu)建的組件、應(yīng)用程序特征和示例應(yīng)用程序的豐富的庫。盡管仍需要某些命令性代碼,但是XAF將組件放置在庫中。庫允許其它軟件作者在聲明性模型中使用或利用這些組件。由此,軟件開發(fā)者可通過為組件生成新的命令性代碼來創(chuàng)建其自己的組件,但是軟件作者也可采用預構(gòu)建的組件來組合新的或經(jīng)修改的應(yīng)用程序而無需創(chuàng)建任何新的命令性代碼。示例性XML應(yīng)用程序框架202在圖2B中示出。XAF202用于構(gòu)造和管理諸如應(yīng)用程序204等應(yīng)用程序的執(zhí)行。在XAF202內(nèi)執(zhí)行的應(yīng)用程序204包括一個或多個UI連接器206、一個或多個動作208以及一個或多個數(shù)據(jù)連接器210。在某些實施例中,應(yīng)用程序204還包括一個或多個存取器212或一個或多個變換器214和/或216。應(yīng)用程序204內(nèi)的組件用于將UI事件變換成數(shù)據(jù)改變以及將數(shù)據(jù)改變變換成UI事件。由此,UI連接器206耦合到一個或多個UI218和/或220。另外,數(shù)據(jù)連接器210耦合到一個或多個數(shù)據(jù)存儲222和/或224。在XAF202內(nèi),應(yīng)用程序204中的數(shù)據(jù)事件或數(shù)據(jù)表示采用標準格式。例如,數(shù)據(jù)事件和數(shù)據(jù)表示采用XML。UI連接器206提供了應(yīng)用程序204與一個或多個UI218和/或220之間的連接。在一個實施例中,UI218和/或220是向用戶顯示信息的圖形用戶界面。UI連接器206呈現(xiàn)并支持應(yīng)用程序用戶編輯XAF202內(nèi)的數(shù)據(jù)的能力。UI連接器206在XAF數(shù)據(jù)層(由數(shù)據(jù)連接器210和數(shù)據(jù)存儲222和/或224來表示)與特定UI218和/或220之間映射數(shù)據(jù)。另外,UI連接器206將UI事件從UI218和/或220映射到數(shù)據(jù)存儲222和/或224內(nèi)的數(shù)據(jù)編輯操作。UI連接器206對UI218和/或220中的UI元素的類型是專用的。由此,對于UI218和/或220內(nèi)的數(shù)據(jù)項的每一UI表示,存在一相應(yīng)的UI連接器206。在一個示例中,諸如電子表格中的單元格值等顯示在UI218和/或220中的數(shù)據(jù)元素將具有耦合到該數(shù)據(jù)元素的特定UI連接器206,它將對該數(shù)據(jù)的用戶修改轉(zhuǎn)換成UI事件以連接到XAF數(shù)據(jù)上的動作208。由此,UI連接器206將特定UI事件轉(zhuǎn)換成一般在XAF應(yīng)用程序204內(nèi)表示的XAF動作208。在一個實施例中,應(yīng)用程序204內(nèi)的所有數(shù)據(jù)改變被表示為XML數(shù)據(jù)改變。在另一示例中,用戶可操作諸如滾動條等用戶界面控件。滾動條的改變造成了UI218和/或220的狀態(tài)的改變。UI狀態(tài)改變也可被表示為數(shù)據(jù)改變。由此,UI連接器206可接收例如滾動條操作等UI事件、將該UI事件轉(zhuǎn)換成用于XAF數(shù)據(jù)層的XML數(shù)據(jù)改變事件。UI連接器206將UI事件連接到動作208。動作208是用于XAF數(shù)據(jù)層中的數(shù)據(jù)改變的聲明性語句。例如,對滾動條的用戶操作可創(chuàng)建“點擊滾動條”事件。UI連接器206將該UI事件連接到諸如“將滾動條向下遞增一個位置”等動作208。在一個實施例中,數(shù)據(jù)改變動作用XML來表示。例如,數(shù)據(jù)改變可作為XML語句出現(xiàn)<Dropdowndata=$taskpanelist><copyDeltaactionpeform="onselectedchange"data=selectedvalue"target="currenttaskPane"/>數(shù)據(jù)連接器210整理去往和來自外部數(shù)據(jù)存儲222和/或224的數(shù)據(jù)。類似于UI連接器206,數(shù)據(jù)連接器210在不同數(shù)據(jù)存儲222和/或224中的內(nèi)部XAF數(shù)據(jù)表示和外部數(shù)據(jù)類型之間進行轉(zhuǎn)換。由此,對每一外部數(shù)據(jù)類型存在數(shù)據(jù)專用數(shù)據(jù)連接器210。數(shù)據(jù)連接器210接收動作208,并將標準格式XAF數(shù)據(jù)動作208轉(zhuǎn)換成數(shù)據(jù)專用動作以影響數(shù)據(jù)存儲222和/或224內(nèi)的數(shù)據(jù)。在一個實施例中,數(shù)據(jù)連接器210將XML數(shù)據(jù)動作轉(zhuǎn)換成數(shù)據(jù)專用動作。例如,由標準格式XML語句表示的滾動條操作被轉(zhuǎn)換成界面狀態(tài)專用數(shù)據(jù)改變并被發(fā)送到儲存特定界面狀態(tài)數(shù)據(jù)的數(shù)據(jù)存儲222或224。另外,數(shù)據(jù)連接器210將數(shù)據(jù)存儲222和/或224中的改變轉(zhuǎn)換成發(fā)送到UI連接器206的標準格式XAF數(shù)據(jù)表示。UI連接器206將標準格式XAF數(shù)據(jù)表示轉(zhuǎn)換成發(fā)送到UI218和/或220的UI事件。由此,對于UI218和/或220中的任何改變,UI連接器206將用戶界面事件連接到動作208。動作208被發(fā)送到將動作208轉(zhuǎn)換成數(shù)據(jù)存儲222和/或224中的數(shù)據(jù)專用改變的數(shù)據(jù)連接器210。一旦數(shù)據(jù)被改變,數(shù)據(jù)連接器210將數(shù)據(jù)存儲222和/或224中改變的數(shù)據(jù)轉(zhuǎn)換成標準格式XAF數(shù)據(jù)表示。數(shù)據(jù)連接器210將XAF數(shù)據(jù)表示發(fā)送回UI連接器206,它將XAF數(shù)據(jù)表示轉(zhuǎn)換成UI-專用顯示事件。UI連接器206將UI-專用顯示事件發(fā)送到UI218和/或220以供顯示,這里UI218和/或220顯示從UI事件創(chuàng)建的改變的數(shù)據(jù)。應(yīng)用程序204可繼續(xù)對應(yīng)用程序204內(nèi)發(fā)生的所有動作處理數(shù)據(jù)和UI事件之間的這些周期性的改變。在某些實施例中,數(shù)據(jù)存儲222和/或224中的數(shù)據(jù)的改變也迫使UI218和/或220的改變而無需發(fā)生用戶事件,諸如由用戶控制之外的另一操作強迫改變的數(shù)據(jù)。應(yīng)用程序204內(nèi)的某些可任選組件包括存取器212和變換器214和/或216。存取器212在動作208和數(shù)據(jù)連接器210之間調(diào)解。為存取某一特定數(shù)據(jù)存儲222和/或224中的某一特定類型的數(shù)據(jù),動作208可指定使用用于該數(shù)據(jù)的存取器212或“存取模型”。存取器212允許應(yīng)用程序204存取諸如JPEG、MPEG等不同類的特定類型的數(shù)據(jù)。由此,無論數(shù)據(jù)存儲222和/或224內(nèi)的數(shù)據(jù)的類型如何,應(yīng)用程序204都接口并改變該數(shù)據(jù)。存取器212確保數(shù)據(jù)連接器210管理包括尚未設(shè)計或開發(fā)的數(shù)據(jù)類型在內(nèi)的任何數(shù)據(jù)類型。存取器212將標準格式動作變換成標準格式的數(shù)據(jù)-定制動作。在其它實施例中,一個或多個變換器214和/或216在數(shù)據(jù)連接器210和UI連接器206之間調(diào)解。變換器214和/或216將來自數(shù)據(jù)連接器210的數(shù)據(jù)輸出變?yōu)閁I連接器206顯示所需的UI定制格式。例如,如果UI連接器206需要列表中的數(shù)據(jù),則變換器214和/或216可通過一個或多個簡單改變來將表式數(shù)據(jù)修改成數(shù)據(jù)列表,其中每一簡單改變由單個變換器214和/或216執(zhí)行。由此,由數(shù)據(jù)連接器210輸出的任何形式的數(shù)據(jù)都可通過一個或多個規(guī)范變換器214和/或216變換成可由UI連接器206接受并使用的形式。關(guān)于諸如變換器214、216等事務(wù)變換的操作的詳細討論,見以下標題“事務(wù)變換”下的描述??筛鶕?jù)本發(fā)明的各實施例利用其它類型的變換。例如,功能變換可使用諸如XQuery等功能語言來描述。代理(proxy)變換取一位置列表,并以別名數(shù)據(jù)序列的形式來代理在這些位置處找到的數(shù)據(jù)。求解器(solver)變換實施指定的求解器技術(shù)并為效率起見支持高速緩存。例如,一個求解器變換在數(shù)字上對代數(shù)等式系統(tǒng)求解,而另一求解器則在符號上對這些系統(tǒng)求解。高速緩存和索引變換是數(shù)據(jù)級的通過(pass-through)變換(即,輸出數(shù)據(jù)等于輸入數(shù)據(jù)),并且高速緩存和索引變換在指定維度中添加高速緩存和索引以加速下游的索引存取。根據(jù)本發(fā)明的各實施例,該應(yīng)用程序框架采用了此處描述的應(yīng)用程序的組件之間的公共接口。由于該框架依賴于在此處描述的各種組件之間的數(shù)據(jù)通信,因此組件之間統(tǒng)一數(shù)據(jù)結(jié)構(gòu)(例如XML等)和公共接口允許用于應(yīng)用程序配置和管理的有效數(shù)據(jù)交換?,F(xiàn)在參考圖3,在本發(fā)明的各實施例中,XAF300包括兩個或多個應(yīng)用程序302和/或304,如圖3所示。較大的應(yīng)用程序302可包括用作子模塊或子組件的一個或多個應(yīng)用程序306和/或308。所有應(yīng)用程序302和/或304,不論是較大的應(yīng)用程序還是子組件,都具有諸如UI連接器206等UI連接器、諸如動作208等動作、以及諸如數(shù)據(jù)連接器210等數(shù)據(jù)連接器。由此,應(yīng)用程序306和/或308是在特定數(shù)據(jù)元素314和/或316與特定UI元素310和/或312之間操作的軟件模塊。應(yīng)用程序302和/或304可以是多線程的,這表現(xiàn)在它們可接合若干其它應(yīng)用程序302和/或304來操作。另外,應(yīng)用程序302和/或304或者應(yīng)用程序組件306和/或308可被約束到特定階段或域,如以下將詳細描述。在本發(fā)明的各實施例中,XAF300包括XML應(yīng)用程序描述(XAD)318和XML應(yīng)用程序描述(XAD)引擎320。XAD318包括XAF300內(nèi)包括的諸如應(yīng)用程序304等所有應(yīng)用程序的聲明性規(guī)則和描述。軟件作者為軟件作者所需的應(yīng)用程序創(chuàng)作XAD318。XAD318包括用于拉取(pull)或?qū)嵗囟ㄜ浖M件以及將這些組件綁定在一起的方案和標簽。在本發(fā)明的各實施例中,方案和標簽涉及組件如何交互。組件可以是UI連接器、動作、存取器、數(shù)據(jù)連接器、變換器或其它軟件組件。在某些實施例中,組件以命令代碼來編寫,并且向應(yīng)用程序提供了逐點(point-wise)功能。由此,組件可以是向諸如UI連接器、動作、數(shù)據(jù)連接器等XAF組件提供可操作性的底層軟件。盡管應(yīng)用程序描述318可使用其它格式來表示,但是在一個實施例中,XAD318用XML來表示。標簽是XML標簽。方案和標簽提供了用于聲明規(guī)則的句法和語義框架。XAD允許應(yīng)用程序作者聲明應(yīng)用程序范圍的資源和命令。命令是基于諸如鼠標點擊、鍵盤選擇、語音命令等事件執(zhí)行的代碼比特位。在各實施例中,用戶創(chuàng)建用戶界面中的事件,而在其它實施例中,某進程的另一動作可創(chuàng)建事件。命令可以采用命名動作的形式,例如改變選擇動作、編輯視圖動作、檢索數(shù)據(jù)動作和編輯條目動作,如以下參考圖17所描述的。應(yīng)當理解,這些命名動作是出于說明的目的,并且不是對適用于本發(fā)明各實施例的命令和/或命名動作的限制。XAD318由XAD引擎320進行語法分析。最初,XAD引擎320在啟動應(yīng)用程序時對XAD318進行語法分析。之后,XAD引擎320在需要時對XAD318進行語法分析。例如,根據(jù)一個實施例,XAD318在運行時由XAD引擎320進行語法分析以諸如在實例化并連接插件組件時重新配置應(yīng)用程序。根據(jù)另一實施例,提供其中在編譯時對XAD進行語法分析并將其轉(zhuǎn)換成由XAD引擎在運行時解釋的記號序列的編譯模型。當不編譯時,在XAD被加載到存儲器中時完成文本語法分析,并且將其作為數(shù)據(jù)結(jié)構(gòu)來儲存。XAD引擎320處理規(guī)則、標識資源、實例化組件、并連接組件、組分和命令。組件和資源可以是命令性代碼,諸如以C#編寫的可執(zhí)行代碼。命令性代碼表征了在UI連接器、動作、數(shù)據(jù)連接器和其它XAF組件之下的實的軟件組件和軟件類。組件從諸如組件庫322等組件庫中拉出。組件庫322保持具有XAF300的任何應(yīng)用程序內(nèi)使用的所有組件。庫322內(nèi)的整個組件集合對任何應(yīng)用程序都可用。由此,XAF300允許對應(yīng)用程序組件和創(chuàng)建這些組件的代碼的豐富共享。另外,XAF是非常可擴展的,因為可由軟件開發(fā)者創(chuàng)建新組件并將其儲存到組件庫322中。XAD引擎320因此可以通過讀取XAD318中軟件作者所創(chuàng)建的新規(guī)則來調(diào)用、實例化和連接新組件。新規(guī)則和新組件然后可形成新XAF組件、新數(shù)據(jù)類型、新數(shù)據(jù)存儲、新UI或甚至是新應(yīng)用程序。XAD和XAD引擎在以下將更詳細描述。用于執(zhí)行用戶事件的方法400的一個實施例在圖4中示出。在該實施例中,首先發(fā)生用戶事件操作402。然而,本領(lǐng)域的技術(shù)人員將認識到,方法400可用于執(zhí)行不與用戶事件相對應(yīng)的數(shù)據(jù)改變。如所描述的,由應(yīng)用程序接收的數(shù)據(jù)改變或事件可由用戶動作,例如響應(yīng)于對用戶界面中的功能按鈕或控件或數(shù)據(jù)對象的用戶選擇來生成。數(shù)據(jù)事件也可由外部改變,例如作為運行外部進程的結(jié)果由應(yīng)用程序接收或從另一應(yīng)用程序或第三方來源接收的數(shù)據(jù)來生成。另外,如以上結(jié)合圖2B所解釋的,用戶事件可以是用戶在諸如UI218等UI內(nèi)執(zhí)行的任何改變或交互。連接操作404在諸如UI連接器206等UI連接器處接收用戶事件,并將用戶事件連接到諸如動作208等相應(yīng)的動作。提供操作406為動作中表示的數(shù)據(jù)改變提供標準格式動作。在一個實施例中,XML語句表示用于數(shù)據(jù)改變的動作。在一個實施例中,可任選輔助操作408將動作連接到諸如存取器212等存取器以幫助配置用于改變的特定數(shù)據(jù)的動作。存取器將數(shù)據(jù)專用動作發(fā)送給諸如數(shù)據(jù)連接器210等數(shù)據(jù)連接器。轉(zhuǎn)換操作410接收該數(shù)據(jù)-專用動作,并將這一標準格式動作(可以是XML語句)轉(zhuǎn)換成用于諸如數(shù)據(jù)存儲222等特定數(shù)據(jù)存儲的代碼和數(shù)據(jù)-專用操作。在數(shù)據(jù)存儲中作出數(shù)據(jù)改變。然后,數(shù)據(jù)連接器從數(shù)據(jù)存儲中讀取改變的數(shù)據(jù)。改變的數(shù)據(jù)被轉(zhuǎn)換成諸如XML數(shù)據(jù)表示等標準格式數(shù)據(jù)表示。可任選地,然后標準格式數(shù)據(jù)表示被發(fā)送到諸如變換器214等變換器??扇芜x改變操作412將由變換器接收的數(shù)據(jù)記錄改為UI專用數(shù)據(jù)語句。例如,該數(shù)據(jù)改變可要求以分類列表來顯示數(shù)據(jù)。一個或多個變換器可對檢索到的數(shù)據(jù)進行分類并創(chuàng)建以分類列表呈現(xiàn)數(shù)據(jù)的最終數(shù)據(jù)語句。變換器然后將改變并變換的數(shù)據(jù)提供給諸如UI連接器206等UI連接器。連接操作414然后接收改變的數(shù)據(jù)并與UI組件連接以顯示并提供該改變的數(shù)據(jù)。由此,UI現(xiàn)在提供了改變的數(shù)據(jù)的視圖。在一個實施例中,數(shù)據(jù)改變可以是用戶界面狀態(tài),并且改變的數(shù)據(jù)的顯示是改變的用戶界面的顯示。如由繼續(xù)回到用戶事件操作402的流程所表示的,接收事件、影響數(shù)據(jù)改變以及顯示改變的數(shù)據(jù)的過程400是迭代的,并且可對每一用戶事件或數(shù)據(jù)改變重復實現(xiàn)。如果數(shù)據(jù)改變或事件導致或要求應(yīng)用程序的重新配置,則可如以下參考圖5所描述來創(chuàng)建并連接和/或重新配置新組件。用于創(chuàng)建和配置應(yīng)用程序的方法500的一個實施例在圖5中示出。運行(launch)操作502啟動諸如應(yīng)用程序204等應(yīng)用程序。在一個實施例中,用戶通過用戶事件,諸如通過點擊應(yīng)用程序圖標來啟動應(yīng)用程序。語法分析操作504對諸如XAD318等XAD進行語法分析。在一個實施例中,語法分析標識并處理XAD內(nèi)的方案和/或規(guī)則。標識操作506標識應(yīng)用程序所必需的資源和/或組件。在一個實施例中,組件和資源在諸如組件庫322等組件庫中找到。實例化操作508實例化該組件。在一個實施例中,諸如XAD引擎320等XAD引擎中的幫助器代碼在形式上實例化組件庫中所標識的組件。在另一實施例中,實例化一組臨時的創(chuàng)建器組件。該創(chuàng)建器組件然后實例化關(guān)于輸入數(shù)據(jù)和與XAD中的標簽相關(guān)聯(lián)的規(guī)則的處理組件。連接操作510連接實例化的組件。在一個實施例中,XAD引擎根據(jù)所使用的數(shù)據(jù)或處理的用戶事件來連接組件。一旦實例化并連接了應(yīng)用程序組件,等待操作512即等待用戶事件。由此,XAD引擎與該應(yīng)用程序一起維持一種被動存在(passivepresence)。XAD引擎連續(xù)地監(jiān)視數(shù)據(jù)改變,并響應(yīng)于由諸如數(shù)據(jù)連接器210等數(shù)據(jù)連接器提供的數(shù)據(jù)改變。在數(shù)據(jù)改變時,確定操作514確定數(shù)據(jù)改變是否要求應(yīng)用程序的重新配置,如插入插件組件。如果要求重新配置,則流程通過“是”繼續(xù)到語法分析操作504。如果不要求重新配置,則流程通過“否”繼續(xù)到等待操作512。如此處所描述的,提供了一種用于為給定軟件應(yīng)用程序生成運行時結(jié)構(gòu)并用于管理軟件應(yīng)用程序的執(zhí)行的應(yīng)用程序框架。以下是上述本發(fā)明實施例的各方面的詳細描述,包括事務(wù)變換的操作和功能、經(jīng)由階段建模和線程化的組件域處理、以及用于生成和重新配置應(yīng)用程序組件的應(yīng)用程序描述引擎的操作。事務(wù)變換如上所述,提供了用于經(jīng)由一個或多個連接器接收和儲存數(shù)據(jù)的一個或多個數(shù)據(jù)存儲。根據(jù)本發(fā)明的各實施例,數(shù)據(jù)可通過使用一個或多個“事務(wù)變換”來選擇性地與數(shù)據(jù)存儲隔離。圖6示出了數(shù)據(jù)層的組織并示出了數(shù)據(jù)層與包括數(shù)據(jù)存儲和數(shù)據(jù)客戶端在內(nèi)的其它組件之間的連接。事務(wù)變換614包括用于儲存隔離的數(shù)據(jù)和關(guān)于數(shù)據(jù)的狀態(tài)信息的緩存模塊616,以及結(jié)合緩存模塊616使用二-階段提交協(xié)議使得失敗的提交不必導致數(shù)據(jù)丟失的控制模塊618。以下更詳細討論緩存模塊616和控制模塊618。數(shù)據(jù)存儲602和604包含在數(shù)據(jù)庫服務(wù)器或計算機可讀介質(zhì)上的數(shù)據(jù)。數(shù)據(jù)可如上所述地從數(shù)據(jù)存儲中讀出和寫入其中??捎蛇B接到給定數(shù)據(jù)存儲的代理發(fā)送檢查或某一其它請求以查看對數(shù)據(jù)存儲寫入數(shù)據(jù)是否可行。如果寫入數(shù)據(jù)是可行的,則將一肯定指示傳回代理。同樣,如果寫入數(shù)據(jù)是不可行的或者不知道是否可行,則將一否定指示傳回代理。數(shù)據(jù)連接器606和608將數(shù)據(jù)變換610、612和614連接到數(shù)據(jù)存儲602和604。在一個實施例中,在數(shù)據(jù)連接器606和608內(nèi)實現(xiàn)各協(xié)議以處理一種或多種類型的數(shù)據(jù)存儲。每一協(xié)議處理一種或多種類型的數(shù)據(jù)存儲,諸如使用特定格式編碼的數(shù)據(jù)庫文件。數(shù)據(jù)連接器協(xié)議最小單元地提交從數(shù)據(jù)客戶端622和624接收到的數(shù)據(jù)修改或改變。以上參考圖2B描述的UI連接器206是數(shù)據(jù)客戶端622、624的示例。在一個實施例中,數(shù)據(jù)連接器606和608通過保守并發(fā)性(pessimisticconcurrency)來實現(xiàn)最小單元性。保守并發(fā)性涉及鎖定數(shù)據(jù)存儲中的數(shù)據(jù)的子集(例如,一條或多條記錄)以防止客戶端以影響其它客戶端的方式修改數(shù)據(jù)。在保守并發(fā)性模型中,當客戶端執(zhí)行導致應(yīng)用鎖定的動作時,其它客戶端不能執(zhí)行將與該鎖定沖突的動作,直到擁有該鎖定的客戶端釋放該鎖定。這一模型在其中可能有對數(shù)據(jù)的大量競爭和/或其中用鎖定保護數(shù)據(jù)的成本低于在發(fā)生并發(fā)性沖突的情況下回退事務(wù)的成本的環(huán)境中是有用的。保守并發(fā)性最佳地在鎖時間短的時候,諸如在記錄的程序性處理時使用。在另一實施例中,數(shù)據(jù)連接器606和608使用帶有補償動作的優(yōu)化并發(fā)性(optimisticconcurrency)來實現(xiàn)最小單元性。優(yōu)化并發(fā)性不利用鎖定。當?shù)谝豢蛻舳诵枰掠涗洉r,該協(xié)議確定自從該記錄由第一客戶端最后一次讀取以來另一客戶端是否改變了該記錄。優(yōu)化并發(fā)性在具有極少數(shù)據(jù)競爭的環(huán)境中是有用的。補償動作是補償事務(wù)的效應(yīng)的動作。例如,對資金從賬戶A到賬戶B的銀行轉(zhuǎn)賬的補償效應(yīng)是將相同數(shù)量的資金從賬戶B轉(zhuǎn)回賬戶A。類似地,對保留酒店房間的補償動作是取消保留。補償動作允許事務(wù)被“回退”,或在沒有殘留副作用或其它負面結(jié)果的情況下被收回。補償動作可用于在兩個客戶端之間發(fā)生沖突(例如,第一客戶端讀取一數(shù)據(jù)值,然后第二客戶端在第一客戶端試圖修改該值之前修改了該數(shù)據(jù)值)時回退事務(wù)。在一個實施例中,數(shù)據(jù)連接器606和608高速緩存分別來自數(shù)據(jù)存儲602和604的數(shù)據(jù)。如果數(shù)據(jù)客戶端所請求的數(shù)據(jù)由數(shù)據(jù)連接器高速緩存,則無需向相應(yīng)的數(shù)據(jù)存儲查詢所請求的數(shù)據(jù)。數(shù)據(jù)連接器在下文將更詳細討論。數(shù)據(jù)變換610、612、614和620根據(jù)預定義規(guī)則來編碼和/或解碼數(shù)據(jù)。數(shù)據(jù)變換610、612、614和620實現(xiàn)可執(zhí)行任意復雜的處理的功能。數(shù)據(jù)變換612和620彼此串行。因此,由數(shù)據(jù)變換612實現(xiàn)的功能的結(jié)果用作由數(shù)據(jù)變換620實現(xiàn)的功能的輸入,反之亦然。在一個實施例中,數(shù)據(jù)變換可被串行地連接以緩存先前變換的結(jié)果,并且允許更容易且模塊化地實現(xiàn)復雜功能。同樣,視圖內(nèi)的數(shù)據(jù)的子集可在不影響視圖中的其余數(shù)據(jù)的情況下提交或刷新(見下文)。數(shù)據(jù)變換614是稱為事務(wù)變換的一種特殊的數(shù)據(jù)變換,且同樣地包含緩存模塊616和控制模塊618。在一個實施例中,事務(wù)變換允許隔離的數(shù)據(jù)最小單元地且以數(shù)據(jù)在數(shù)據(jù)存儲之間一致的方式來提交。緩存模塊616保持來自數(shù)據(jù)客戶端622和624的隔離數(shù)據(jù)。在一個示例中,數(shù)據(jù)客戶端622和624是用于編輯數(shù)據(jù)存儲604中的數(shù)據(jù)的對話框。對數(shù)據(jù)作出的編輯可在作出編輯時被充分地儲存在緩存模塊616中。在另一實施例中,事務(wù)變換將針對其輸出的編輯請求映射回針對其輸入的編輯請求。結(jié)果,當作出編輯時,輸入/請求實體將這一編輯識別為完成的。此外,這些事務(wù)變換使用其緩存616來允許這些編輯的延遲且受控的映射,將如以下討論??捎墒聞?wù)變換執(zhí)行若干類型的控制操作。當用戶希望在數(shù)據(jù)客戶端622或數(shù)據(jù)客戶端624中提交數(shù)據(jù)時(例如,當激活與數(shù)據(jù)客戶端相關(guān)聯(lián)的“應(yīng)用”按鈕時),控制模塊618從該數(shù)據(jù)客戶端接收提交控制操作,并試圖使用以下結(jié)合圖6討論的二-階段并發(fā)性協(xié)議來提交數(shù)據(jù)。在一個實施例中,緩存模塊616中緩存的數(shù)據(jù)可在一旦成功提交之后刪除。當用戶希望刷新緩存中的數(shù)據(jù)(且由此數(shù)據(jù)被顯示在相應(yīng)的數(shù)據(jù)客戶端中)時,控制模塊618從該數(shù)據(jù)客戶端接收刷新控制操作,并刷新緩存模塊616中的數(shù)據(jù)。刷新的數(shù)據(jù)被傳播到數(shù)據(jù)客戶端,使得用戶可訪問更新的數(shù)據(jù)。刷新隔離數(shù)據(jù)的能力可代替?zhèn)鹘y(tǒng)二-階段并發(fā)性模型中的提交來使用,如以下將結(jié)合圖6進行討論。在某些情況下,有益的是更新緩存中的數(shù)據(jù)而不廢棄一個或多個用戶使用一個或多個數(shù)據(jù)客戶端作出的未提交改變。在這一情況下,可由數(shù)據(jù)客戶端發(fā)出同步控制操作。當控制模塊618從數(shù)據(jù)客戶端接收同步控制操作時,基于數(shù)據(jù)存儲中的最新版本更新緩存模塊616中的隔離數(shù)據(jù),并且將對隔離數(shù)據(jù)的未提交改變與更新的數(shù)據(jù)合并。對數(shù)據(jù)的兩組或多組改變的同步過程在本領(lǐng)域中是公知的,且同步可在各種情況下使用。關(guān)于如何在給定上下文中實現(xiàn)同步的細節(jié)對于該上下文是非常特定的。例如,在產(chǎn)品數(shù)據(jù)庫的上下文中,合并數(shù)據(jù)庫中的產(chǎn)品的線是可接受的,但是合并對一個產(chǎn)品的名稱的兩種版本的改變是不可接受的。其它上下文可具有用于同步的其它規(guī)則,且所有這些都可結(jié)合本發(fā)明來使用。解決沖突也是已知的??商峁┎⒆裱P(guān)于在沖突的情況下哪些更新應(yīng)有決定性影響的預定規(guī)則。其它實施例可提醒用戶解決這些沖突。緩存模塊616維護可基于當前在進行中的操作的類型而變化的狀態(tài)信息。例如,如果提交正在進行中,則狀態(tài)信息可包括提交是待決、成功還是失敗?;蛘?,如果刷新正在進行中,則狀態(tài)信息可包括刷新是待決還是完成。如果同步操作正在進行中,則狀態(tài)信息可包括同步是待決、成功還是失敗。以下更詳細討論特定的控制操作。數(shù)據(jù)客戶端可訪問的某些數(shù)據(jù)可能不需要隔離。例如,對金融數(shù)據(jù)庫(諸如用于跟蹤銀行賬戶)的更改通常是立即提交的。在一個實施例中,給定數(shù)據(jù)視圖可包括隔離和未隔離數(shù)據(jù)。在另一實施例中,給定數(shù)據(jù)客戶端可包括不能在數(shù)據(jù)客戶端內(nèi)編輯的只讀數(shù)據(jù)。響應(yīng)于從應(yīng)用程序開發(fā)者接收到應(yīng)用程序規(guī)范,本發(fā)明的一個實施例標識該應(yīng)用程序的哪些部分需要隔離數(shù)據(jù)并按需實現(xiàn)事務(wù)變換。圖7示出了事務(wù)變換操作的操作流程。接收操作702接收應(yīng)用程序規(guī)范。在一個實施例中,應(yīng)用程序規(guī)范指定了XAF應(yīng)用程序,包括哪些數(shù)據(jù)應(yīng)被隔離,且標識操作704標識并標記應(yīng)用程序內(nèi)將被隔離的相應(yīng)數(shù)據(jù)實體。實現(xiàn)操作706實現(xiàn)對應(yīng)于被標記為要隔離的數(shù)據(jù)實體的每一數(shù)據(jù)實體的一個或多個事務(wù)變換。事務(wù)變換然后以與數(shù)據(jù)變換基本相同的方式來連接和激活。圖8示出了根據(jù)事務(wù)變換操作執(zhí)行的控制操作。接收操作802從數(shù)據(jù)客戶端接收控制操作請求。在一個實施例中,該請求通過用戶點擊與數(shù)據(jù)客戶端相關(guān)聯(lián)的UI控件來觸發(fā)。確定操作804確定該控制操作請求是否請求提交操作。如果該控制操作請求是針對提交操作的,則流程通過“是”分支到發(fā)出操作908(圖9)。如果該控制操作請求不是針對提交操作的,則流程通過“否”分支到確定操作806。確定操作806確定控制操作請求是否請求同步操作。如果該控制操作請求是針對同步操作的,則流程通過“是”分支到發(fā)出保存操作808。如果該控制操作請求不是針對同步操作的,則流程通過“否”分支到刷新操作810。如果請求了同步操作,則保存操作808保存任何未提交的改變到該緩存的數(shù)據(jù)。未提交改變可被保存到計算機可讀介質(zhì)上的一個文件、到易失性或非易失性存儲器或其它形式的計算機存儲,或者被提交給外部數(shù)據(jù)庫或類似的服務(wù)。流程然后前進到刷新操作810。刷新操作810檢索數(shù)據(jù)存儲中存在的緩存的數(shù)據(jù)的最新副本,并且將其放置在與事務(wù)變換相關(guān)聯(lián)的緩存中。刷新操作810可能要求查詢?nèi)舾蓴?shù)據(jù)存儲以確定哪一數(shù)據(jù)存儲包含該數(shù)據(jù)的最新副本。在另一實施例中,刷新操作810可替代地或者另加地檢查與每一數(shù)據(jù)存儲相關(guān)聯(lián)的數(shù)據(jù)連接器來查看該數(shù)據(jù)連接器是否包含緩存的數(shù)據(jù)的高速緩存副本。確定操作812確定該控制操作請求是否請求同步操作。在一個實施例中,確定操作812只需檢查確定操作806的結(jié)果。如果控制操作請求是針對同步操作的,則流程通過“是”分支到合并操作814。如果控制操作請求不是針對同步操作的,則流程通過“否”分支到操作流程的結(jié)束。如果請求了同步操作,則合并操作814將由保存操作808保存的對緩存數(shù)據(jù)的改變與由刷新操作810刷新的緩存數(shù)據(jù)合并。用于合并兩種版本的數(shù)據(jù)主體的規(guī)則基于應(yīng)用程序的上下文而變化。某些示例性規(guī)則結(jié)合圖6呈現(xiàn)。在一個實施例中,可將來自不同數(shù)據(jù)客戶端的多個改變合并在一起以實現(xiàn)每一數(shù)據(jù)客戶端中的同步性。圖9示出了如何根據(jù)本發(fā)明的一個實施例處理提交請求。接收操作902從數(shù)據(jù)客戶端接收數(shù)據(jù)。在一個實施例中,數(shù)據(jù)客戶端是應(yīng)用程序用戶用于輸入數(shù)據(jù)的對話框,且數(shù)據(jù)在與該對話框相關(guān)聯(lián)的UI控件被激活時發(fā)送。緩存操作904然后將數(shù)據(jù)緩存在一個或多個事務(wù)變換內(nèi)或與該一個或多個事務(wù)變換相關(guān)聯(lián)的存儲器中。當接收操作906接收到對提交操作的請求時,調(diào)用經(jīng)修改的二-階段提交協(xié)議。首先,發(fā)出操作908向與數(shù)據(jù)存儲相關(guān)聯(lián)的多個數(shù)據(jù)連接器發(fā)出提交請求。在一個實施例中,提交請求包括要提交的數(shù)據(jù)。提交請求由高速緩存該數(shù)據(jù)的一個或多個數(shù)據(jù)連接器和/或保持該數(shù)據(jù)的一個或多個數(shù)據(jù)存儲所接收,并且作為對數(shù)據(jù)可被最小單元地提交的保證的請求來對待。接收操作910從保持該數(shù)據(jù)的數(shù)據(jù)連接器和/或數(shù)據(jù)存儲接收響應(yīng)。一旦接收到所有的響應(yīng),確定操作912確定是否該提交請求的所有接收方都同意提交。如果所有接收方都同意,則流程通過“是”分支到發(fā)送操作914。如果并非所有的接收方都同意,則流程通過“否”分支到發(fā)送操作916。如果所有的接收方都同意提交數(shù)據(jù),則發(fā)送操作914向由發(fā)出操作908發(fā)出的提交請求的所有接收方提交命令。接收方提交該數(shù)據(jù)(即,以此變化更新其自己的數(shù)據(jù))。如果并非所有的接收方都同意提交數(shù)據(jù),則發(fā)送操作916向接收方發(fā)送異常中止命令。接收方因此知道建議的提交不會發(fā)生,并且與該提交相關(guān)聯(lián)的任何數(shù)據(jù)可被丟棄。在一個實施例中,發(fā)送操作916僅向同意提交數(shù)據(jù)的接收方發(fā)送異常中止命令,而不同意提交數(shù)據(jù)的接收方自動丟棄該數(shù)據(jù)而無需明確地命令其這樣做。接著,刷新操作918執(zhí)行刷新控制操作來刷新緩存的數(shù)據(jù)。在一個實施例中,刷新操作918改為執(zhí)行同步控制操作來同步緩存的數(shù)據(jù)。也構(gòu)想了本發(fā)明的其它實施例。在一個實施例中,每一事務(wù)變換可包括實施同步規(guī)則的策略模塊。在另一實施例中,策略模塊規(guī)定用于刷新和同步的并發(fā)性策略。示例性并發(fā)性策略包括保守并發(fā)性(conservativeconcurrency)(其中總是制作對所有緩存的數(shù)據(jù)的完整副本)以及優(yōu)化并發(fā)性(其中數(shù)據(jù)僅在要求時被復制到緩存中)。策略模塊也可允許策略模塊化地添加以處理此處未討論的其它類型的控制操作。在另一實施例中,可使用事務(wù)變換結(jié)合查詢語言來訪問和處理數(shù)據(jù)。SQL(結(jié)構(gòu)化查詢語言)是廣泛使用的一種這樣的查詢語言。XQuery是另一種這樣的查詢語言。也構(gòu)想了結(jié)合本發(fā)明對其它查詢語言的使用。在又一實施例中,數(shù)據(jù)連接器610可提供和(在某種程度上)管理緩存的部分,例如圖6中的緩存和邏輯616。在這一情況下,連接器具有訪問和/或處理緩存的數(shù)據(jù)以控制數(shù)據(jù)的刷新和/或同步組件的邏輯。應(yīng)用程序框架分階段(phasing)模型如上簡要描述的,應(yīng)用程序和/或應(yīng)用程序組件可被約束到某些階段。一般而言,分階段通過使軟件組件服從多層分階段模型來約束軟件方法在計算機系統(tǒng)內(nèi)的執(zhí)行。軟件組件可以是類、對象、方法或計算機系統(tǒng)內(nèi)的其它軟件代碼構(gòu)造。階段是同時且共同由一組軟件組件共享的操作狀態(tài)。計算機系統(tǒng)執(zhí)行頂層分階段模型,也稱為主分階段模型,且一個或多個子-階段在該主分階段模型的一個或多個階段期間發(fā)生。計算機系統(tǒng)內(nèi)的操作被約束到一組階段或子-階段。多層分階段模型1000的一個示例性實施例在圖10中示出。該多層分階段模型具有包括三個階段1002、1004和1006的第一或主階段模型。主階段以由箭頭1016描繪的順序發(fā)生。兩個子-階段,即子-階段11008和子-階段21010在階段11002期間發(fā)生。此外,另兩個子-階段,即子-階段2a和子-階段2b在子-階段2期間發(fā)生。由此,分階段模型1000表示了具有在其它階段或子-階段期間發(fā)生的子-階段的一組多層階段。在下文中,對階段的任何討論也可應(yīng)用于子-階段。每一軟件組件被約束于在一特定階段內(nèi)操作。對每一軟件方法施加約束以僅在該軟件方法被約束到的階段期間執(zhí)行或被調(diào)用。能夠造成沖突或矛盾結(jié)果的軟件方法被約束到不同的階段,在此該軟件方法就不能從當前階段被合法地調(diào)用。由此,每一軟件方法以已知的方式執(zhí)行而不會在完成矛盾任務(wù)的方法之間產(chǎn)生沖突。所有方法都在一特定的階段約束下執(zhí)行,使得軟件系統(tǒng)被稱為處于與當前階段約束兼容的狀態(tài)中。再次參考圖10,階段11002是子-階段11008和子-階段21010的超階段。另兩個子-階段,即子-階段2a1012和子-階段2b1014在子-階段21010期間發(fā)生。同樣,子-階段21010是子-階段2a1012和子-階段2b1014的超階段。任何階段或子-階段可具有子-階段。對于多層分階段模型內(nèi)的子-階段的層數(shù)沒有限制。另外,在任何階段空間中必須有至少兩個階段,但是對兩個階段之上的階段數(shù)沒有限制。另外,如果在超階段內(nèi)有子-階段,則必須有至少兩個子-階段,但是對在兩個子-階段之上的任何超階段期間發(fā)生的子-階段的數(shù)目沒有限制。任何子-階段組可在超階段期間循環(huán)一次或多次。階段模型1000示出了階段空間。階段空間是確定有效階段(圖節(jié)點)和有效階段轉(zhuǎn)換(圖的邊)的有限有向圖。因此,階段空間確定了有效階段序列。階段空間1000被定義在階段組階段11002、階段21004和階段31006上。階段空間1000還有三個階段轉(zhuǎn)換1018a、1018b和1018c。階段轉(zhuǎn)換表示共享預轉(zhuǎn)換階段的所有軟件組件的同時階段改變何時發(fā)生。當軟件組件共享一階段空間時,這些軟件組件是階段域的一部分。階段域是對由特定階段空間定義的公共分階段模型達成一致的一組軟件。例如,同意受具有主階段1002、1004和1006的主階段空間約束的所有軟件組件是主階段域的一部分。由此,與主階段域中的軟件組件相關(guān)聯(lián)的所有軟件組件包括與主階段1002、1004和1006中的至少一個相關(guān)聯(lián)的階段約束。階段約束是限制在某一特定程序上下文中有效的階段的靜態(tài)約束。特別地,約束可被應(yīng)用于程序段,從而斷言該程序段僅在遵從該約束的階段期間執(zhí)行。在一個實施例中,階段約束被寫為括號中的屬性,諸如[Phase1]。這一數(shù)據(jù)結(jié)構(gòu)將在以下更詳細解釋。具有占據(jù)一個或多個階段域的一個或多個組件的計算機環(huán)境1100在圖11中示出。主指導器1102控制主階段空間的轉(zhuǎn)換和建立。該計算機環(huán)境內(nèi)的所有組件是主階段域1100的一部分,但是可占據(jù)一個或多個子-階段域。為允許創(chuàng)建階段域1100,程序作者需要選擇階段空間、在該階段空間上執(zhí)行階段轉(zhuǎn)換的策略、以及處理跨階段域邊界的消息的策略。階段域1100可由多層階段空間來表征。在本發(fā)明的各實施例中,諸如組件11104等一個或多個組件向主指導器1102注冊。組件11104表示任何類型的軟件構(gòu)造,包括軟件組件或方法。軟件組件1104被約束于主階段空間中的階段之一。在其它實施例中,諸如子-指導器11106和子-指導器21108等一個或多個子-指導器向主指導器1102注冊。子-指導器控制具有一個或多個不同階段空間的一個或多個其它階段域。由此,階段域1100具有一個或多個嵌套的階段域。諸如向子-指導器11106注冊的組件21110等所有組件被約束于子-階段空間內(nèi)以及主階段空間的一個或多個主階段內(nèi)的一個或多個子-階段。在一個實施例中,由子-指導器控制的子-階段域在單個主階段內(nèi)操作。子-階段的操作可以在單個主階段期間重復發(fā)生。在本發(fā)明的各實施例中,諸如子-指導器2等子-指導器向諸如子-指導器3等其它子-指導器注冊以創(chuàng)建進一步嵌套的子-階段域。在某些實施例中,子-指導器21108控制組件31112的和子-指導器31114的操作。在其它實施例中,諸如子-指導器31114等指導器控制諸如組件41116和組件51118等一個以上組件。每一子-指導器可控制具有獨特階段的階段空間。由此,子-指導器11106操作第一子-階段空間,而子-指導器31114操作第二子-階段空間。如果二-階段空間不交互,則階段空間被稱為正交空間。正交階段空間的組合可形成笛卡爾階段空間,它可用于形成用于單個乘積的階段域。底層階段組是正交階段組的笛卡爾乘積,其中有效階段轉(zhuǎn)換也是正交階段組的有效轉(zhuǎn)換的笛卡爾乘積。在本發(fā)明的各實施例中,指導器是邏輯時鐘。指導器類似于硬件系統(tǒng)中的時鐘循環(huán)通過各階段。在每一階段轉(zhuǎn)換時,指導器同時改變階段域內(nèi)的所有軟件組件的階段。在一個實施例中,任何子-指導器可同時改變子-階段域中的子-階段。邏輯時鐘等待被約束于階段的操作或在約束于該階段的子-階段內(nèi)執(zhí)行的操作的完成??捎糜谥麟A段域的階段空間1200的一個示例性實施例在圖12中示出。階段空間1200具有三個階段。在讀請求階段1202期間,將對數(shù)據(jù)讀或?qū)懙恼埱蠡蜍浖到y(tǒng)中的其它軟件命令或請求排隊,直到進入下一階段。在一個實施例中,僅所請求的某些非重復方法在下一階段中執(zhí)行,而其它方法等待另一階段或階段的下一循環(huán)。更新階段1204將命令和請求定向到適當?shù)能浖M件。在本發(fā)明的各實施例中,在更新階段1204,軟件組件履行命令或請求。在一個實施例中,更新階段1204具有在更新階段1204期間發(fā)生的子-階段空間500。一個示例性子-階段500在圖5中示出并在下文解釋。在一個實施例中,更新階段1204觸發(fā)用于數(shù)據(jù)層的子-階段。換言之,對數(shù)據(jù)寫的任何請求在更新階段1204的子-階段中實現(xiàn)。第三階段,即重新確認階段1206指導并執(zhí)行在更新階段1204期間未處理的其它方法。在一個實施例中,檢索數(shù)據(jù)的所有請求在重新確認階段1206期間完成。例如,在更新階段1204中更新了數(shù)據(jù)之后,通知所有軟件組件發(fā)生了數(shù)據(jù)改變,且被通知的軟件組件檢索更新的數(shù)據(jù)。在一個實施例中,重新確認階段1206操作子-階段空間600。子-階段空間的一個示例性實施例1300在圖13中示出并在以下描述。為改變階段,階段空間1200通過階段轉(zhuǎn)換。在該示例性實施例中,存在表示三個階段1202、1204和1206之間的轉(zhuǎn)換的三個階段轉(zhuǎn)換1208a、1208b和1208c。如上所述,階段轉(zhuǎn)換是諸如指導器1102等指導器改變階段時鐘,且階段域中用于所有軟件組件的階段同時改變的時間點。對階段域內(nèi)的軟件組件的關(guān)于當前階段或向新階段的轉(zhuǎn)換的提醒或通知可以發(fā)生。在一個實施例中,指導器通知階段的所有軟件組件。在其它實施例中,請求方法向指導器要求階段。在本發(fā)明的各實施例中,轉(zhuǎn)換通知被發(fā)送給階段域內(nèi)的一個或多個軟件組件。在一個實施例中,轉(zhuǎn)換通知在當前階段期間或在下一階段的開始處發(fā)生。在其它實施例中,對通知過程采用單獨的階段。例如,階段空間1200可具有位于轉(zhuǎn)換1208a、1208b和1208c處的三個通知階段,用于通知階段域內(nèi)的軟件組件。更新階段1204的一個示例性子-階段空間1300在圖13中示出。子-階段1300在某些實施例中用于數(shù)據(jù)層。換言之,用于將數(shù)據(jù)寫入共享數(shù)據(jù)結(jié)構(gòu)的方法被約束于數(shù)據(jù)子-階段空間1300的子-階段之一。在一個實施例中,共享該數(shù)據(jù)的所有軟件組件在合約階段1302中同意提交該改變或異常中止該改變。該改變在提交或異常中止階段1304中被提交或異常中止。在另一實施例中,合約階段和提交或異常中止階段是“提交或異常中止”子-階段1304的子-階段,且子-階段空間1300具有標記階段1302而非合約子-階段1302。此處,數(shù)據(jù)改變在提交或異常中止階段1304中作出,且使用該數(shù)據(jù)的所有軟件組件被標記用于在標記階段1302中更新。標記軟件組件是在軟件組件中設(shè)置標志,以發(fā)信號通知該軟件組件在適當?shù)纳院箅A段中檢索更新的數(shù)據(jù)。在一個實施例中,標記的軟件組件在重新確認階段1206檢索數(shù)據(jù)。在另一實施例中,標記階段1302具有兩個子-階段標記子-階段和最終標記子-階段。此處,使用該數(shù)據(jù)的軟件組件在標記子-階段中被標記,并在最終標記子-階段中檢索數(shù)據(jù)。在重新確認階段1206期間發(fā)生的另一示例性子-階段空間1400在圖14A中示出。約束于子-階段空間1400的軟件構(gòu)造中的一個示例性改變在圖14B中示出。子-階段空間1400提供用于即插即用操作的子-階段。即插即用子-階段空間1400具有兩個階段用子-階段1404和插子-階段1402。一般而言,在插子-階段1402中,建立、改變或移除軟件組件的組合和配置,但是不執(zhí)行任何使用時間功能。同樣,在用子-階段1404中,對常規(guī)功能使用軟件組件所建立的組合或配置,但是不建立、改變或移除組合或配置方面。模塊重新配置的一個示例性實施例在圖14B中示出。在該實施例中,軟件模塊具有第一配置1406。在諸如用戶輸入請求等某一動作之后,軟件模塊改為第二配置1408。本領(lǐng)域的技術(shù)人員將認識到,軟件模塊在第一配置1406中與在第二配置1408中不同地操作。由此,重新配置應(yīng)當在與該軟件模塊交互的用階段期間沒有方法執(zhí)行的情況下發(fā)生。在本發(fā)明的各實施例中,在插子-階段1402,軟件實例被初始化、連接或斷開,并設(shè)置屬性。在某些實施例中,其它子-階段幫助定制在插子-階段1402中執(zhí)行的操作。在一個實施例中,插子-階段1402具有其它子-階段。構(gòu)造子-階段1410通過實例化已知的類、調(diào)用軟件組件或使用現(xiàn)有實例上的接口來獲取一個克隆的或被專門導出的實例來創(chuàng)建新軟件實例。最后,初始化子-階段1414設(shè)置屬性并要求正確連接的實例之間的協(xié)商。插子-階段1402中的子-階段可偏離此處所呈現(xiàn)的子-階段。另外,該子-階段1404也可包含子-階段。構(gòu)想了其它分階段空間。例如,構(gòu)想了用于用戶界面改變的子-階段空間。在用戶界面子-階段空間中,無效子-階段可允許用于構(gòu)建結(jié)構(gòu)的方法的執(zhí)行。繪制子-階段然后繪制構(gòu)建結(jié)構(gòu)。如本領(lǐng)域的技術(shù)人員將認識到的,可對其它類型的操作使用其它階段空間。另外,本領(lǐng)域的技術(shù)人員將認識到以上呈現(xiàn)的示例性階段空間可在階段或子-階段的數(shù)目、層或級的數(shù)目以及階段或子-階段的類型方面改變。由此,本發(fā)明是可擴展的。在一個實施例中,新的超階段被疊加在現(xiàn)有階段空間上。在另一實施例中,新的階段被添加到現(xiàn)有的階段空間。在還有的一些實施例中,向現(xiàn)有的階段空間添加更多子-階段或子-階段空間的新層。具有約束代碼項執(zhí)行的階段約束的數(shù)據(jù)結(jié)構(gòu)1500的一個示例性實施例在圖15中示出。數(shù)據(jù)結(jié)構(gòu)1500是代碼元素。任何類型的代碼可具有階段約束。階段約束1502被示為在方法1504之上。階段約束1502將方法1504的操作約束于階段約束中指定的階段,在本實施例中為階段“執(zhí)行”。由此,方法1504僅在“執(zhí)行”階段或“執(zhí)行”子-階段期間執(zhí)行。在本發(fā)明的各實施例中,數(shù)據(jù)結(jié)構(gòu)包含取決于軟件組件和所執(zhí)行的操作的類型的約束的形式。在一個實施例中,約束是調(diào)用約束。調(diào)用約束將方法調(diào)用約束于指定階段。由此,在其它軟件組件或同一軟件組件中的方法的執(zhí)行通過限制這些方法僅在指定階段期間啟動而被約束。在另一實施例中,約束是構(gòu)造器約束。構(gòu)造器是實例化軟件組件的一種特殊形式的方法。由此,軟件組件的實例化被約束于指定階段,諸如對于圖14A中的構(gòu)造子-階段1410所解釋的。在另一實施例中,約束是引用約束。引用約束約束了軟件組件的整個類以及該類的所有原語操作。例如,對接口施加的引用約束限制了軟件模塊之間的連接,如對于圖14A中的連接子-階段1412所解釋的。約束由軟件代碼中可被分配給任何目標軟件組件的階段約束屬性來表達。在本發(fā)明的各實施例中,階段約束屬性被分配給整個類且是可繼承的。由此,孩子組件從其父組件繼承約束。在某些實施例中,分階段方案對同一目標施加多個階段約束屬性。由此,軟件目標通過多個階段約束的結(jié)合來約束。每一約束是對與所指定的階段的層次相關(guān)聯(lián)的“類型”的約束。由此,指定超階段的約束是對“超階段”的約束。指定子-階段的約束是對“子-階段”的約束。對作為子-階段的類型的約束是對關(guān)于“超類型”的所有約束的并集的約束。對類型的約束之間的關(guān)系由編譯器使用或在運行時使用以檢查不同軟件組件之間的約束關(guān)系的有效性。實施約束可在運行時或在編譯時發(fā)生。在編譯時,可檢查對類型的約束。編譯器可對照用于具有對類型的約束的方法(它調(diào)用具有對子類型的約束的方法)的一組合法性規(guī)則來檢查對類型的約束以及對子類型的約束。如果對子類型的約束與對類型的約束相同或比它弱,例如,如果對類型的約束指定了插階段1402,而對子類型的約束指定了初始化子-階段1414,則該約束方案是有效的。在該實施例中,初始化子-階段約束1414在插子-階段1402內(nèi)執(zhí)行,且因此是較弱的約束。如果對子類型的約束與對類型的約束互不相交,例如,如果對類型的約束指定了用子-階段1404,而對子類型的約束指定了相反的插子-階段1402,則約束方案是無效的。如果對子類型的約束比對類型的約束強或與其重疊,例如,如果對類型的約束指定了插子-階段1402,而對子類型的約束指定了初始化子-階段1414,則約束方案是有效的,但是必須經(jīng)受某一動態(tài)檢查。在該實施例中,如果階段域當前同時在插子-階段1402和初始化子-階段1414中操作,則該調(diào)用方案是有效的。然而,如果域不在兩個子-階段之一中,則該方案是無效的。其它合法性規(guī)則也被構(gòu)想并結(jié)合到本發(fā)明中。用于在多層分階段域中操作計算機環(huán)境的方法1600的一個示例性實施例在圖16A和圖16B中示出。在開始之后,轉(zhuǎn)換操作1602轉(zhuǎn)換到第一階段,如請求階段1202。在一個實施例中,啟動諸如主指導器1102等主指導器。在一個實施例中,諸如組件1104等組件被約束于向主指導器注冊的主階段之一。主指導器開始階段時鐘以將邏輯時間循環(huán)通過諸如階段空間1200等階段空間內(nèi)的階段。確定操作1604確定諸如組件1104等任何軟件組件是否被約束于主階段中的第一個。如果一軟件組件被約束于第一階段,則執(zhí)行操作1606在第一階段期間執(zhí)行該軟件組件。如果沒有軟件組件要執(zhí)行或者在軟件組件的執(zhí)行期間,則確定操作1608確定是否有在第一階段期間發(fā)生的子-階段空間,諸如子-階段空間1300。如果在第一階段期間沒有子-階段空間發(fā)生,則該過程通過連接器1前進到圖16B所示的轉(zhuǎn)換操作1622。如果有在第一階段期間發(fā)生的子-階段空間,則標識操作1610標識該子-階段空間以及適用的子-階段。在一個實施例中,諸如子-指導器1106等子-指導器被啟動并向控制主階段空間的主指導器注冊。子-指導器開始子-階段邏輯時鐘以循環(huán)通過子-階段空間中的各子-階段。確定操作1612確定是否有被約束于當前子-階段的任何軟件組件,如組件1112。在一個實施例中,約束于子-階段空間的軟件組件向子-指導器注冊。由此,在主階段域下創(chuàng)建了嵌套的子-階段域。如果在約束于當前子-階段的子-階段域中有軟件組件,則執(zhí)行操作1614在當前子-階段期間執(zhí)行這些軟件組件。確定操作1616確定是否有在當前子-階段期間發(fā)生的其它子-階段空間,諸如子-階段1410、1412和1414。如果有其它子-階段,則該過程返回到標識操作1610以標識其它子-階段。如果沒有其它子-階段空間要標識,則確定操作1618確定是否有任何其它子-階段空間剩下要在當前子-階段空間中發(fā)生。如果有另一子-階段要在當前子-階段空間中發(fā)生,則轉(zhuǎn)換操作1620轉(zhuǎn)換到子-階段空間中的下一子-階段。在一個實施例中,子-指導器等待,直到當前子-階段中的所有線程被執(zhí)行,然后轉(zhuǎn)換到下一子-階段。然后,該過程再次前進到確定操作1612。如果當前子-階段空間中沒有剩下任何子-階段,則確定操作1618確定在任何超階段空間中是否有要轉(zhuǎn)換到的另一超階段。如果有另一超階段,則轉(zhuǎn)換操作1620轉(zhuǎn)換到下一超階段。該過程(確定超階段內(nèi)的子-階段;在子-階段內(nèi)執(zhí)行軟件組件;轉(zhuǎn)換到下一子-階段直到所有子-階段完成;以及然后轉(zhuǎn)換到下一超階段)重復,直到循環(huán)通過了所有子-階段空間并且要求轉(zhuǎn)換到下一主階段。一旦子-階段循環(huán)對第一主階段結(jié)束,則該過程通過連接器1前進到圖16B所示的轉(zhuǎn)換操作1622。轉(zhuǎn)換操作1622轉(zhuǎn)換到下一主階段,如更新階段1204。在一個實施例中,主指導器等待在第一階段中執(zhí)行的所有線程結(jié)束。然后,主指導器將邏輯階段時鐘改為下一階段。在某些實施例中,主指導器遵循以上參考圖11列出的轉(zhuǎn)換規(guī)則。該過程然后遵循如同用于標識子-階段的第一階段發(fā)生時相類似的操作。由此,關(guān)于子-階段過程的某些細節(jié)此處不再討論,但是本領(lǐng)域的技術(shù)人員將認識到如何將關(guān)于第一階段描述的細節(jié)實現(xiàn)到約束于下一階段的任何后續(xù)過程中。確定操作1624確定是否有任何軟件組件被約束于當前主階段。如果有被約束于下一主階段的軟件組件,則執(zhí)行操作1626執(zhí)行該軟件組件。在各實施例中,這些軟件組件已向主指導器注冊。這些軟件組件繼續(xù)為當前階段與主指導器協(xié)商。當階段轉(zhuǎn)換和主指導器報告該域現(xiàn)在在下一主階段中時,約束于下一主階段的軟件組件開始執(zhí)行。如果沒有約束于下一主階段的軟件組件或者在約束的軟件組件的執(zhí)行期間,則確定操作1628確定當前主階段內(nèi)是否有任何子-階段空間。如果有子-階段空間,則標識操作1630標識這些子-階段空間并轉(zhuǎn)換到第一子-階段。確定操作1632確定是否有任何軟件組件約束于當前子-階段。如果有約束于當前子-階段的軟件組件,則執(zhí)行操作1634執(zhí)行該軟件組件。如果沒有約束于當前子-階段的軟件組件或者在這些軟件組件的執(zhí)行期間,則確定操作1636確定當前子-階段內(nèi)是否有其它子-階段空間。如果有其它子-階段空間,則該過程返回到標識操作1630。如果當前子-階段內(nèi)沒有其它子-階段空間,則確定操作1638確定是否有當前子-階段空間中的下一子-階段或者超階段空間中的下一超階段。如果有下一子-階段或超階段,則轉(zhuǎn)換操作1640轉(zhuǎn)換到下一子-階段或超階段。如果在當前主階段下沒有下一子-階段或超階段,則確定操作1642確定是否有下一主階段,諸如重新確認階段1206。如果有下一主階段,則該過程返回到轉(zhuǎn)換操作1622。如果主階段空間中沒有另一主階段,則該過程通過連接器2返回到轉(zhuǎn)換操作1602并通過轉(zhuǎn)換到第一階段來開始階段循環(huán)。為進一步解釋本發(fā)明,以下參考圖17描述在多層分階段域中操作的一個示例性計算機系統(tǒng)。該示例性計算機系統(tǒng)操作個人聯(lián)系應(yīng)用程序,諸如消息通信和協(xié)作客戶端程序。此處,用戶界面顯示地址簿中的一個或多個聯(lián)系人。用戶界面具有主視圖窗口1702。主視圖1702示出了所有聯(lián)系人并允許用戶選擇聯(lián)系人來查看關(guān)于該聯(lián)系人的更詳細信息。計算機環(huán)境1700在階段空間下操作。為解釋起見而非限制,整個系統(tǒng)1700在圖12所示的階段空間1200下操作。另外,出于解釋的目的,計算機系統(tǒng)1700當前是在請求階段1202中。由此,計算機系統(tǒng)1700允許其中接收請求或命令的任何操作。由此,接收查看聯(lián)系人的詳細視圖1704的用戶命令1716并將其置于隊列中。另外,命令1718被發(fā)送到地址簿模塊1708以檢索所請求的詳細信息。數(shù)據(jù)請求1718也被排隊。主指導器1102將計算機系統(tǒng)域1700中的階段改為更新階段1204。此處,命令1716和1718分別被發(fā)送到選擇狀態(tài)模塊1706和地址簿1708。在更新階段1204期間,轉(zhuǎn)換到如以上參考圖14所解釋的用于對用戶界面的改變的用戶界面子-階段空間。無效子-階段開始。用于詳細視圖1704的命令1716開始處理。主視圖1702中的視圖被無效。例如,對詳細視圖1704的選擇被設(shè)為非活動。另外,主視圖1702被設(shè)為非活動窗口。詳細視圖1704用適當?shù)挠蚝陀脩艚缑骓梺韯?chuàng)建。用戶界面子-指導器然后轉(zhuǎn)換到繪制子-階段。主視圖1702中對聯(lián)系人的選擇被繪制以顯現(xiàn)為非活動,例如加亮的選擇改變顏色。主視圖1702被繪制為非活動。例如,主視圖1702窗格改變顏色以表示它是非活動的。詳細視圖1704用用戶界面元素來繪制。字段保持打開以從地址簿模塊1708接收數(shù)據(jù)。主指導器1102在用戶界面子空間中的所有無效和繪制約束操作完成之后轉(zhuǎn)換到重新確認階段1206。在重新確認階段1206期間執(zhí)行數(shù)據(jù)檢索操作。在一個實施例中,數(shù)據(jù)檢索操作被約束于數(shù)據(jù)檢索子-階段空間。數(shù)據(jù)檢索子-階段空間具有兩個子-階段,即標記和最終標記,如參考圖13所解釋的。啟動標記子-階段。地址簿搜索需要數(shù)據(jù)更新的軟件模塊。標記詳細視圖1704。用于數(shù)據(jù)的子-指導器檢索向最終標記子-階段的子-階段空間轉(zhuǎn)換。在最終標記子-階段中,地址簿1708從以下三個數(shù)據(jù)存儲之一中檢索所需的聯(lián)系人信息Exchange服務(wù)器地址簿1710、客戶端地址簿1712或MSN地址簿。在檢索到聯(lián)系人信息之后,地址簿1708將聯(lián)系人信息寫入詳細視圖1704。在完成了約束于重新確認階段1206的所有操作之后,主指導器1102轉(zhuǎn)換回請求階段1202。此處,用戶界面再次從用戶輸入設(shè)備接受命令和請求。用戶在詳細視圖1704內(nèi)輸入對聯(lián)系人信息的改變。例如,用戶改變聯(lián)系人的地址。命令1720從詳細視圖1704發(fā)送到地址簿1708(原文1704,錯)以改變數(shù)據(jù)。另外,命令1722被發(fā)送到選擇狀態(tài)1706以更新主視圖1702和詳細視圖1704的視圖。在這一實施例中,命令將被排隊,且主指導器1102轉(zhuǎn)換到更新階段1204。更新階段1204啟動數(shù)據(jù)寫子-階段空間,諸如子-階段空間1300。在合約(agreement)子-階段1302中,地址簿將數(shù)據(jù)改變請求發(fā)送到若干數(shù)據(jù)存儲1710、1712和1714。數(shù)據(jù)存儲中的一個或多個可包含詳細視圖1704中改變的數(shù)據(jù)的副本。由此,具有該數(shù)據(jù)的每一數(shù)據(jù)存儲必須同意改變數(shù)據(jù)。由此,在合約子-階段1302期間發(fā)生投票過程。如果所有的數(shù)據(jù)存儲同意提交該改變,則將該合約發(fā)回地址簿1708。子-指導器將階段改為提交或異常中止階段1304。此處,數(shù)據(jù)改變被發(fā)送到數(shù)據(jù)存儲并用于更新數(shù)據(jù)。同時,在更新階段1204期間,用戶界面子-階段空間發(fā)生。選擇狀態(tài)1706在無效子-階段中將主視圖1702和詳細視圖1704中包含舊數(shù)據(jù)的部分無效。在繪制子-階段中,重新繪制主視圖1702和詳細視圖1704,從而為改變的數(shù)據(jù)保持了空間。在所有子-階段在更新階段1204中完成之后,階段域1700轉(zhuǎn)換到重新確認階段1206。在重新確認階段1206中,其它子-階段空間包括用于標記和最終標記的子-階段。轉(zhuǎn)換到標記階段,地址簿1708將主視圖1702和詳細視圖1704標記為需要改變的數(shù)據(jù)。在最終標記子-階段中,改變的數(shù)據(jù)被寫入主視圖1702和詳細視圖1704。這些改變可在非常短的時間內(nèi)且以精細的粒度發(fā)生。例如,階段在用戶輸入每一字符之后且在幾分之一秒的瞬間內(nèi)循環(huán)。由此,改變看似為立即發(fā)生。本示例示出了如何對系統(tǒng)內(nèi)的方法執(zhí)行施加多層分階段約束。如果命令和改變在沒有分階段的情況下發(fā)生,則主視圖1702和詳細視圖1704可能在所有數(shù)據(jù)存儲改變數(shù)據(jù)之前被更新。因此,用戶可取決于試圖改變數(shù)據(jù)并更新用戶界面試圖的方法的順序來查看詳細試圖1704或主試圖1702中的混合結(jié)果。利用并發(fā)性域的多線程化如上簡要描述的,應(yīng)用程序和/或應(yīng)用程序組件可被約束于特定階段或特定階段域。根據(jù)本發(fā)明的各實施例,軟件應(yīng)用程序的組件可被劃分成單獨的域,用于在組件分區(qū)內(nèi)提供同步和線程隔離并用于提供組件分區(qū)之間的改進的并發(fā)操作。圖18示出了根據(jù)本發(fā)明的一個實施例的被配置成并發(fā)地執(zhí)行多個對象的一個示例系統(tǒng)。示例系統(tǒng)1800包括并發(fā)性域1801,它是都是在單個線程1802上執(zhí)行且不直接(例如,同步地)與外部對象1810通信的一個或多個單線程化對象1803的集合(或分區(qū))。內(nèi)部線程1802根據(jù)由并發(fā)性域1801施加的邏輯來執(zhí)行對象1803。內(nèi)部線程1802僅執(zhí)行并發(fā)性域1801內(nèi)的單線程化對象1803。內(nèi)部線程1802不執(zhí)行任何外部對象1810。根據(jù)一個實施例,同一線程無需在并發(fā)性域1801的整個生命期間都用作內(nèi)部線程1802。相反,當沒有對象要求在內(nèi)部線程1802上執(zhí)行時,用作內(nèi)部線程1802的線程可返回到線程池(未示出)。當再次要求一線程時,可從線程池中拉出一新線程以用作內(nèi)部線程1802。根據(jù)另一實施例,單線程化對象1803之一具有線程親合力(affinity),這意味著單線程化對象1803需要在同一線程上執(zhí)行。在該實施例中,同一線程在并發(fā)性域1801的整個生命期間用作內(nèi)部線程1802。根據(jù)一個實施例,此處更詳細討論的次要線程1804也從線程池中分配。仍參考圖18,系統(tǒng)1800還包括至少一個次要線程1804和至少一個外部對象1810。外部對象1810的實施例包括在一個或多個次要線程1804上執(zhí)行的任何對象。次要線程1804包括除在相關(guān)聯(lián)的應(yīng)用程序中執(zhí)行的內(nèi)部線程1802之外的任何線程。如上所述,圖18中所示的示例并發(fā)性域1801包括內(nèi)部線程1802和多個單線程化對象1803。這些單線程化對象1803僅使用內(nèi)部線程1802來執(zhí)行。并發(fā)性域1801內(nèi)的對象1803與程序中的其余次要線程1804和外部對象1810隔離。次要線程1804不執(zhí)行并發(fā)性域1801中包括的任何單線程化對象1803。每一外部對象1810被配置成在次要線程1804的一個或多個上執(zhí)行。外部對象1810與并發(fā)性域1801內(nèi)的單線程化對象1803異步地通信。通信包括在對象之間傳遞數(shù)據(jù)或由另一對象調(diào)用一個對象的方法(例如,或任務(wù))??绮l(fā)性域1801邊界的異步通信通過使用邊界對象1807來實現(xiàn)。每一并發(fā)性域1801與一個或多個邊界對象1807相關(guān)聯(lián)。這些邊界對象1807可被示為包圍并發(fā)性域1801的隔膜或帶門的墻。邊界對象1807的示例包括實現(xiàn)并發(fā)性域1801之間或并發(fā)性域1801和外部對象1810之間的自定義協(xié)議的數(shù)據(jù)連接器和對象。并發(fā)性域1801內(nèi)的單線程化對象1803使用一個或多個邊界對象1807來與外部對象1810異步通信。單線程化對象1803使用內(nèi)部線程1802來與邊界對象1807通信。邊界對象1807然后使用一個或多個次要線程1804來與外部對象1810通信。邊界對象1807由此跨并發(fā)性域1801的邊界來傳遞信息和調(diào)用。根據(jù)另一實施例,一個邊界對象1807在將信息傳遞給外部對象1810之前使用次要線程1804來與另一邊界對象1807通信。邊界對象1807用作并發(fā)性域1801的內(nèi)部線程與次要線程1804的每一個之間的接口。根據(jù)一個實施例,邊界對象1807使用次要線程1804從外部對象1810接收入站通信,并將該通信過濾給適當?shù)膬?nèi)部對象1803。此處將更詳細描述過濾方法。根據(jù)另一實施例,邊界對象1807使用內(nèi)部線程1802從內(nèi)部對象1803接收出站通信,并使用次要線程1804將該通信發(fā)送到適當?shù)耐獠繉ο?810。根據(jù)一個實施例,邊界對象可在內(nèi)部線程上向外調(diào)用外部對象,但是這樣做的邊界對象是處于約束之下的。即,允許邊界對象向外調(diào)用外部對象必須不會因此而導致無界限的延遲或死鎖。另一約束防止外部對象保持對內(nèi)部對象的引用,這防止并發(fā)性域在外部對象的控制下的直接重新進入。同步通信在第一對象在其上執(zhí)行的線程進入第二對象以執(zhí)行第二對象的方法時發(fā)生。外部對象1810不與并發(fā)性域1801內(nèi)的單線程化對象1803同步通信。因此,執(zhí)行外部對象1810的次要線程不直接調(diào)用或進入并發(fā)性域1801內(nèi)的單線程化對象1803。圖19示出了其中并發(fā)性域1901與外部對象1910交互的另一示例系統(tǒng)1900。異步通信的一個示例在外部對象1910和內(nèi)部對象1903之間示出。并發(fā)性域1901包括內(nèi)部線程1902、被配置成在內(nèi)部線程1902上執(zhí)行的單線程化對象1903、以及用于與外部對象1910通信的邊界對象1907。該系統(tǒng)1900的另一實施例包括多個邊界對象1907和多個單線程化對象1903。根據(jù)一個實施例,外部對象1910包括被配置成在兩個或多個次要線程1904上執(zhí)行的多線程化對象1905。多線程化對象1905的一部分1905A被示為在一個次要線程1904A上執(zhí)行,而多線程化對象1905的另一部分1905B被示為在另一次要線程1904B上執(zhí)行。根據(jù)另一實施例,外部對象1910包括被配置成在一個次要線程1904上執(zhí)行的多個多線程化對象1905或單線程化對象(未示出)。系統(tǒng)1900中的并發(fā)性域1901維護工作隊列1908。工作隊列1908是其上放置(例如,插入)任務(wù)(例如,對內(nèi)部、單線程化對象1903的方法的調(diào)用、數(shù)據(jù)更新以及其它可執(zhí)行方法)且從中移除任務(wù)的多元素數(shù)據(jù)結(jié)構(gòu)。根據(jù)一個實施例,任務(wù)僅以與布置它們相同的順序從工作隊列1908中移除;即,根據(jù)先進先出約束。根據(jù)另一實施例,放入工作隊列1908的任務(wù)被分配優(yōu)先級,且每一任務(wù)根據(jù)其優(yōu)先級來移除。傳入通信由邊界對象1907放入工作隊列1908中。這些放入的通信形成了工作項1911,它們是對與并發(fā)性域1901相關(guān)聯(lián)的內(nèi)部、單線程化對象1903或邊界對象1907的任務(wù)的執(zhí)行的請求(例如,啟用或調(diào)用)。形成工作項1911的請求可由外部對象1910或另一邊界對象1907傳送到邊界對象1907。例如,在圖19中,外部對象1910的多線程化對象1905請求邊界對象1907執(zhí)行任務(wù),如由箭頭1920所描繪的。邊界對象1907然后將包括該任務(wù)的工作項1911放到工作隊列1908的末端,如由箭頭1925所描繪的。根據(jù)另一實施例,多個邊界對象1907與并發(fā)性域1901相關(guān)聯(lián),且這些邊界對象1907中的一個或多個可將工作項1911放入工作隊列1908。根據(jù)又一實施例,內(nèi)部、單線程化對象1903請求邊界對象1907將工作項1911放入工作隊列1908以將任務(wù)執(zhí)行推遲到稍后的時間。根據(jù)一個實施例,為了在準備將新任務(wù)放入工作隊列1908時保存資源,邊界對象1907檢查工作隊列1908并確定排隊的工作項1911中的任一個是否包括相關(guān)任務(wù)。如果有相關(guān)任務(wù),則邊界對象1907可選擇性地將新任務(wù)與先前排隊的相關(guān)任務(wù)捆綁在一起作為一子任務(wù),而非將新任務(wù)作為全新的工作項1911來放置。仍參考圖19,根據(jù)一個實施例,并發(fā)性域1901包括分派器1909,用于將來自工作隊列1908的工作項1911分派給單線程化對象1903以供處理。分派器1909使用內(nèi)部線程1902來從工作隊列1908中移除工作項1911,并分派每一工作項1911以供在內(nèi)部線程1902上執(zhí)行。分派器1909調(diào)用包括在工作項1911中的任務(wù)。例如,在圖19中,分派器1909如由箭頭1930所描繪地分派來自工作隊列1908的工作項1911。工作項1911然后如由箭頭1935所描繪地在內(nèi)部線程1902上執(zhí)行。根據(jù)一個實施例,將工作項1911放入工作隊列1908不會迫使分派器1909運作。相反,工作項1911的執(zhí)行被推遲到由并發(fā)性域1901的頂層循環(huán)邏輯所規(guī)定的時間點。一旦工作項1911被放入工作隊列1908,內(nèi)部線程1902在如由分派器1909所確定的并發(fā)性域1901的下一適當循環(huán)中執(zhí)行所請求的任務(wù)。因此,外部對象1910不確定何時移除工作項1911以及因此的何時調(diào)用和執(zhí)行內(nèi)部、單線程化對象1903的任務(wù)。外部對象1910也不確定邊界對象1907何時在并發(fā)性域1901的內(nèi)部線程1902上執(zhí)行任務(wù)。一旦分派并完成了任務(wù),將出站結(jié)果作為回叫傳遞給邊界對象1907。邊界對象1907然后將該回叫傳遞給最初放置調(diào)用實現(xiàn)該結(jié)果的任務(wù)的工作項1911的外部對象1910?;亟械氖纠ㄖ甘救蝿?wù)完成的數(shù)據(jù)標志、方法調(diào)用等。圖20描繪了內(nèi)部、單線程化對象與外部對象之間的異步通信。根據(jù)本發(fā)明的一個實施例,示出了在外部對象2001與內(nèi)部、單線程化對象2009之間的異步通信期間發(fā)生的通信鏈2000。外部對象2001首先與邊界對象2003通信2002。該通信2002一般采用對與并發(fā)性域(未示出)相關(guān)聯(lián)的一個或多個任務(wù)的調(diào)用或調(diào)用請求的形式。盡管所請求的任務(wù)實際上是單線程化對象2009的任務(wù),但外部對象2001僅將該任務(wù)與并發(fā)性域或邊界對象2003相關(guān)聯(lián)。邊界對象2003然后與工作隊列2005通信2004。這一通信2004一般包括將工作項(未示出)放入工作隊列2005。工作隊列2005然后與分派器2007通信2006。這一通信2006一般包括分派器2007順序地分派放入工作隊列2005的每一工作項。最后,分派器2007與其任務(wù)被調(diào)用的內(nèi)部、單線程化對象2009通信2008。這一通信2008一般包括對內(nèi)部、單線程化對象2009的任務(wù)的調(diào)用。在另一實施例中,外部對象2001與并發(fā)性域的另一邊界對象(未示出)通信。以上參考圖18-20描述的跨并發(fā)性域邊界的異步通信保護了內(nèi)部、單線程化對象免遭重新進入問題。如將理解的,當在并發(fā)性域的頂層邏輯的控制下的對象(例如,內(nèi)部、單線程化對象或邊界對象)指示內(nèi)部線程重新進入同樣在該頂層邏輯控制下的另一對象時,發(fā)生內(nèi)部控制的重新進入。當不在并發(fā)性域的頂層邏輯的控制下的對象(例如,外部對象)指示內(nèi)部線程重新進入在該頂層邏輯的控制下的對象時,發(fā)生外部控制的重新進入。當內(nèi)部對象重新進入其自身或者同一并發(fā)性域中的另一對象時,發(fā)生內(nèi)部導致的重新進入。當由外部對象引起的事件影響到重新進入時,發(fā)生于外部導致的重新進入將從在并發(fā)性域的內(nèi)部對象中共同實施的邏輯中有效地移除了對重新進入的控制。結(jié)果是非確定性的重新進入?;仡^參考圖19,僅允許跨并發(fā)性域1901的邊界的異步通信保護了內(nèi)部、單線程化對象1903免遭外部控制的重新進入。例如,如果內(nèi)部、單線程化對象1903的執(zhí)行包括對外部對象1910的任務(wù)的調(diào)用,則內(nèi)部線程1902將進入與并發(fā)性域1902相關(guān)聯(lián)的邊界對象1907之一,并且將調(diào)用負責請求外部對象1910的任務(wù)執(zhí)行的任務(wù)。內(nèi)部線程1902然后返回到執(zhí)行內(nèi)部、單線程化對象1903的任務(wù)或執(zhí)行對來自工作隊列1908的工作項1911的分派。由于內(nèi)部線程1902不離開并發(fā)性域1901地進入外部對象1910,因此它不落在外部對象1910的控制之下。此外,如果允許內(nèi)部線程1902執(zhí)行外部對象1910的任務(wù),并且如果該任務(wù)的執(zhí)行包括對內(nèi)部、單線程化對象1903的另一任務(wù)的調(diào)用,則不允許內(nèi)部線程1902重新進入并發(fā)性域1901。相反,內(nèi)部線程1902將進入并發(fā)性域1901的邊界對象1907以調(diào)用負責放置工作項1911的任務(wù)?;蛘撸缟纤?,在某些特定約束下,邊界對象可在內(nèi)部線程上向外調(diào)用外部對象以調(diào)用任務(wù)。在調(diào)用任務(wù)之后,內(nèi)部線程1902返回到執(zhí)行外部對象1910的任務(wù)并隨后返回到執(zhí)行內(nèi)部、單線程化對象1903的第一個原始任務(wù)。換言之,內(nèi)部線程1902不執(zhí)行外部對象1910對第二任務(wù)的調(diào)用,直到第一任務(wù)完成,且直到由并發(fā)性域1901的分派器1909指示要如此做。現(xiàn)在參考圖21和22,描述了本發(fā)明的包括數(shù)據(jù)源的示例外部對象方面的各實施例。圖21示出了包括并發(fā)性域2101和數(shù)據(jù)源2112的系統(tǒng)2100,圖22示出了描繪并發(fā)性域2101的內(nèi)部線程2102與數(shù)據(jù)源2112的次要線程2104之間的接口的操作流程圖2200。在一個實施例中,次要線程2104包括多個次要線程2104。并發(fā)性域2101包括單線程化對象2103和分派器2109,且與邊界對象2107相關(guān)聯(lián)。并發(fā)性域2101維護表示要在并發(fā)性域2101的內(nèi)部線程2102上執(zhí)行的待決任務(wù)的工作隊列2108。在一個實施例中,數(shù)據(jù)源2112是數(shù)據(jù)庫。在另一實施例中,數(shù)據(jù)源2112是網(wǎng)絡(luò)。內(nèi)部線程2102和次要線程2104的執(zhí)行路徑在兩圖中示出。在圖21中,虛線箭頭描繪了在內(nèi)部線程2102上發(fā)生的任務(wù)執(zhí)行,而實線箭頭描繪了在一個或多個次要線程2104上發(fā)生的任務(wù)執(zhí)行。虛線和實線箭頭所涉及的標號對應(yīng)于關(guān)于圖22所執(zhí)行的操作或任務(wù),圖22示出了沿該線程(其上任務(wù)被執(zhí)行)排列的每一任務(wù)。仍參考圖21和22,該方法在開始框2201處開始,并且前進到操作2202,其中單線程化對象2103請求邊界對象2107調(diào)用與數(shù)據(jù)源2112相關(guān)聯(lián)的任務(wù)。該請求在并發(fā)性域2101的內(nèi)部線程2102上執(zhí)行。在操作2203中,分派器2109順序通過工作隊列2108并分派每一工作項2111。根據(jù)一個實施例,使用內(nèi)部線程2102以工作項2111被放入工作隊列2108的順序來分派這些工作項。例如,分派器2109以工作項1開始排列順序并以工作項7結(jié)束排列順序,假定在這期間沒有添加新工作項2111。任何新工作項2111將在工作項7之后添加。根據(jù)另一實施例,工作項2111根據(jù)所分配的優(yōu)先級值來分派。方法2202還通往方法2211,后者與操作2202同時執(zhí)行。在方法2211中,邊界對象2107調(diào)用與數(shù)據(jù)源2112相關(guān)聯(lián)的任務(wù)。該調(diào)用在次要線程2104之一上執(zhí)行。接著,該方法前進到操作2212,其中在次要線程2104的一個或多個上執(zhí)行數(shù)據(jù)源2112的任務(wù)。接著,操作2213包括數(shù)據(jù)庫2112將執(zhí)行結(jié)果作為回叫發(fā)回邊界對象2107。結(jié)果的發(fā)送在次要線程2104的一個或多個上發(fā)生。然后,在操作2214中,邊界對象2107將回叫作為工作項2111放入工作隊列2108。該放置在次要線程2104的一個或多個上執(zhí)行。從操作2214,該方法前進到操作2204。操作2203還導致操作2204。操作2204在分派器2109到達由邊界對象2107在操作2214中添加的回叫工作項2111時發(fā)生,該分派器在操作2203期間順序地執(zhí)行工作隊列2108中的工作項2111。分派器2109使用內(nèi)部線程2102來分派回叫。一旦分派了回叫,分派器2109在操作2205中繼續(xù)順序地分派工作隊列2108中的每一工作項2111。該方法在2206處結(jié)束。現(xiàn)在參考圖23和24,描述了本發(fā)明的包括次要并發(fā)性域的示例外部對象方面的各實施例。圖23示出了分別包括第一和第二并發(fā)性域2301、2321的系統(tǒng)2300,而圖24示出了其中第一并發(fā)性域2301與第二并發(fā)性域2321接口的操作流程圖2400。每一并發(fā)性域2301、2321分別包括內(nèi)部線程2302、2322、單線程化對象2303、2323以及分派器2309、2329。每一并發(fā)性域2301、2321分別與邊界對象2307、2327相關(guān)聯(lián),并維護表示要在內(nèi)部線程2302、2322上執(zhí)行的待決工作項2311、2331的工作隊列2308、2328。在圖23中,第一組虛線箭頭描繪了在內(nèi)部線程2302上發(fā)生的任務(wù)執(zhí)行,一組實線箭頭描繪了在次要線程2304的一個或多個上發(fā)生的任務(wù)執(zhí)行,而第二組虛線箭頭描繪了在第二內(nèi)部線程2322上發(fā)生的任務(wù)執(zhí)行。這些虛線和實線箭頭被示為執(zhí)行第一并發(fā)性域2301與第二并發(fā)性域2321之間的通信中所涉及的各種操作。這些箭頭所涉及的參照標號對應(yīng)于關(guān)于圖24執(zhí)行的操作或任務(wù)。仍參考圖23和24,該方法在開始框2401處開始,并前進到操作2402和2422。操作2422包括第二并發(fā)性域2321的分派器2329使用內(nèi)部線程2322來順序地分派工作隊列2328上的每一工作項2331。操作2402與操作2422并發(fā)地執(zhí)行。在操作2402中,第一并發(fā)性域2301的單線程化對象2303請求邊界對象2307調(diào)用第二并發(fā)性域2321的對象之一的任務(wù)。在一個實施例中,所請求的任務(wù)是第二并發(fā)性域2321的單線程化對象2323之一的任務(wù)。在另一實施例中,所請求的任務(wù)是與第二并發(fā)性域2321相關(guān)聯(lián)的邊界對象2327之一的任務(wù)。從操作2402,該方法前進到操作2403和2412。在操作2403中,第一并發(fā)性域2301的分派器2309順序地分派工作隊列2308上的每一工作項2311。在操作2412中,第一并發(fā)性域2301的邊界對象2307使用次要線程2304中的一個或多個來與第二并發(fā)性域2321的邊界對象2327通信。該通信包括調(diào)用任務(wù)的請求。然后,在操作2413中,第二邊界對象2327將所請求的任務(wù)作為工作項2331放入工作隊列2328。該放置是使用次要線程2304中的一個或多個被執(zhí)行。操作2413和操作2422都通往操作2423。在操作2423中,分派器2329到達并分派包括所請求的任務(wù)的工作項2331。該分派在第二并發(fā)性域2321的內(nèi)部線程2322上執(zhí)行。然后,在操作2424中,任務(wù)作為對第一并發(fā)性域2301中的單線程化對象2303的回叫而執(zhí)行。此時,該方法再次分裂,前進到操作2425和2414。在操作2425中,分派器2329繼續(xù)順序地分派工作隊列2328上的每一工作項2331。操作2414與操作2425并發(fā)地發(fā)生。在操作2414中,第二并發(fā)性域2321的邊界對象2327使用一個或多個次要線程2304來請求第一并發(fā)性域2301的邊界對象2307將回叫作為工作項2311放入工作隊列2308。接著,在操作2415中,邊界對象2307將該回叫放入工作隊列2308。該放置是在次要線程2304的一個或多個上被執(zhí)行。操作2404在第一并發(fā)性域2301的分派器2309到達放入工作隊列2308的回叫時發(fā)生。分派器2309使用第一并發(fā)性域2301的內(nèi)部線程2302來分派回叫?;亟性诓僮?405中執(zhí)行。接著,該方法前進到操作2406,其中分派器2309繼續(xù)順序通過工作隊列2308,按序分派每一工作項2311。該方法在2406處結(jié)束。系統(tǒng)的另一示例(未示出)包括彼此接口且與外部對象接口的三個或更多并發(fā)性域。這一系統(tǒng)根據(jù)與此處所描述的相同的操作來順序地運作。該系統(tǒng)中的每一并發(fā)性域包括內(nèi)部線程、一個或多個單線程化對象以及分派器。每一并發(fā)性域與至少一個邊界對象相關(guān)聯(lián)且維護一工作隊列??绮l(fā)性域邊界的所有通信都是異步的(例如,通過相應(yīng)的邊界對象、工作隊列和分派器過濾)。應(yīng)用程序描述語言如上簡要描述的,本發(fā)明的各實施例包括應(yīng)用程序描述(XAD)和應(yīng)用程序描述(XAD)引擎,用于提供以上參考圖3描述的應(yīng)用程序框架內(nèi)包括的諸如應(yīng)用程序304等所有應(yīng)用程序和組件的聲明性規(guī)則和描述。某些實施例的各方面涉及用于創(chuàng)作數(shù)據(jù)流程、數(shù)據(jù)綁定以及表征應(yīng)用程序的規(guī)則的聲明性或描述性語言。其它方面涉及在運行時處理或執(zhí)行該聲明性應(yīng)用程序的運行時引擎,即(經(jīng)由構(gòu)建器)創(chuàng)建查看和/或處理數(shù)據(jù)的對象的“應(yīng)用程序描述”。因此,開發(fā)者無需為進行數(shù)據(jù)處理的對象編寫實際的代碼,而是只需編寫最終被編譯和執(zhí)行的聲明性應(yīng)用程序文件。如以下將詳細討論的,這一系統(tǒng)提供了優(yōu)于對應(yīng)用程序編程的現(xiàn)有技術(shù)方法的眾多好處。對這一聲明性語言的使用通過聲明性地對應(yīng)用程序的數(shù)據(jù)建模、處理和轉(zhuǎn)化數(shù)據(jù)、用戶界面(UI)和UI與數(shù)據(jù)交互的方式而不同于對命令性語言的使用。本發(fā)明的各實施例涉及用于表征XML應(yīng)用程序框架(XAF)應(yīng)用程序的特定聲明性語言。該聲明性語言此處有時被稱為XAF應(yīng)用程序定義(XAD)。盡管此處所描述的大多數(shù)實現(xiàn)細節(jié)涉及對XML的使用,但本領(lǐng)域的技術(shù)人員將認識到可使用其它句法來實現(xiàn)本發(fā)明的各方面。如可以理解的,為提供聲明性應(yīng)用程序文件與執(zhí)行數(shù)據(jù)處理的實例化對象的配置之間的這一分隔,在一個實施例中,可使用一種平臺,諸如構(gòu)建和執(zhí)行應(yīng)用程序的平臺等。根據(jù)本發(fā)明的各方面,所使用的平臺此處被稱為XAF平臺,它是用于構(gòu)建和執(zhí)行這些軟件應(yīng)用程序的平臺。特別地,XAF也使用XML來統(tǒng)一地表示數(shù)據(jù),并且采用高度組件化的方法來構(gòu)建每一應(yīng)用程序。在一個實施例中,XAF利用了XML來提供強大的數(shù)據(jù)變換能力和豐富的數(shù)據(jù)。外部數(shù)據(jù)和應(yīng)用程序狀態(tài)都可使用XML的能力來訪問和處理。用戶界面和復雜數(shù)據(jù)流程可在XAD中定義。如所述的,XAD是用于創(chuàng)作XAF應(yīng)用程序的一種聲明性語言。圖25是與被創(chuàng)建來形成可執(zhí)行應(yīng)用程序的數(shù)據(jù)和對象有關(guān)的應(yīng)用程序描述的高級描繪。XAD用于創(chuàng)建聲明或描述諸如數(shù)據(jù)集或存儲2504、2506和2508等數(shù)據(jù)的應(yīng)用程序描述2502,使得在運行時,組件2501、2512和2514被創(chuàng)建來處理、查看和/或編輯該數(shù)據(jù),從而本質(zhì)上構(gòu)造了構(gòu)成執(zhí)行應(yīng)用程序的對象的配置。在此處的示例性實施例中,應(yīng)用程序描述2502被表達為一組聲明性構(gòu)造,諸如形式良好的XML。應(yīng)用程序描述2502因此描述了一個或多個對象2501、2512和2514應(yīng)如何在執(zhí)行應(yīng)用程序內(nèi)配置。本質(zhì)上,應(yīng)用程序描述2502用于計算應(yīng)用程序的配置而非應(yīng)用程序的結(jié)果,后者的計算由對象2510、2512和2514來完成。由于對象2510、2512和2514可由以非聲明性語言編寫的其它應(yīng)用程序使用,因此XAD通過對這些對象的重用而改進了應(yīng)用程序的開發(fā)。此外,XAD允許以傳統(tǒng)的靜態(tài)聲明性應(yīng)用程序定義時不可能的方式對應(yīng)用程序進行動態(tài)創(chuàng)建和修改,如以下將更詳細地討論。對于圖25中所示的數(shù)據(jù)2504、2506和2508,這些源可與文本數(shù)據(jù)存儲、SQL數(shù)據(jù)庫存儲、XML源、web服務(wù)源等有關(guān)。實際上,應(yīng)用程序描述2502被認為是以數(shù)據(jù)為中心,使得它是數(shù)據(jù)中心的。應(yīng)用程序狀態(tài)可被認為是另一“數(shù)據(jù)”源,且以與對象2510、2512和2514的配置在其上操作的更常規(guī)數(shù)據(jù)類似的方式來對待。開發(fā)者因此主要關(guān)注指定數(shù)據(jù)流程通過應(yīng)用程序的方式以及支配應(yīng)用程序如何響應(yīng)于該數(shù)據(jù)的規(guī)則。XAD提供了構(gòu)建和更改應(yīng)用程序的簡單且廉價的方式,這使得能達到不同軟件應(yīng)用程序適當位置(niche)和對新開發(fā)者的低復雜度阻礙的目標。使用所要求保護的本發(fā)明構(gòu)建的應(yīng)用程序不僅具有將數(shù)據(jù)流聚集和變換到應(yīng)用程序的能力,而且還具有選擇對數(shù)據(jù)類型最適當?shù)囊粋€或多個用戶界面的能力。對象2510、2512和2514表示被良好-分解的組件,諸如查看器、編輯器、變換器等。應(yīng)用程序描述可調(diào)用“預編程”組件和/或向集合添加新組件。對象具有被良好-定義的類型,因此相應(yīng)的XAD標簽和參數(shù)具有XAD語言中相應(yīng)的類型。XAD是強類型化的,且XAD編譯器靜態(tài)地檢測差錯。標簽和參數(shù)具有返回類型和基數(shù)約束(cardinalityconstraints)。另外,數(shù)據(jù)類型支持若干附加約束方案、轉(zhuǎn)換要求以及存取器可用性(存取器是用于XML數(shù)據(jù)的強類型化對象外觀(facade))。XAD不僅允許簡單地通過更改一個或多個文本文件來修改或增大現(xiàn)有應(yīng)用程序,而且還允許開發(fā)者約束修改和插件(可被添加到現(xiàn)有應(yīng)用程序的模塊,大致類似于瀏覽器插件)以保持安全性,以及如下更詳細描述的用戶模型集成。示例XAD應(yīng)用程序為理解XAD的眾多細微差別,尤其是XAD應(yīng)用程序描述,如應(yīng)用程序描述2502,將討論一個示例描述。表1示出了根據(jù)本發(fā)明的一個實施例的示例XAD應(yīng)用程序的源代碼。表1中的示例XAD應(yīng)用程序是相對簡單的,且構(gòu)想了許多其它復雜的XAD應(yīng)用程序。實際上,表1所示的示例具有顯示“HelloWorld”消息的唯一功能。表1示例XAD應(yīng)用程序描述如可以理解的,表1所示的示例包括若干XML標簽以描述處理數(shù)據(jù)所得的對象。第1行標識了XML的版本,而第2行標識了用于XAD應(yīng)用程序描述的系統(tǒng)標簽,這將在以下更詳細描述。第3-4行標識了XAF中可用的標簽的某些名字空間。出于本討論的目的,表1中的示例的主要部分是第8行所示的“Aplication(應(yīng)用程序)”標簽。應(yīng)用程序標簽是導致在運行時創(chuàng)建應(yīng)用程序?qū)ο蟮囊粋€實體標簽的示例,該應(yīng)用程序?qū)ο髤f(xié)調(diào)應(yīng)用程序并控制應(yīng)用程序功能的最高級別。類似地,第9行中的“Window(窗口)”標簽(實體標簽的另一示例)導致對窗口對象,即負責顯示應(yīng)用程序的框架的用戶界面實體的創(chuàng)建。在這一情況下,“Window”是“Application”的參數(shù)。最后,“TextBlock(文本塊)”實體,即作為第10行中的文本標簽的結(jié)果創(chuàng)建的所得的文本對象是在運行時創(chuàng)建的負責顯示文本(在這一情況下,為“HelloWorld”)的用戶界面實體。使用標簽來(經(jīng)由構(gòu)建器)創(chuàng)建對象在以下將更詳細地描述。以上示例僅被提供來示出一個更簡單的示例XAD應(yīng)用程序。在操作中,編譯并執(zhí)行表1所示的XAD應(yīng)用程序以創(chuàng)建如一般在圖26中示出的應(yīng)用程序、窗口和文本對象。即,圖26示出了根據(jù)本發(fā)明的一個特定實施例的應(yīng)用程序描述2602,它被執(zhí)行來處理數(shù)據(jù)時類似于圖25所示的描述2502和/或表1所示的XAD應(yīng)用程序。最初,開發(fā)者創(chuàng)作應(yīng)用程序描述2602。在一個實施例中,XAD文件2602的第一個標簽是“<sys:XAD>”。同樣,為了正確地操作,計算機系統(tǒng)能夠諸如通過安裝例如XAFSDK來訪問XAF或任何適當?shù)牡刃?。在發(fā)出應(yīng)用程序啟動命令之后,XAD2602被自動驗證,且在一個實施例中,被編譯成更有效的形態(tài)。編譯器或XAF引擎2604對XAD2602進行語法分析,并執(zhí)行實例化必要對象的被編譯了的形態(tài)。并且,引擎2604創(chuàng)建對象組件(也稱為實體)圖2612、2614、2616、2618并將它們連接在一起以創(chuàng)建最終處理數(shù)據(jù)的應(yīng)用程度2606。同時,引擎2604將各對象與必要的數(shù)據(jù)2608連接,即綁定。引擎2604還可被認為是配置服務(wù),因為它實例化對象并將對象連接在一起以創(chuàng)建應(yīng)用程序2606。應(yīng)用程序2606是連接組件2612、2614、2616、2618的圖。例如,應(yīng)用程序2606可具有一個或多個數(shù)據(jù)連接器實體2612。數(shù)據(jù)連接器實體2612標識將數(shù)據(jù)連接到系統(tǒng)并與可用的各種數(shù)據(jù)存儲通信的對象。另一類型的實體涉及UI連接器2614。UI連接器2614表示實際處理用戶界面特征,且實際上與用戶界面2620通信的對象。包括在應(yīng)用程序2606中的還有通常在將信息轉(zhuǎn)播到UI連接器之前提供數(shù)據(jù)的某種變換的變換2616,以及處理數(shù)據(jù)以執(zhí)行諸如修改數(shù)據(jù)等某一類型的動作的動作2618。以下描述創(chuàng)建必要組件的過程和將對象綁定到數(shù)據(jù)的過程的更多細節(jié)。如可從本討論中理解的,XAD2602中使用的標簽不用于代表特定對象,而是XAD標簽表示對象工廠(factory)。對象工廠是XAD結(jié)合其標簽構(gòu)建器類而使用來利用標簽中指定的參數(shù)構(gòu)建一個或多個實體的描述。引擎2604提供這些對象的實際創(chuàng)建。在一個實施例中,引擎具有對提供現(xiàn)有和/或可重用標簽和對象的某些細節(jié)的組件庫2622的訪問。因此,應(yīng)用程序2602使用標簽來定義,從而允許應(yīng)用程序的模塊化構(gòu)造。圖27示出了根據(jù)這一概念的組件之間的結(jié)構(gòu)上的相互關(guān)系。實體標簽2702(諸如表1的第8、9和10行所示的實體標簽)與實體2706相關(guān)聯(lián)。構(gòu)建器2704讀取實體標簽2702并映射它。構(gòu)建器2704實例化并連接與實體標簽相關(guān)聯(lián)的一個或多個對象(未圖示),并將實體標簽2702與實體2706相關(guān)聯(lián)。對開發(fā)者而言,看似為實體標簽2702被隱含地映射到其相關(guān)聯(lián)的實體2706,因為映射、實例化、編寫或連接以及初始化可在后臺發(fā)生。有了這些總則之后,將討論XAD的某些細節(jié)。關(guān)于語言的更多細節(jié),附加了作為附錄A的說明書,它被明確地結(jié)合在本說明書中。對象和工廠對象通過工廠(factory)來實例化,工廠可以是構(gòu)建器組件,或者是用XAD的片段定制的XAD引擎。工廠允許為諸如惰性求值(lazyevaluation)或虛擬化(節(jié)省無需立即實例化的對象的成本)等目的而推遲實例化。這是通過具有NewScope="True"屬性的參數(shù)來實現(xiàn)的。和通過sys:Switch構(gòu)造的常規(guī)實例化一起,工廠使得能夠動態(tài)數(shù)據(jù)相關(guān)應(yīng)用程序配置。在XAF平臺中的依賴性管理和重新確認的使用使得XAD引擎能夠在數(shù)據(jù)改變時按需自動重新配置應(yīng)用程序。這消除了常規(guī)上編寫應(yīng)用程序中常見且成本較高并易于出錯的用于命令性重新配置代碼的需求。XAD引擎允許以XAD語言來定義工廠,并自動構(gòu)造對應(yīng)的工廠實現(xiàn)??墒褂肵AD中的框架標簽來實例化各種對象,諸如圖25所示的對象2510、2512和2514。一種這樣的對象涉及也稱為數(shù)據(jù)連接器的“數(shù)據(jù)提供者”對象,其中數(shù)據(jù)提供者對象表示應(yīng)用程序可能使用的數(shù)據(jù)的源和操縱。數(shù)據(jù)提供者對象連接到數(shù)據(jù)源(通過該數(shù)據(jù)源,應(yīng)用程序可接收外部數(shù)據(jù))和數(shù)據(jù)變換(對傳入數(shù)據(jù)執(zhí)行的邏輯或算術(shù)運算)??墒褂肵AD中的框架標簽實例化的另一種類型的對象是用戶界面對象。用戶界面對象提供了與控制顯示和輸入處理有關(guān)的功能。用戶界面對象可用于觸發(fā)動作(見以下討論的動作)。還可使用XAD中的框架標簽實例化的又一種類型的對象是動作。動作提供了對用于用戶事件的句柄的“掛鉤”(附加到用戶界面元素的功能)。例如,點擊用戶界面上的按鈕將激活與該按鈕相關(guān)聯(lián)的動作對象。當用戶事件發(fā)生時,可使用對應(yīng)的動作來儲存和傳遞事件細節(jié)。事件細節(jié)可被儲存在主存儲器、硬盤驅(qū)動器或其它存儲器介質(zhì)上。事件細節(jié)使用以下討論的“scope(范圍)”變量來傳遞。例如,如果用戶事件是鼠標點擊,則可意味著在該事件的時刻儲存鼠標的x和y位置??稍谟脩羰录l(fā)生時儲存的其它細節(jié)包括但不限于,按下了哪個鍵、在該事件的時刻選擇了數(shù)據(jù)元素列表的哪一索引、在該事件的時刻選擇了表格的哪一行和/或列、在該事件的時刻時表格的哪些行和/或列對用戶是可見的等等。通過使用這些事件,可實現(xiàn)應(yīng)用程序功能。實體標簽如可從以上表1中所示的示例中理解的,XAD應(yīng)用包括對標簽的使用。在一個實施例中,一種標簽是“實體標簽”。諸如分組或選擇器標簽等其它標簽在以下將更詳細討論。實體標簽在運行時映射到公共語言運行時間(CLR)對象。對CLR對象的唯一限制是它必須(在一個實施例中)是XAF實體。為成為XAF實體,CLR對象從兩個基類,如“Microsoft.Xaf.Core.BaseTypes.EntityElement”或“Microsoft.Xaf.Core.BaseTypes.EntityComposite”之一中導出,并且粘附到由XAF定義的某些協(xié)議和合約。構(gòu)建器2704(圖27)負責實體的實際實例化,并且有時候被稱為“標簽構(gòu)建器”或“實體構(gòu)建器”。在一個實施例中,實體構(gòu)建器是用于創(chuàng)建實體和/或?qū)嶓w彼此連接的用戶定義的.NET類。實體構(gòu)建器用于實現(xiàn)原語XAD標簽。另外,實體構(gòu)建器是引擎2604和語言的自定義擴展之間的交互點,使得在一個實施例中,XAD語言特別地定義了對編寫實體構(gòu)建器的要求。關(guān)于標簽或?qū)嶓w構(gòu)建器的更多細節(jié)在明確結(jié)合在本說明書中的所附附錄A的節(jié)3.5中提供。示例性實體標簽在以上表1的第8、9和10行示出。例如,在第8行中,示出了應(yīng)用程序?qū)嶓w標簽。如上所述,該標簽導致協(xié)調(diào)應(yīng)用程序的實體的實例化,并控制最高級別的應(yīng)用程序功能。窗口實體標簽(表1的第9行)導致負責顯示應(yīng)用程序框架的用戶界面實體的創(chuàng)建。最后,文本實體標簽(表1的第10行)導致負責顯示文本(在這一情況下,為“HelloWorld”)的用戶界面實體的創(chuàng)建。如本領(lǐng)域的技術(shù)人員可理解的,可定義和使用許多其它實體類型。在使用諸如表1所示的應(yīng)用程序?qū)嶓w標簽、窗口實體標簽或文本實體標簽等實體標簽之前,在例如XAF平臺內(nèi)定義每一實體標簽。實際上,每一實體標簽具有對應(yīng)的標簽定義。每一標簽定義包含了足以最終將每一實體標簽映射到實體的信息。實體標簽通過形式的聲明來定義,例如,“Text(文本)”標簽定義如下開始“<sys:TagDefinitaionName="Text"...>”...并如下結(jié)束“</sys:TagDefinition>”。定義中包括的是新標簽的“名稱”,如“Text”,以及特定實體標簽的“類型”。實體標簽可被分類成各種類型,并且所有的實體標簽都具有類型。這些類型是可擴展集,并且真正對應(yīng)于與標簽相關(guān)聯(lián)的實體的CLR類型。由XAF框架使用的某些類型包括“sys:Data”、“sys:EventHandler”、“fwk:UIElement”以及“sys:Selector”。標簽是否添加到框架或系統(tǒng),通常取決于標簽是否以與核心語言相同的速率從內(nèi)部引擎接口和/或版本中提取。如果是,則標簽應(yīng)被添加到系統(tǒng),否則應(yīng)被添加到框架。類型在其定義中聲明。繼續(xù)以上提供的Text定義,標簽定義可如以下表2所示地擴展。表2包括類型的對Text實體標簽的定義在表2中,標簽定義指示名為Text的新實體標簽應(yīng)被創(chuàng)建為類型fwk:UIElement(指示UI元素類型實體的框架標簽)。Text標簽隨后可在可調(diào)用fwk:UIElement實體的任何地方使用。Text實體標簽的一個示例可以在表1中出現(xiàn)的HelloWorkd.xad示例中看到。參數(shù)化通常,XAD應(yīng)用程序描述中的每一實體標簽具有描述如何創(chuàng)建、連接或配置所得的對象或?qū)嶓w的某些參數(shù)。參數(shù)可以是對一個數(shù)據(jù)的引用,或者對工廠或?qū)ο蟮囊?。例如,范圍屬性可以與參數(shù)相關(guān)聯(lián)以指示該參數(shù)涉及工廠還是對象。如果參數(shù)要求某一類型的對象才適用,則該參數(shù)可用該類型來標記以進行類型一致性檢驗。這一類型檢驗確保應(yīng)用程序的執(zhí)行不會導致類型失配,而類型失配會導致不正確的計算。XAD允許為實體聲明參數(shù)的許多不同的方式。一種常見的形式在以下表3中示出。表3帶有參數(shù)的對Text實體的示例標簽定義最初,“Param”是XAD實施例中的保留名稱,并且用于定義參數(shù)。同樣,如表3中的省略號所指示的,也可將一個或多個其它參數(shù)添加到Text標簽定義。在本示例中,應(yīng)創(chuàng)建名為Text的類型UI元素的新實體。此外,應(yīng)創(chuàng)建類型“Data(數(shù)據(jù))”(更具體地,是“StringData(串數(shù)據(jù))”)的名為“FontFamily(字體家族)”的單個參數(shù)。所得的Text標簽可與靜態(tài)內(nèi)容串,如使得文本為Arial字體的“<sys:TextFontFamily="Arial".../”一起使用。重要的是,標簽定義參數(shù)對應(yīng)于與該參數(shù)具有相同名稱的標簽的實際實例內(nèi)的屬性?;蛘?,標簽可被定義為取其它實體的參數(shù),例如“<TextFontSize="25"><foo:RandomWordGeneratorParam="Text"/></Text>”。在一個實施例中,以上定義將使Text標簽的Text屬性使用由foo:RandomWordGenerator函數(shù)對象返回的值,并在屏幕上以25磅的字體呈現(xiàn)所得的值。在另一實施例中,該定義可被寫為“<TextFontSize="25"><Text.Text><foo:RandomWordGenerator/></Text.Text><Text>”。后一定義將實例化Text實體,并將其Text屬性定義為foo:RandomWordGenerator的值。在一個實施例中,參數(shù)本身可包含多個其自己的實體。表4示出了示例代碼部分設(shè)置參數(shù)。表4示例XAD片斷設(shè)置參數(shù)表4所示的代碼(第1行)定義了名為FlowPanel的UI元素并具有若干參數(shù),由此導致UI元素流的顯示。要顯示的該組UI元素可經(jīng)由表4中定義(第2行)的名為“Children”的單個參數(shù)來指定。即第2行示出了調(diào)用/描述第1行中定義的流面板的應(yīng)用程序描述??蓪AD中的每一實體指定一個默認參數(shù)。表5示出了定義其名稱為“Children”的默認參數(shù)的示例代碼行。如果在子標簽上沒有指定參數(shù)名,則該子標簽將與該參數(shù)相關(guān)聯(lián),其DefaultParam(默認參數(shù))屬性被設(shè)為“true”。表5默認參數(shù)示例數(shù)據(jù)綁定在一個實施例中,XAD支持數(shù)據(jù)綁定(將XML數(shù)據(jù)綁定到特別為該數(shù)據(jù)設(shè)計的對象)。因此,對象名稱可用于在指定參數(shù)時更具體地引用數(shù)據(jù)。不像靜態(tài)值(按照定義,對應(yīng)用程序的生存期保持恒定),數(shù)據(jù)綁定值可通過對數(shù)據(jù)綁定值的相關(guān)聯(lián)數(shù)據(jù)的修改來更新。在一個實施例中,這一修改可由應(yīng)用程序執(zhí)行。在另一實施例中,這一修改可由用戶或外部進程執(zhí)行。在一個示例性實施例中,行“<TextText="$TextValue"FontSize="25"/>”導致Text參數(shù)被分配值“$TextValue”。在這一實施例中,“$”是保留字符,且以此方式使用該字符在組件的創(chuàng)建和連接期間調(diào)用數(shù)據(jù)綁定。這一數(shù)據(jù)綁定導致對來自要綁定到這一實體標簽的另一源或?qū)ο蟮臄?shù)據(jù)的指向或關(guān)聯(lián)。數(shù)據(jù)綁定可用于引用文字數(shù)據(jù)。即,文字數(shù)據(jù)可使用sys:InlineData標簽來指定。例如,“<sys:InlineDataName="TextValue">HelloWorkd</sys:InlineData>”定義了一個內(nèi)聯(lián)數(shù)據(jù),即串“HelloWorld”。這一示例性文字數(shù)據(jù)標簽被給予名稱TextValue。因此,通過在XAD描述中使用名稱$TextValue,XAD代碼可綁定到文字數(shù)據(jù)標簽內(nèi)的數(shù)據(jù),并對類型sys:Data的任何參數(shù)的值使用它。數(shù)據(jù)綁定也可用于引用相對數(shù)據(jù)位置。例如,<TextText="$SomeLocation/myd:Employees/myd:Employee/myd:Name"/>使用了動態(tài)前綴,即“$SomeLocation”,之后是相對數(shù)據(jù)引用,即“myd:Employees”、“myd:Employee”和“myd:Name”,而不使用“$”字符。結(jié)果是對從附加有給定相對位置的$SomeLocation的值形成的絕對位置的數(shù)據(jù)綁定。另外,數(shù)據(jù)綁定可結(jié)合分組標簽來使用。例如,表6中的示例代碼(第1行)將MergeTreesTransform實體綁定到Resources分組標簽下的該組實體。表6到分組標簽或動作的數(shù)據(jù)綁定表6(第2行)示出了XAD允許將動作綁定到數(shù)據(jù)值。例如,以下定義將動作綁定到$ScratchData的值。按照定義,$ScratchData的初始值是“Bye”?!癕ouseLeftButtonDown”是類型“sys:EventHandler”的參數(shù)。對應(yīng)于“MouseLeftButtonDown”參數(shù)的動作在Text實體遇到左鼠標鍵按下事件的任何時刻被調(diào)用。這一事件使得SetTextValueAction被調(diào)用,這將<Greeting>元素的文本值改為“Caio”。同樣,右鼠標鍵按下事件將導致$ScratchData的值改為“AuRevoir”。在又一示例中,數(shù)據(jù)綁定允許應(yīng)用程序接收命令行參數(shù)。例如,表7中的示例代碼允許指定命令行參數(shù)。sys:Main標簽是應(yīng)用程序的入口點。表7命令行數(shù)據(jù)綁定表7中定義的應(yīng)用程序接受諸如“xadCommandLine.xad/TextData=Testing”等命令行參數(shù),其中CommandLine.xad是應(yīng)用程序名稱,TextData是參數(shù)名,Testing是值。在一個實施例中,可將多個參數(shù)以“xadApplicationName/參數(shù)名1=值1/參數(shù)名2=值2.../參數(shù)名n=值n”的形式傳入XAD。本領(lǐng)域的技術(shù)人員可以理解,盡管以上的示例性實施例使用串作為輸入值,但是命令行參數(shù)可以替換地或另外地包括字母數(shù)字值、文件名、圖像或其它資源位置等。同樣,命令行參數(shù)可被給予一默認值,以供在沒有為該參數(shù)指定命令行參數(shù)值時使用。數(shù)據(jù)源標簽在一個實施例中,外部數(shù)據(jù)通過DataSource標簽展示給XAD應(yīng)用程序。此外,可使用XmlFileDataSource標簽來建立應(yīng)用程序和XML文件之間的連接,使得后者可被應(yīng)用程序用作數(shù)據(jù)源。外部數(shù)據(jù)源可以按類似于由sys:InlineData標簽提供的內(nèi)聯(lián)數(shù)據(jù)的方式來使用。然而,外部數(shù)據(jù)源可使用XAD動作保存到盤,且因此其它用戶對數(shù)據(jù)的改變可在需要時由該應(yīng)用程序消耗。導出標簽定義XAD允許使用導出標簽定義來支持定義的抽象和重用。例如,在要求一系列12磅Verdana字體標題的應(yīng)用程序中,用戶可將諸如“<TextFontFamily="Verdana"FontSize="12"Text="headingtexthere"/>”等定義放置在要求標題的每一位置處。然而,如果要求上百或上千個標題,且每一標題可能不同,則導出標簽定義允許更大的指定效率。更具體地,可定義導出標簽定義且一個示例在表8中示出。表8導出標簽定義示例表8所示的定義將使得XAD創(chuàng)建類型fwk:UIElement的名為TitleText的新標簽。該標簽內(nèi)的Text參數(shù)被綁定到對$Text傳入的值,該值可對標題的每一實例化不同地傳入。作為另一示例,考慮表9所示的以下示例,其中第一行是XAD的樣本片斷,第二行示出了導出標簽定義以替換該XAD片斷的示例,而第三行示出了使用該導出標簽定義的實例化調(diào)用。表9示例片斷,導出標簽定義,示例實例化如表9所示,導出標簽可提高多次調(diào)用或?qū)嵗嗤棔r的功能性和簡單性。范圍和新范圍參數(shù)范圍參數(shù)為變化生存期的對象的某些子圖提供了定義的邊界,尤其是為這些實體的延遲和/或重復的實例化提供該定義的邊界。工廠是推遲和延遲調(diào)用實例化的手段。范圍變量提供了作為由調(diào)用該實例化的實體提供的參數(shù)的值。對范圍變量的使用的一個示例是允許接收不同的事件特性,諸如鼠標鍵按下事件。XAD使用新范圍參數(shù)以在應(yīng)用程序組件之間、對象之間、和/或其組合之間傳遞數(shù)據(jù)。在一個實施例中,可由父組件使用新范圍參數(shù)來將參數(shù)傳遞到新創(chuàng)建的子組件。由此,XAD允許用戶充分利用代碼重用。在一個實施例中,構(gòu)造了包括對每一列表條目中的數(shù)據(jù)的引用的列表實體。定義要對單個列表條目做什么的同一參數(shù)被應(yīng)用于每一新列表條目,從而允許使用單個參數(shù)或參數(shù)集來創(chuàng)建任意大的條目列表。此外,在父和子對象之間傳遞的參數(shù)同樣可被優(yōu)化。例如,父對象可經(jīng)由新范圍參數(shù)將列表索引傳遞給子對象,所述列表索引對應(yīng)于被傳遞到子對象的列表元素。引入新范圍的參數(shù)將“NewScope(新范圍)”屬性設(shè)為真(true)。例如,行“<sys:ParamName="..."NewScope="true".../>”通常用于將新屬性設(shè)為幀。新范圍參數(shù)可用于引入范圍內(nèi)的一個或多個變量。變量是隱式聲明的參數(shù)。變量連同新范圍參數(shù)的聲明一起來聲明,如可在表10中(第1行)提供的示例中所見的。如上所述,新范圍對要被多次實例化的任何實體引入。表10(第2行)示出了對這一工廠的定義表10新范圍參數(shù)在以上示例中(表10,第2行),由RepeatedChild參數(shù)引入的范圍具有名為DataContext的范圍變量。該變量被設(shè)為對應(yīng)于要實例化的子視圖的項。以上定義如表11(第1行)所示地應(yīng)用,假定List.xml包含表11(第2行)所示的XML。表11范圍變量的示例使用在表11所示的示例中,對每一列表項,F(xiàn)lowPanel實體將創(chuàng)建一對應(yīng)的Text實體。所得的Flowpanel實體將在監(jiān)視器上顯示雇員(Employee)A-H的列表。本領(lǐng)域的技術(shù)人員可以理解,每一行對應(yīng)于Text實體的一次實例化。每一實例化之間變化的是“DataContext”范圍變量的值。所得的模式被稱為重復器模式(repeaterpattern)。這是XAD中的數(shù)據(jù)集上的迭代的基礎(chǔ)。在一個實施例中,重復器模式可對多位迭代嵌套。附加參數(shù)附加參數(shù)是由父對象與子對象相關(guān)聯(lián)的參數(shù),該子對象可能不知道如何處理該參數(shù)。例如,作為父“drawing(繪圖)”對象的子對象的“triangle(三角形)”對象可能不具體知道如何處理“position(位置)”坐標,因為位置坐標涉及繪圖內(nèi)的一般位置且不具體涉及諸如三角形等形狀。附加參數(shù)允許父對象訪問與子對象相關(guān)聯(lián)的數(shù)據(jù)和/或功能。XAD基于父對象中所述參數(shù)的定義來檢驗附加參數(shù)以進行正確使用。表12(第1行)示出了一個示例性標簽定義。表12附加參數(shù)示例表12(第1行)中的XAD代碼定義定義了稱為DockPanel的實體,它包括稱為“Dock”的附加參數(shù),該參數(shù)可被稱為“DockPanel.Dock”。表12(第2行)示出了使用DockPanel實體的示例性XAD代碼。如表12所示,DockPanel.Dock被指定為每一Text實體的屬性,即使DockPanel.Dock不一定是Text實體的標簽定義中指定的參數(shù)之一。由于DockPanel.Dock是附加參數(shù),它結(jié)合Text實體來使用,但是實際上在表12(第1行)所示的DockPanel實體的聲明中定義。資源參數(shù)另一種類型的參數(shù)是資源參數(shù)。資源參數(shù)提供了儲存在對象分層結(jié)構(gòu)中沒有邏輯位置的對象的地方。資源參數(shù)可用于將任意實體的集合錨定在一給定實體之下。與資源參數(shù)相關(guān)聯(lián)的動作和狀態(tài)可貫穿整個應(yīng)用程序來使用。資源參數(shù)的一個示例性定義在表13中示出。表13示例資源參數(shù)UI元素可經(jīng)由上述XAD的數(shù)據(jù)綁定能力綁定到狀態(tài)和/或動作。結(jié)構(gòu)在XAD中,“結(jié)構(gòu)”是可作為一個名稱傳遞的一組實體。XAD中的結(jié)構(gòu)也可以是嵌套的。結(jié)構(gòu)和嵌套結(jié)構(gòu)的示例在表14中示出。表14嵌套結(jié)構(gòu)在本示例中,$ActionsAndData.Actions.Print和$ActionsAndData.Actions.Save綁定對類型sys:EventHandler的所有參數(shù)都是有效的。類似地,$ActionsAndData.RecentDocuments、$ActionsAndData.Preference.User和$ActionsAndData.Preferences.Enterprise對類型sys:Data的所有參數(shù)都是有效的。$ActionsAndData對簽名(Signature)app:ActionsAndDataSignature的所有參數(shù)都是有效的。$ActionsAndData.Actions對簽名app:ActionsSignature的所有參數(shù)都是有效的。最后,$ActionsAndData.Preferences對簽名app:PreferencesSignatures的所有參數(shù)都是有效的。部件清單(manifest)在一個實施例中,XAD使用“部件清單”來將應(yīng)用程序的各部分,如應(yīng)用程序描述集合在一起。部件清單是能夠由計算機處理的描述應(yīng)用程序的各方面的指定,例如應(yīng)用程序需要哪些文件、對象之間存在什么依賴性、以及什么用戶環(huán)境專用數(shù)據(jù)是應(yīng)用程序的一部分(諸如用戶本機語言的用戶界面元素文本、圖標等,與應(yīng)用程序操作的數(shù)據(jù)不同)。內(nèi)置標簽內(nèi)置標簽是預定義且向XAD開發(fā)者提供了重要能力的標簽。常規(guī)上,內(nèi)置標簽用“sys:”作為前綴。例如,這些內(nèi)置標簽可允許條件操作、重復操作以及對象的創(chuàng)建。一種這一類型的內(nèi)置標簽被稱為“動態(tài)實體”標簽,它可用于在數(shù)據(jù)描述內(nèi)改變要使用什么類型的對象。這允許在屏幕上對對象的配置進行實時修改。例如,響應(yīng)于用戶選擇一給定用戶界面元素,該元素的功能和/或用途可被實時更改。例如,一個輸出窗口可用于基于對“循環(huán)到下一應(yīng)用程序視圖”用戶命令的選擇來顯示來自任意多的不同應(yīng)用程序視圖的輸出。在一個實施例中,動態(tài)實體標簽允許如以下表15所示地按標簽名稱來進行動態(tài)實體實例化表15示例動態(tài)實體使用在表15所示的示例中,內(nèi)置實體“DynamicEntity(動態(tài)實體)”向開發(fā)者提供了動態(tài)定義實體的能力。在這一情況下,$DateTag解析到本地名稱。稱為“切換實體”的另一種類型的內(nèi)置標簽允許通過對一個對象或多個相關(guān)對象的條件構(gòu)造來動態(tài)地重新配置應(yīng)用程序。盡管XAD是聲明性語言,但是它仍具有足夠的表達力以允許對實體的條件構(gòu)造。提供了單個構(gòu)造以允許條件構(gòu)造Switch(切換)。切換實體標簽可由“cases(情況)”或“conditions(條件)”標簽來參數(shù)化。Cases可以被認為是類似于C#的switch,而Conditions類似于一組C#的if-else子句。在一個實施例中,對Cases和Conditions的使用是互斥的,這意味著Switch不能在其主體中混合Cases和Conditions。另外,在本實施例中,Cases可能僅在Switch為其Data(數(shù)據(jù))參數(shù)指定了值時使用,否則必須使用Conditions。使用Switch允許作者作為對切換求值的結(jié)果而有條件地返回1個或多個實體。表16示出了某些示例XAD數(shù)據(jù)(第1行),以及對切換的示例使用(第2和3行)。表16示例資源參數(shù)如可以理解的,表16的第2行示出了一個實施例中基于大于50.00美元的值來創(chuàng)建實體的句法。表16的第3行通過示出用于其它條件測試的測試塊實體進一步說明了這一示例。所得的視圖將顯示第1行中的所有元素項,即“Toaster”、“VCR”、“DVDPlayer”、“Receiver”和“Sub-woofer”。然而,“Toaster”將是Georgia粗體字體且是綠色,而“Receiver”將是Arial粗體字體且是紅色。切換連同依賴性跟蹤和重新確認一起允許動態(tài)重新配置的自動實現(xiàn)。動態(tài)重新配置將在以下更詳細討論??蚣軜撕瀀AD和XAF允許稱為框架標簽(縮寫為“fwk”)的另一種類型的標簽??蚣軜撕灴捎糜趧?chuàng)建作為應(yīng)用程序的一部分的對象??蚣軜撕灴捎糜谝脛幼?、數(shù)據(jù)源、變換和關(guān)聯(lián)管理器(各自在以下討論)。在一個實施例中,應(yīng)用程序調(diào)試也可經(jīng)由框架標簽來執(zhí)行。在最簡單的級別上,UI連接器提供了可視化XAF數(shù)據(jù)并響應(yīng)于修改該數(shù)據(jù)的事件的能力。任一特定UI連接器實際上擁有一UI連接器正在呈現(xiàn)的“元素樹”,即可被顯示的一組可視元素。與每一UI連接器相關(guān)聯(lián)的是將數(shù)據(jù)轉(zhuǎn)換成可視元素的代碼以及將事件轉(zhuǎn)換成編輯操作的代碼。在一個實施例中,UI連接器簡單地展示了客戶機平臺(諸如PresentationFoundation(WPF)元素)的特性和事件。此外,UI連接器提供了特定形式的數(shù)據(jù)綁定,從而將來自XAF數(shù)據(jù)層的數(shù)據(jù)綁定到WPF元素。不同的元素被設(shè)計成可視化不同類型的數(shù)據(jù)。例如,Image(圖像)元素可視化被位圖化的顯示數(shù)據(jù),Text(文本)元素可視化字串數(shù)據(jù),而ListBox(列表框)可視化可能是不同類數(shù)據(jù)的有序列表。某些元素,如ListBox和TextBox(文本框)也能可視化對該數(shù)據(jù)的“選擇”。選擇的概念基本上是另一數(shù)據(jù)輸入。一般而言,特定UI連接器被設(shè)計成對要可視化的特定類型數(shù)據(jù)起作用。如果兩個元素使用了完全相同的機制來接受被它們來可視化的內(nèi)容的輸入(或參數(shù)),則開發(fā)者可編寫單個UI連接器來處理這兩者。參數(shù)用于向UI連接器給予工廠對象,后者用于按需創(chuàng)建子對象。UI連接器通常向工廠提供了數(shù)據(jù)上下文。工廠通常是XAD的片段,它由XAD引擎包裝在對象中。表17示出了可被提供的一組UI連接器。表17示例內(nèi)置UI連接器一種類型的框架標簽(即關(guān)聯(lián)管理器)可用于將一對象與一數(shù)據(jù)結(jié)構(gòu)或數(shù)據(jù)結(jié)構(gòu)的元素相關(guān)聯(lián)。例如,列表關(guān)聯(lián)管理器可用于將一對象與一列表中的項相關(guān)聯(lián)。所得的列表項將是動態(tài)的,這表現(xiàn)在它將包含對象及其相關(guān)聯(lián)數(shù)據(jù)與靜態(tài)值相對的引用。操作中圖28示出了根據(jù)本發(fā)明的一個實施例由構(gòu)建器執(zhí)行的操作的操作流程,其中創(chuàng)建并設(shè)置對象以供使用。實例化過程2800使用以創(chuàng)建操作2802開始并以初始化操作2806結(jié)束的操作流程來執(zhí)行。一般而言,流程2800可由單個配置服務(wù)或由多個服務(wù)來執(zhí)行。創(chuàng)建操作2802創(chuàng)建對象。在一個實施例中,創(chuàng)建操作2802創(chuàng)建對象所需的數(shù)據(jù)結(jié)構(gòu)。在另一實施例中,創(chuàng)建操作2802還按需為該數(shù)據(jù)結(jié)構(gòu)分配存儲器。一旦創(chuàng)建操作2802創(chuàng)建了對象,連接操作2804即根據(jù)該對象與其它對象的關(guān)系將該對象連接到其它對象。在一個實施例中,構(gòu)建所創(chuàng)建的對象與一個或多個預先存在的對象之間的連接圖。創(chuàng)建-連接-初始化序列允許XAD引擎支持一組對象之間的循環(huán)連接。在數(shù)據(jù)和變換的情況下,這種循環(huán)是被禁止的,且XAD編譯器執(zhí)行某種檢驗來防止這種循環(huán)。由連接操作2804產(chǎn)生的連線或連接圖定義了對象之間的互連和相互關(guān)系。在一個實施例中,這些連接將保持,直到通過動態(tài)重新配置(以下討論)來更改,或直到對象被刪除。哪些連接是必須的是由引擎在執(zhí)行應(yīng)用程序標記代碼時確定的。在一個實施例中,連接操作2804將數(shù)據(jù)提供者對象連接到應(yīng)用程序。初始化操作2806初始化所創(chuàng)建的對象。在一個實施例中,初始化涉及將一個或多個非確定性值設(shè)為0或其它預定義值。在另一實施例中,初始化操作2806調(diào)用與對象相關(guān)聯(lián)的構(gòu)造器。在又一實施例中,初始化操作2806指示所創(chuàng)建的對象初始化其自身。本領(lǐng)域的技術(shù)人員可以理解,初始化操作2806也可執(zhí)行通常與對象初始化相關(guān)聯(lián)的其它操作而不脫離本發(fā)明的范圍。在一個實施例中,初始化操作2806基于給定對象是否包含要初始化的數(shù)據(jù)而有條件地發(fā)生。在一個實施例中,對象可基于條件用不同值來初始化。例如,以下表16中所示的定義將使得XAD在物品的價格超過$500時以紅色顯示在列表中,并且如果價格低于$100則以綠色顯示物品。表16示例XAD代碼在一個實施例中,引擎使用即時(just-in-time)編譯來執(zhí)行操作2802、2804和2806。在另一實施例中,預編譯應(yīng)用程序。在又一實施例中,使用預編譯和即時編譯的組合來實現(xiàn)性能和靈活性的平衡。XAD允許應(yīng)用程序被動態(tài)地重新配置。動態(tài)重新配置可由流入應(yīng)用程序的數(shù)據(jù)的改變或?qū)?yīng)用程序現(xiàn)有的數(shù)據(jù)的修改來觸發(fā)。圖29示出了在XAD的一個實施例中如何動態(tài)地重新配置應(yīng)用程序。監(jiān)聽者(listener)是計算機代理,它監(jiān)視應(yīng)用程序或應(yīng)用程序組的某些事件。XAD監(jiān)聽者監(jiān)視XAD應(yīng)用程序內(nèi)某些已注冊對象的數(shù)據(jù)的值的改變。注冊操作2902向這一監(jiān)聽者注冊對象及其數(shù)據(jù)。當數(shù)據(jù)值的改變在已注冊對象中發(fā)生時,由接收操作2904接收來自監(jiān)聽者的改變通知。標記操作2906然后標識依賴于改變的值的一個或多個數(shù)據(jù)值,并將它們標記為已受改變影響。分析操作2908分析改變的值對每一所標記的數(shù)據(jù)值的影響。基于這一分析的結(jié)果,確定操作2910確定是否有任何對象被改變的值變?yōu)闊o效。如果一個或多個對象被改變?yōu)闊o效,則流程通過“是”分支到移除操作2912,該操作移除一個或多個現(xiàn)在無效的對象。流程然后分支到確定操作2914。如果確定操作2910確定沒有對象被改變?yōu)闊o效,則流程通過“否”分支到確定操作2914。確定操作2914確定作為改變的值的結(jié)果是否要求任何新對象。如果要求一個或多個新對象,則流程通過“是”分支到創(chuàng)建操作2802(圖28),并且對象創(chuàng)建、連接和初始化將如上結(jié)合圖28所述地進行。如果確定操作2914確定不要求新對象,則流程通過“否”分支到示例性流程的結(jié)束。為簡化新對象的創(chuàng)建和無效對象的刪除,XAD能夠?qū)ο筮M行生存期管理。生存期域是XAD應(yīng)用程序中的重新配置單元。其生命跨度被彼此捆綁在一起(例如,第一對象在沒有第二對象存在的情況下可能沒有任何用途,而第二對象在沒有第一對象存在的情況下可能沒有任何用途)的對象被放置到同一生存期域中。在給定生存期域中可以有許多對象。當不再要求對象時,生存期域中的所有對象可通過引用要刪除的生存期域(與為了刪除可能引用生存期域中的成千上萬的單個對象形成對比)來容易地刪除。本領(lǐng)域的技術(shù)人員可以理解,給定生存期域中的對象無須在功能上相關(guān);相反,它們只需共享創(chuàng)建時間和相互依賴性,使得它們可被同時廢棄。在一個實施例中,XAD可結(jié)合應(yīng)用程序的動態(tài)重新配置來支持有條件地創(chuàng)建的對象。變化類型的對象因此可取決于數(shù)據(jù)值改變的特性來創(chuàng)建。圖30示出了根據(jù)本發(fā)明的一個實施例由創(chuàng)建操作2802(圖28)執(zhí)行的操作的操作流程。首先,確定操作3002確定是否有任何標簽要實例化。如果有標簽要實例化,則流程通過“是”分支到確定操作3004。如果沒有標簽要實例化,或者所有標簽都已被實例化,則流程通過“否”分支到連接操作2804(圖28)。確定操作3004確定標簽是否包含必須實例化的任何參數(shù)。如果不存在參數(shù)標簽,則流程通過“否”分支到操作3008。如果存在參數(shù)標簽,則流程通過“是”分支到實例化操作3006。實例化操作3006實例化由確定操作3004找到的參數(shù)。如上所述,參數(shù)用于描述如何創(chuàng)建、連接或配置工廠或?qū)ο?。如先前所描述的,參?shù)可包括工廠或?qū)ο蟮囊粋€或多個特性、對一個數(shù)據(jù)的引用、或?qū)α硪还S或?qū)ο蟮囊?。特性可以是靜態(tài)或動態(tài)的。處理操作3010根據(jù)其數(shù)據(jù)類型來處理標簽。存在若干不同種類的標簽,且由此由處理操作3010實現(xiàn)若干種可能的方法。原語標簽(實際對應(yīng)于一對象的標簽)是通過創(chuàng)建新對象來處理。在一個實施例中,所創(chuàng)建的所有對象都對應(yīng)于實體。某些標簽定義范圍邊界。這些標簽使得處理操作3010創(chuàng)建“工廠”,工廠可在稍后為實體的按需實例化而調(diào)用。當處理工廠時,創(chuàng)建一新的范圍域。通常可由實體檢查其依賴性信息,該信息在動態(tài)重新配置期間可以是有用的。處理操作3010通過創(chuàng)建切換工廠來處理切換標簽。這是一個工廠,它支持基于各種用戶指定條件的應(yīng)用程序控制的分支。該工廠可用于監(jiān)視各種條件,當滿足這些條件時將觸發(fā)應(yīng)用程序流中的分支。在一個實施例中,當由于作為動態(tài)重新配置的一部分來重新處理標簽而變得必須時,即時編譯被使用來修改對象。處理操作3010也可處理其它類型的標簽。例如,綁定標簽觸發(fā)處理操作3010創(chuàng)建工廠以指示某一參數(shù)值實際上是對某一其它實體的引用。這大致類似于過程語言中的指針。動態(tài)實體標簽允許要創(chuàng)建的實體的延遲的綁定。在一個實施例中,該延遲綁定被推遲到應(yīng)用程序運行時。在處理操作3010處理了標簽之后,流程返回到確定操作3002。在一個實施例中,可向XAD應(yīng)用程序添加插件(add_ins)。插件是可擴展給定應(yīng)用程序的基本特征集而無需升級應(yīng)用程序的自含式軟件包。插件允許在新特征或第三方擴展變得可用時遞增地添加它們,而無需經(jīng)歷可能昂貴的升級循環(huán)。XAD插件被打包在組合件(assembly)中。在一個實施例中,組合件通過部件清單(上文討論)中指定的靜態(tài)依賴項來加載。在一個實施例中,XAD應(yīng)用程序經(jīng)由可擴展性協(xié)議來與插件通信??蓴U展性協(xié)議可以在單獨的組合件中定義,使得該協(xié)議可由應(yīng)用程序和可開發(fā)該擴展的第三方兩者同時發(fā)布和引用??蓴U展性協(xié)議具有兩個部分。第一部分是元數(shù)據(jù)(Metadata)方案。元數(shù)據(jù)是描述數(shù)據(jù)的數(shù)據(jù)。在XAD的上下文中,元數(shù)據(jù)可用于描述由插件實現(xiàn)的特征。元數(shù)據(jù)可包括標簽名稱、要傳遞的參數(shù)、UI的人類-可讀文本等??蓴U展應(yīng)用程序定義了元數(shù)據(jù)方案(從插件所預期的),而插件提供了內(nèi)容。可擴展性協(xié)議的第二部分是標簽簽名(以上討論)。插件通過定義標簽來實現(xiàn)其特征。應(yīng)用程序使用這些標簽來訪問插件特征。應(yīng)用程序定義標簽簽名(標簽應(yīng)當導致什么類型的實體、標簽應(yīng)當取什么參數(shù)等等),而插件提供了標簽定義(標簽名稱和實際實現(xiàn))。標簽簽名因此大致類似于接口,而標簽定義大致類似于接口實現(xiàn)。在一個實施例中,XAD支持可經(jīng)由元數(shù)據(jù)標簽訪問的全局元數(shù)據(jù)樹。元數(shù)據(jù)樹是來自所有動態(tài)加載的組合件的所有元數(shù)據(jù)成份文件的聯(lián)合。在運行時,元數(shù)據(jù)樹在加載或卸載具有元數(shù)據(jù)成份文件的組合件的任何時刻被自動更新。發(fā)送適當?shù)母淖兺ㄖ?,使得?yīng)用程序可動態(tài)地更新其自身(如先前結(jié)合圖29所討論的)。元數(shù)據(jù)樹允許應(yīng)用程序發(fā)現(xiàn)要加載什么插件,并利用插件所提供的特征。在一個實施例中,插件定義了用于訪問插件所實現(xiàn)的特征的標簽。由于插件在編寫應(yīng)用程序時可能是不可用的,因此應(yīng)用程序作者可能無法知道并使用由插件定義的標簽。作者可能僅知道,且因此可能僅靜態(tài)地定義標簽簽名。實際標簽名稱和最終的參數(shù)值可由插件使用元數(shù)據(jù)來提供。由于元數(shù)據(jù)方案是應(yīng)用程序定義的可擴展性協(xié)議的一部分,因此元數(shù)據(jù)方案信息可由應(yīng)用程序訪問。應(yīng)用程序因此能夠讀取元數(shù)據(jù),并按照標簽名稱來動態(tài)地實例化實體。XAD支持用于此目的的DynamicEntity標簽。盡管已在語言中明確地對結(jié)構(gòu)特征、方法動作和包含這些動作的計算機可讀介質(zhì)描述了本發(fā)明,但是可以理解,所附權(quán)利要求書中定義的本發(fā)明不必限于所描述的具體結(jié)構(gòu)、動作或介質(zhì)。本領(lǐng)域的技術(shù)人員將理解落入本發(fā)明的范圍和精神之內(nèi)的其它實施例或改進。因此,公開了這些具體結(jié)構(gòu)、動作或介質(zhì)作為實現(xiàn)所要求保護的本發(fā)明的示例性實施例。本發(fā)明由所附權(quán)利要求書來定義。附錄A內(nèi)容1.緒論............................................................................711.1XAF原則.................................................................711.2XAF目標.................................................................711.3XAF應(yīng)用程序結(jié)構(gòu)和XAD的角色..............................................721.4規(guī)范結(jié)構(gòu)................................................................731.5規(guī)范約定................................................................742.語言概念........................................................................742.1HelloWorld例子.........................................................742.2大小寫敏感性............................................................752.3實體標簽................................................................762.4實體的基本參數(shù)化........................................................782.4.1用靜態(tài)串的參數(shù)化...................................................782.4.2用單數(shù)實體的參數(shù)化.................................................792.4.3用實體組的參數(shù)化...................................................812.4.4資源...............................................................832.4.5默認參數(shù)...........................................................832.4.6附加參數(shù)............................................................852.4.7內(nèi)聯(lián)數(shù)據(jù)............................................................872.5通過綁定參數(shù)化..........................................................882.5.1標簽的命名.........................................................882.5.2綁定到實體.........................................................892.5.3綁定到分組標簽.....................................................942.5.4綁定到標簽定義的形式參數(shù)...........................................952.5.5使用綁定來允許編輯.................................................972.6主標簽..................................................................992.6.1自動填充參數(shù).......................................................992.6.2命令行參數(shù)化.......................................................1012.7忽略的塊................................................................1022.8傳出參數(shù).................................................................1062.9白空格........................................................................1062.10結(jié)構(gòu).........................................................................1072.10.1單層結(jié)構(gòu)...............................................................1082.10.2嵌套結(jié)構(gòu)...............................................................1102.11樣式.........................................................................1112.11.1用于默認目的的樣式.....................................................1122.11.2Avalon的視覺樹的樣式化.................................................1152.11.3樣式化和視覺觸發(fā)器.....................................................1162.12設(shè)定范圍的參數(shù)...............................................................1162.12.1范圍變量...............................................................1162.12.2重復器模式.............................................................1192.12.3范圍相關(guān)的綁定限制.....................................................1222.12.4嵌套的重復器模式.......................................................1232.13參數(shù)繼承.....................................................................1272.13.1限制...................................................................1282.14條件參數(shù)化...................................................................1292.14.1Case...................................................................1302.14.2Condition..............................................................1312.14.3SwitchEntity...........................................................1312.14.4SwitchEntities.........................................................1332.14.5概要...................................................................1342.14.6選擇器和標簽定義.......................................................1362.15關(guān)聯(lián).........................................................................1382.16標簽文檔編制.................................................................1403.形式語言規(guī)范..........................................................................1413.1布爾屬性......................................................................1413.2限定名........................................................................1413.3關(guān)鍵字........................................................................1423.3.1<Xad>...................................................................1423.3.2<Doc>...................................................................1423.3.3<Description>...........................................................1433.3.4<Type>....................................................................1433.3.5<TagDefinition>...........................................................1443.3.6<Signature>...............................................................1453.3.7<ParamGroup>(<Xad>下).....................................................1453.3.8<Const>...................................................................1463.3.9<Param>...................................................................1463.3.10<OutParam>...............................................................1473.3.11<ParamGroup>(<Choice>下).................................................1483.3.12<ParamGroupRef>..........................................................1483.3.13<Choice>.................................................................1493.3.14<ParamDefaultValue>......................................................1493.3.15<ConstDefaultValue>......................................................1493.3.16<Entity>.................................................................1493.3.17<Function>...............................................................1503.3.18<Body>...................................................................1503.3.19<ScopeVariable>..........................................................1503.3.20<AttachedParam>..........................................................1513.4內(nèi)置實體........................................................................1523.4.1<InlineData>..............................................................1523.4.2<Binding>.................................................................1523.4.3<XPath>...................................................................1533.4.4<Mapping>.................................................................1533.4.5<DynamicEntity>...........................................................1533.4.6<AssociatedEntity>........................................................1543.4.7<AssociatedDataEntities>..................................................1543.4.8<SwitchEntity>............................................................1563.4.9<SwitchEntities>..........................................................1563.4.10<Case>...................................................................1573.4.11<Condition>..............................................................1573.5實體構(gòu)建器......................................................................1573.6動作............................................................................1604.公共框架實體.......................................................................1625.部署模型...........................................................................1625.1XAD應(yīng)用程序................................................................1625.2XAD組合件..................................................................1635.3組合件部件清單.............................................................1655.3.1部件清單標簽.........................................................1665.3.2示例部件清單.........................................................1675.4組合件依賴性...............................................................1695.5組合件綁定、加載和卸載.....................................................1705.6打包情形...................................................................1715.6.1單文件應(yīng)用程序.......................................................1715.6.2導出標簽的庫.........................................................1725.6.3原語標簽的庫.........................................................1766.插件模型...........................................................................1796.1插件是什么?...............................................................1796.2XAD插件模型................................................................1796.2.1組合件的動態(tài)加載.....................................................1806.2.2元數(shù)據(jù)-驅(qū)動的可擴展性協(xié)議............................................1806.2.3動態(tài)實體實例化.......................................................1816.3插件情形...................................................................1816.3.1FileExtensionProtocol組合件..........................................1826.3.2File組合件...........................................................1846.3.3SmartFilesAddIn組合件................................................1867.附錄A代碼編寫約定................................................................1877.1用于System名字空間的“sys”前綴............................................1887.2名字的Pascal外包裝.........................................................1887.3簽名名字必須以“Signature”結(jié)束............................................1887.4“Set”參數(shù)的名字必須以“s”結(jié)束...........................................1887.5“Singular”實體標簽的名字必須不以“s”結(jié)束................................1887.6選擇器標簽的名字必須以“Selector”結(jié)束.....................................1887.7Param(如果指定)必須是實體的第一個屬性......................................1887.8Name(如果指定)必須是實體的Param(如果指定)之后的第一個屬性...................................................................1881.緒論XAD(XAF應(yīng)用程序定義)是一種用來制作XAF應(yīng)用程序的聲明性語言。XAD的UI組合方面盡可能地與XAML相同。XAD所支持的其它特征大多數(shù)面向XAF平臺的數(shù)據(jù)綁定特征。盡管XAD可使用多種格式來表示,但其主要表示是用Xml的。這允許與XAML的強嚙合。使用Xml的另一個優(yōu)點是XAD解析器以及XAD開發(fā)工具可直接處理XAF的固有數(shù)據(jù)表示(Xml)。XAD就XAD開發(fā)人員無需執(zhí)行任何顯式編譯步驟而言是“經(jīng)翻譯的”。這沒有排除出于性能原因在“JIT編譯”幕后進行的一些編譯。1.1XAF原則XAF是用于建立以大大縮減的時間上市的“辦公室類”應(yīng)用程序的平臺。XAF的核心原則是·將Xml用作統(tǒng)一數(shù)據(jù)表示·是建立應(yīng)用程序的一種高度組件化的方法·強大的數(shù)據(jù)轉(zhuǎn)換能力·將Avalon用作基礎(chǔ)表示層的豐富組合視圖1.2XAF目標因為XAD被用來制作XAF應(yīng)用程序,所以XAD的目標基于核心XAF原則建立·將Xml用作外部數(shù)據(jù)和應(yīng)用程序狀態(tài)的統(tǒng)一數(shù)據(jù)表示·與Xml和非Xml數(shù)據(jù)源的無縫和動態(tài)數(shù)據(jù)綁定(通過非Xml數(shù)據(jù)源的Xml表示)·復雜數(shù)據(jù)流的聲明性定義·使用1)帶附加數(shù)據(jù)綁定結(jié)構(gòu)的類XAML語法、或2)XAML本身對UI的聲明性定義·數(shù)據(jù)如何進行變換、顯示和交互的基于規(guī)則的聲明性定義·強類型化和高級靜態(tài)檢查·具有最小“內(nèi)置”關(guān)鍵字集的高級擴展·漸進的抽象級別·就以下方面而言足夠豐富以指定“辦公室類”應(yīng)用程序о廣度和深度о性能о質(zhì)量1.3XAF應(yīng)用程序結(jié)構(gòu)和XAD的角色XAF應(yīng)用程序是使用不同于傳統(tǒng)的Windows應(yīng)用程序編程技術(shù)的技術(shù)來構(gòu)建的。大多數(shù)現(xiàn)有的Windows應(yīng)用程序開發(fā)技術(shù)依賴于開發(fā)人員編寫代碼來控制應(yīng)用程序的執(zhí)行流。開發(fā)工具可包括用聲明性方式設(shè)計對話框和UI圖元,但開發(fā)人員最終負責執(zhí)行流的可視設(shè)計程序。開發(fā)人員必需編寫處理應(yīng)用程序狀態(tài)的事件處理程序和數(shù)據(jù)結(jié)構(gòu)。開發(fā)人員還負責管理數(shù)據(jù)結(jié)構(gòu)與表示它們的可視元素之間的映射。所有這些都包括大量的各個應(yīng)用程序彼此不同(盡管有相似的底層模式)的命令性應(yīng)用程序代碼。XAF采用了一種不同的創(chuàng)作應(yīng)用程序的方法。XAF聲明性地對應(yīng)用程序的數(shù)據(jù)、用戶界面、以及UI與數(shù)據(jù)交互的方法建模。核心設(shè)計原則是視圖-數(shù)據(jù)分離。可將XAF應(yīng)用程序視為主要是聲明性的,但按需插入了命令性代碼小段。XAF應(yīng)用程序被認為是以數(shù)據(jù)為中心的;除了應(yīng)用程序以數(shù)據(jù)為中心之外,所有應(yīng)用程序狀態(tài)也被視為數(shù)據(jù)。開發(fā)人員主要關(guān)心的是數(shù)據(jù)流過應(yīng)用程序的方法、以及管理應(yīng)用程序如何對數(shù)據(jù)作出響應(yīng)的規(guī)則。用于動態(tài)數(shù)據(jù)綁定的實際基礎(chǔ)結(jié)構(gòu)不是開發(fā)人員所關(guān)心的,并由XAF在外面提供。1.4規(guī)范結(jié)構(gòu)盡管本規(guī)范中的一部分后面章節(jié)可用作熟練的XAD作者的獨立的參考,但一般而言這些章節(jié)是相互依賴而建立的。2.語言概念通過普通代碼樣本說明核心語言概念和結(jié)構(gòu)。盡管語言關(guān)鍵字和通用框架標簽在樣本中大量使用,但它們僅在后面章節(jié)中形式地定義。3.形式語言規(guī)范所有語言關(guān)鍵字的形式定義(語言關(guān)鍵字可被視為是“內(nèi)置”于語言內(nèi)的標簽)。本節(jié)還包括XAD可擴展機制(即第三方可定義其自己的標簽)的形式定義。4.公共框架實體討論由標準XAD框架提供的最常用標簽。這些是可由第三方使用XAD的可擴展機制構(gòu)建的標簽。框架標簽有助于使用推薦設(shè)計模式和最佳實踐來構(gòu)造應(yīng)用程序。5.部署模型XAD的基于組合件-部署模型的形式定義和示例性討論。6.插件模型XAD部署模型可如何被用作指定插件的聲明性模型的說明性討論。附錄A代碼編寫約定建議的XAD代碼編寫約定的列表。標準的XAD框架符合這些約定。第三方可選擇采用這些約定的部分或全部。1.5規(guī)范約定在XAD內(nèi)使用名字空間完全與W3C的Xml名字空間規(guī)范(http://www.w3.org/TR/REC-xml-names/)兼容。本規(guī)范在所有代碼樣本中使用特定統(tǒng)一的名字空間約定。所有帶“sys”前綴的標簽都是居于“XAD系統(tǒng)”名字空間內(nèi)的標簽。系統(tǒng)名字空間中的標簽被嵌入語言中并可被視為語言保留關(guān)鍵字。所有代碼樣本的默認名字空間是“XAD標準框架”。在本規(guī)范中,所有沒有名字空間前綴的標簽都可被標識為屬于標準框架。在其它情形中提供了fwk名字空間,且fwk名字空間應(yīng)當與屬于XAD標準框架的標簽相關(guān)聯(lián)。所有代碼樣本都順從于附錄A中的編碼約定。2.語言概念本節(jié)通過普通代碼樣本來說明核心XAD語言概念和結(jié)構(gòu)。在后面章節(jié)中將提供具有更綜合情形的更大代碼樣本。盡管語言關(guān)鍵字和通用框架標簽已在樣本中大量使用,但它們僅在后面章節(jié)中形式定義。2.1HelloWorld例子XAD代碼必須總是形式良好的Xml。XAD文件的第一個標簽被要求為<sys.Xad>。該文件通常(但并非必需)具有.xad擴展名。HelloWorld.xad在安裝了XAFSDK之后,“xad.exeHelloWorld.xad”將導致該簡單應(yīng)用程序的執(zhí)行。對XAD代碼沒有顯式編譯步驟。XAD在XAD代碼第一次執(zhí)行時自動驗證(并可能編譯,盡管這并不會在當前進行)。驗證步驟失敗的XAD不能運行,直到必要的編碼錯誤被修復。以下是HelloWorld.xad應(yīng)用程序的屏幕截圖。將使用迎合在問題中該概念的XAD小樣本來討論各個語言概念。列示HelloWorld例子的主要目的是提供與XAD外觀相關(guān)的某類基本上下文。2.2大小寫敏感性寫成以下與寫成以下<text>是不同的。2.3實體標簽并非XAD中的所有標簽都是實體標簽(有兩類稱為“分組標簽”和“選擇器標簽”的其它標簽——它們是將在后面討論中定義的實體標簽的微小變型)。然而,實體標簽是最常見和最重要種類的XAD標簽。為了成為一個XAF標簽,CLR對象必須·從以下兩個基類之一導出оMicrosoft.Xaf.Core.BaseTypes.EntityElementоMicrosoft.Xaf.Core.BaseTypes.EntityComposite·附著于http://xafteam/xafenv/doc/Platform/CoreComponents/Dev/DevIntroToEntityDomains.doc中定義的特定協(xié)議和契約。標簽構(gòu)建器類是負責實體(工廠模式)的實際實例化以及實體的參數(shù)化的類。該標簽構(gòu)建器實際上是僅對框架擴展器感興趣的實現(xiàn)細節(jié)。在HelloWorld樣本中有3個實體標簽(Application、Window和Text)這三個實體標簽的每一個都導致在執(zhí)行應(yīng)用程序時創(chuàng)建一實體?!pplication實體是“協(xié)調(diào)”應(yīng)用程序并控制最頂層視圖的根級實體?!indow是負責顯示應(yīng)用程序框架的UI實體。·Text是負責顯示文本(在該情形中是“HelloWorld”)的UI實體。實體標簽通過聲明形式來定義,例如Text標簽定義如下所示地開始實體標簽可被分成各種類型。這些類型是一可擴展集并實際上對應(yīng)于與標簽相關(guān)聯(lián)的實體的CLR類型。大量由標準框架使用的類型的一些示例是sys:DataSys:EventHandler、fwk:UIElement和Sys:Selector。一般而言,將標簽添加到Framework或System名字控件之間的區(qū)分基于以下準則1.如果a.標簽由內(nèi)部引擎接口簽發(fā),b.版本具有與核心語言相同的進度則添加到System2.如果a.不由內(nèi)部引擎接口簽發(fā),b.版本不具有與核心語言相同的進度則添加到Framework實體的類型在其定義中聲明,接著是Text標簽,其類型在其標簽定義中指定如下2.4實體的基本參數(shù)化在前面章節(jié)中,我們確定實體標簽導致對象(更具體地是XAF實體)在運行時創(chuàng)建。然而,對于有用的對象,它需要某種有意義的參數(shù)化。本節(jié)覆蓋XAD實體的最基本形式的參數(shù)化。2.4.1用靜態(tài)串的參數(shù)化XAD允許聲明實體參數(shù)的許多不同方法。一種常見的形式是該聲明指示Text實體具有類型為“Data”、更具體地為“StringData”的名為“Text”的參數(shù)。Text實體的實際實例看起來類似于在后一節(jié)中,將介紹<sys:InlineData>標簽并將討論可如何表達以“./”、“$”開始的或完全是“.”的靜態(tài)串。2.4.2用單數(shù)實體的參數(shù)化在前面的示例中,選擇使用硬編碼串或靜態(tài)串來指定TextUI元素的文本。有可能改為用產(chǎn)生串的實體來參數(shù)化Text元素??紤]產(chǎn)生隨機串的隨機字連接器實體(列出隨機字體族(RandomFontFamily)的聲明主要是為了強調(diào)Type屬性與Text的FontFamily參數(shù)的相應(yīng)Type屬性相匹配。)用另一個實體參數(shù)化的FontFamily看起來類似于這可被讀作“將隨機字體族實體用作Text實體的有效的FontFamily參數(shù)”。這僅僅暗示了用戶定義參數(shù)不能被命名為“Param”。寫成以下是非法的為了更好地理解用其它實體對實體的參數(shù)化,考慮在實體分層結(jié)構(gòu)中具有一額外層的以下示例XmlFileDataSource實體用包含一數(shù)字列表的Xml文件的名稱來參數(shù)化。FileConnector實體可被視為產(chǎn)生了一數(shù)字列表。HighestValueTransform用一列表(在本情形中由XmlFileDataSource提供)來參數(shù)化。HighestValueTransform產(chǎn)生具有最高值的列表-項。然后,Text元素用由HighestValueTransform產(chǎn)生的列表-項來參數(shù)化(只要該列表項的類型為sys:Data且目標類型為fwk:String,它就可由Text耗用)。以下示圖有助于說明在此發(fā)生的嵌套數(shù)據(jù)流另一種編寫的方法是不使用Param屬性;這通常更易于理解如從以上Xad中可看到的,使用Param句法使Xad應(yīng)用程序能更為簡明。然而,使用該語法是樣式而非功能的問題。2.4.3用實體組的參數(shù)化迄今為止所關(guān)注的都是單數(shù)參數(shù)化。單數(shù)參數(shù)是最多取一個實體的參數(shù)。然而,聲明取一個以上實體的參數(shù)是可能的??紤]如其名稱所暗示的,F(xiàn)lowPanel(流式面板)元素顯示UI元素的流。要“流動”的顯式UI元素組可通過名為“Children”(孩子)的參數(shù)來指定。FlowPanel實例可被指定為在FlowPanel.Childen分組標簽下指定的實體組對應(yīng)于FlowPanel的“Children”參數(shù)。所得示圖看起來類似于ChrisHackmannVladoHristovWilliamAitken如果對于一FlowPanel只指定了一個子UI元素,則寫成如下仍然有效注意,將“Param”用于取組的參數(shù)是有效的(只要僅指定一個實體即可)以下也是有效的寫成如下也是可能的…………使用XQuery是有效的,因為它被用作FlowPanel的FlowOrientation參數(shù)的值(由Param=“FlowOrientation”表示)。如果Param=“...”被省去,則這會變成無效的Xad。2.4.4資源存在在所有實體上得到隱式支持的名為“Resources”的特定參數(shù)。唯一例外是不支持Resources的sys:InlineData。Resources參數(shù)被用來將任意實體組錨定在給定實體之下。Resources參數(shù)常常在應(yīng)用程序的最高級中用作動作和狀態(tài)的“摸彩袋”。這些動作和狀態(tài)然后在整個應(yīng)用程序中使用,例如UI元素綁定到狀態(tài)和/或動作的方法將在討論XAD綁定結(jié)構(gòu)時變得顯而易見。有關(guān)數(shù)據(jù)連接器的“Name”屬性和動作也將在綁定的上下文中說明。2.4.5默認參數(shù)迄今為止已論及XAD中兩種指定參數(shù)的方法;使用“Param”屬性和使用分組標簽。然而,HelloWorld樣本兩者都不使用原因是HelloWorld樣本依賴于“默認參數(shù)”。它可被重寫如下應(yīng)用程序的標簽定義包含類似以下的一行回想以上的FlowPanel示例這無需分組標簽(即FlowPanel.Children)就可重寫,因為對于FlowPanel實體“Children”被指定為默認參數(shù)2.4.6附加參數(shù)迄今為止我們確定實體可如何聲明一閉合參數(shù)組?,F(xiàn)在考慮以下XAD片段所得視圖看起來有些類似于如下Text實體被指定為DockPanel(??棵姘?實體的“Children”參數(shù)?;叵氩恍枰纸M標簽,因為Children是DockPanel實體的默認參數(shù)。注意,有趣的是“DockPanel.Dock”被指定為每個Text實體的屬性。然而,“DockPanel.Dock”不是在標簽定義中對Text實體指定的參數(shù)之一。回想直到現(xiàn)在,標簽的實例僅可使用在其相應(yīng)標簽定義中被定義為參數(shù)的屬性?!癉ockPanel.Dock”是附加參數(shù)的一個示例。實際上,它在聲明DockPanel實體時定義這就是說,對于被指定為Children參數(shù)一部分的每個UI元素,有可能指定名為DockPanel.Dock的附加參數(shù)。附加參數(shù)的(通過Xad引擎)的技術(shù)限制(不違反任何已知Vl情形)是不能指定非單數(shù)附加參數(shù)。例如,寫成如下是非法的(TargetType定義底層的ManagedAvalon類型,即定義用于“Dock”附加param的Avalon類型。)術(shù)語附加參數(shù)源自參數(shù)由實體的父親(而非實體本身)“提供”或“附加”的事實。此外,DockPanel.Dock句法用來將參數(shù)的性質(zhì)標注為一附加參數(shù)。第一方面,DockPanel定義提供該參數(shù)的實體。同時第二方面,Dock定義在DockPanel的標簽定義內(nèi)定義的附加參數(shù)的名稱。2.4.7內(nèi)聯(lián)數(shù)據(jù)在迄今為止的示例中,已經(jīng)由屬性指定了簡單的靜態(tài)串,或依賴于數(shù)據(jù)源將更復雜的數(shù)據(jù)引入XAD。InlineData(內(nèi)聯(lián)數(shù)據(jù))實體是可用于將簡單和復雜的數(shù)據(jù)直接嵌入XAD中的類型為“sys:Data”的System實體。代替寫成以下XAD有可能將來自Data.xml的數(shù)據(jù)直接嵌入XAD也有可能使用InlineData實體來指定簡單的文本值(盡管屬性句法會簡明得多)。對于諸如以“$”或“.”開頭的字符串的某些邊緣條件,InlineData實體是直接在XAD內(nèi)指定串的唯一方法。所得視圖顯示$5001)(據(jù)TonyW所言)要求探究容易地避開簡單字符‘$’和‘.’的思路。在‘$’情形中,看起來可使用‘$$’??磥頉]有任何容易的避開‘.’的方法。2.5通過綁定參數(shù)化2.5.1標簽的命名這僅僅暗示用戶定義的參數(shù)不能被命名為Name。寫成如下是非法的我們尚未討論選擇器標簽,但現(xiàn)在該語句暗示所有實體和分組標簽可被命名。該命名純粹是用于允許綁定(又名實體共享)的目的。例如我們尚未引入范圍的概念,但為便于討論,將某些參數(shù)視為引入一新范圍就足夠了。該語句表示,如果在標簽定義的主體內(nèi)沒有這樣的“范圍引入”參數(shù),則名字在標簽定義的主體內(nèi)必須唯一。如果在一標簽定義內(nèi)有多個范圍,則放松名字唯一性限制。名字僅在給定范圍中必須唯一。這在討論范圍參數(shù)時應(yīng)當變得更為清晰。2.5.2綁定到實體對一公共數(shù)據(jù)源,考慮兩個視圖。在XAD方面,這將涉及3個實體2個UI元素實體和一共享的數(shù)據(jù)源實體。在迄今為止的討論中,在實體與它們用之參數(shù)化的實體之間總是有一對一的映射。然而,實體的共享是可以理解的常見情形。XAD具有實現(xiàn)該情況的必要構(gòu)造這表示以下將是非法的BeepCommand實體的類型是“sys:EventHandler”,但Text參數(shù)的類型是“sys:Data”。在具有表(Table)和樹(Tree)的以上示例中,MyTable.xml具有以下形式Tree可耗用任何樹,但Table要求表形的數(shù)據(jù)(即以上要求數(shù)據(jù)的情形)。現(xiàn)在考慮如果Table.xml改為包含以下內(nèi)容將會發(fā)生什么該Table將以綁定到非表數(shù)據(jù)(<SearchResult>標簽)結(jié)束。為了解決該失配,Table對其Table參數(shù)的綁定將必須重新寫為該綁定解釋為“將Table的Table參數(shù)綁定到由名為SharedDataSource的實體返回的Xml樹內(nèi)的myd:TableData元素”。重要的是注意$SharedDataSource綁定到Xml文件的根,即$SharedDataSource別名<SearchResults...>。因此,位置$SharedDataSource/myd:TableData近似于指定myd:SearchResults/myd:TableData。還要注意該位置上名字空間前綴的使用——這是非常重要的。因為Xml文件指定了xmlns=“MyData”的默認名字空間,所以Xad內(nèi)的綁定位置必須使用與嘗試訪問數(shù)據(jù)時相同的名字空間。在大多數(shù)情形中,Xad應(yīng)用程序?qū)adFramework名字空間用作默認名字空間。因此,如果綁定被指定為并且Framework名字空間是Xad應(yīng)用程序中的默認名字空間,則該綁定將被解釋為顯然,這將不提供所需的來自Xml文件的數(shù)據(jù)。因此,聲明xmlns:myd=“MyData”名字空間是極為重要的。沒有這么做常常是許多破壞性應(yīng)用程序bug的起因。實際上可綁定到給定標簽定義的主體內(nèi)的實體由范圍的概念所限制。這在以下介紹范圍參數(shù)的概念時將更深入地論及。有效相對位置以下Xml文件(RelLocData.xml)在下面的相對位置示例中使用指定文本元素產(chǎn)生值StephenDanton要知道的一些細節(jié)要注意的一個關(guān)鍵方面是相對位置如何被映射到底層數(shù)據(jù)源。注意,$RelLocData一般不映射到Xml文檔。相反,它映射到該文檔的根<TableData...>。另一種思路是$SomeBinding作為它所綁定數(shù)據(jù)的Xml根的別名。為此可寫成......因為實質(zhì)上它與寫成myd:TableData/myd:Employees相同...要知道的一些其它方面是何時使用綁定。當數(shù)據(jù)源沒有根時,$SomeBinding直接綁定到數(shù)據(jù)的文本元素并將之展示為其值,例如在指定Text=“$UnrootedData”的情形中,可看到$UnrootedData直接映射到字符串“Whereismyroot?”應(yīng)得到理解但容易顯式調(diào)出的最終情形是只有根(rootonly)的數(shù)據(jù)源,例如在該情形中,$RootOnlyData映射到標簽<Root>并默認地返回到該標簽下的第一文本元素,即串“IRootthereforeIam”。指定屬性的值產(chǎn)生值1。指定特定孩子產(chǎn)生值A(chǔ)ndyWassyng(即Employees的第二子)。2.5.3綁定到分組標簽除了能綁定到實體標簽之外,有可能綁定到分組標簽。例如MergeTreeTransform(合并樹變換)實體具有稱為“Trees”的取類型為“sys:Data”的一組實體的參數(shù)。通過綁定到Resources(資源)分組標簽,MergeTreeTransform被“綁定”到Resources分組標簽下的該組實體。2.5.4綁定到標簽定義的形式參數(shù)即使該主題是在綁定的上下文中討論的,它實際上不僅僅有關(guān)參數(shù)綁定。它顯示可如何使用XAD來容易地創(chuàng)建具有抽象的漸進級別(很像傳統(tǒng)語言中的函數(shù))的標簽??紤]以下XAD片段較為實際的是假定想要將該XAD片段變成名為“TableWithCaption”的抽象。很像使用函數(shù),該抽象的使用者會想要使某行為重新參數(shù)化。這可通過創(chuàng)建名為“TableWithCaption”的新實體標簽來實現(xiàn)。該標簽將取2個參數(shù)“Caption”和“TableFile”。XAD作者可通過純聲明性定義來實現(xiàn)它注意形式參數(shù)用與引用標簽定義主體內(nèi)的實體完全一樣的方式來引用。這等效于不允許形式參數(shù)通過局部變量遮蔽。寫成如下是非法的創(chuàng)建諸如TableWithCaption的抽象的一常見情形將是提供部分參數(shù)的默認值。標簽定義供指定這樣的默認值之用。在該情形中,Caption參數(shù)被指定為可任選,并默認為串“Results”?!癟ableWithCaption”的實例化將不再需要Caption(標題)如果默認不是串,則該默認的聲明將包括內(nèi)聯(lián)實體標簽。例如2.5.5使用綁定來允許編輯設(shè)置<sys:InLineData>上的Writable(可寫)屬性使得InlineData(內(nèi)嵌數(shù)據(jù))實體可寫。以下示例示出將可寫InlineData實體作為XAD內(nèi)的“scratchpad(便簽簿)”的通常使用。當首先顯示Text時,所顯示的文本是InlineData實體的初始值Bye“MouseLeftButtonDown”是類型為“sys:EventHandler”的參數(shù)。與“MouseLeftButtonDown”參數(shù)(由Param=“MouseLeftButtonDown”表示)相對應(yīng)的動作在Text實體遇到左鼠標鍵按下事件時調(diào)用。在該情形中,SetTextValueAction將被調(diào)用,并將改變InlineData實體中的<Greeting>元素的文本值。這是因為SetTextValueAction經(jīng)由Data(由Data=“$ScratchPad”表示)參數(shù)綁定到InlineData實體??傊?,Text所接收到的左鼠標鍵按下事件將導致Text顯示Ciao類似地,右鼠標鍵按下事件將導致Text顯示AuRevoir動作與可寫數(shù)據(jù)的綁定是實現(xiàn)XAD中的可編輯性的一種常見方法??紤]涉及在表格中插入新行的一種略有不同的情形如果CDs.xml包含以下則最初顯示的表格看起來將類似于AchtungBabyU219.99FirestarterProdigy21.99當表格接收右鼠標鍵按下事件時,AppendSiblingTreeAction將被調(diào)用并將對其Tree屬性指定的值添加到由其Sibling(兄弟)param提供的節(jié)點上。此后該樹將類似于由于對該樹的更新,該表格顯示將自動更新使之看起來如下AchtungBabyU219.99FirestarterProdigy21.99??0.002.6主標簽在以上規(guī)范的HelloWorld示例中可看到,Xad應(yīng)用程序的入口點與C或C#應(yīng)用程序中的主函數(shù)相似。當Xad設(shè)計時間外殼時,即Xad.exe運行時,它查找“Main”標簽定義,即Name=“sys:Main”的標簽并將其用作為應(yīng)用程序的入口點。繼續(xù)關(guān)于與通用命令性語言的相似性,sys:Main標簽定義可用命令行值來參數(shù)化。此外,它在執(zhí)行應(yīng)用程序之后展現(xiàn)自動提供值的三個預定義值。2.6.1自動填充參數(shù)對sys:Main參數(shù)標簽保留3個名字,它們是XadBaseDirectory、InitialWorkingDirectory、以及MetaData。它們的每個以相同的方式展示和綁定。此外,它們都是只讀的。以下將呈現(xiàn)使用XadBaseDirectory參數(shù)的一個示例。XadBaseDirectory通常與XmlFileDataSource相關(guān)聯(lián)地用作其BaseUri參數(shù)的值,考慮以下Xad......將$XadBaseDirectory用作BaseUri的值表示與DataSource相關(guān)聯(lián)的文件將在傳遞給Xad.exe(即Xad應(yīng)用程序的設(shè)計時間外殼)的文件的位置上查找。所以,如果foo.xad是應(yīng)用程序且它位于C:\xaf\demos\personal\,則XadBaseDirectory將等于C:\xaf\demos\personal,且由File定義的文件將在該目錄路徑內(nèi)搜索。以下定義3個保留參數(shù)的自動填充值·XadBaseDirectory-表示該應(yīng)用程序的Xad基本目錄、即啟動該應(yīng)用程序的目錄而非啟動Xad.exe的位置的串·InitialWorkingDirectory-表示該應(yīng)用程序的初始工作目錄、即啟動該應(yīng)用程序的目錄而非啟動Xad.exe的位置的串·MetaData-當前關(guān)聯(lián)于該應(yīng)用程序的所有載入組件的合并元數(shù)據(jù)的樹。以下Xad應(yīng)用程序示出所有三個參數(shù)的使用...2.6.2命令行參數(shù)化除了保留的自動填充的sys:Main參數(shù)之外,應(yīng)用程序可用如sys:Main的參數(shù)等其它名字來指定任何數(shù)量的參數(shù)。這些參數(shù)可在命令行上被參數(shù)化,并可用于所有方式的應(yīng)用程序配置。以下Xad提供指定的sys:Main參數(shù)、然后是提供其值的該命令行的一個示例......命令行...xadCommandLine.xad/TextData=Testing...更一般地...xad<應(yīng)用程序文件>[/<參數(shù)名1>=<值1>[/<參數(shù)名2>=<值2>[...]]][Switches]...得到以下應(yīng)用程序...(傳遞到命令行參數(shù)的值不必是簡單文本,它可以是文件名、圖像位置等。)2.7忽略的塊回想Xad是一種基于Xml的語言。更具體地,任何Xad代碼必須是有效的Xml。這在嘗試用“注釋出和代碼”方法開發(fā)Xad應(yīng)用程序時產(chǎn)生了有趣的限制。為清晰起見,Xml不支持注釋的嵌套,例如以下Xml是非法的因此,與諸如C++或C#等命令性語言不同,對注釋的注解在沒有支持這種操作的任何特定句法的Xad中是不可能的,該特征變成名為sys:IgnoredBlock的標簽的形式并定義如下。IgnoredBlock(忽略的塊)標簽可位于<sys:Xad>范圍之下的任一處,只要其余的Xad是有效的即可??紤]以下......Xad注釋標簽不能包圍這些元素中的任一個,因為它們對于一有效的Xad應(yīng)用程序而言都是必需的。IgnoredBlock標簽的第一次出現(xiàn)使得它和其孩子被Xad檢驗器忽略,考慮以下有效的Xad......添加以下IgnoredBlock標簽.......使其變成無效Xml且在該情形中無效Xad。因此,Xad檢驗器將報告無效Xml的差錯,因為在可執(zhí)行進一步的檢查之前Xad必須是有效的Xml。只要嵌套保持Xml的有效性,就允許嵌套<sys:IgnoredBlock>...考慮以下顯示<sys:IgnoredBlock>外部的Xml注釋的Xad...被視為一個大的Xml注釋,即IgnoredBlock不具有特殊功能,在此它僅僅是Xml注釋內(nèi)的一個字符串??紤]包圍一Xml注釋的<sys:IgnoredBlock>外部的Xml注釋...這是非法的。如上所述,Xad必須一直是有效的Xml?;叵氚凑斩x不能用注釋包圍Xml注釋。與Xml注釋不同,<sys:IgnoredBlock>不能用來避開無效Xml......以上Xad將返回一無效Xml的檢查差錯<FP>、<A>和<B>沒有結(jié)束標簽。然而,如果添加Xml注釋則是可以的...IgnoredBlock標簽不能用來注釋出sys:InLineData的內(nèi)部,考慮以下Xad......以上代碼被解釋為“內(nèi)聯(lián)數(shù)據(jù)”,<EFG></EFG>不被忽略,實際上<sys:IgnoredBlock>變成<EFG>的父親。因此,內(nèi)聯(lián)數(shù)據(jù)實際上將更易于看到的數(shù)據(jù)定義為...2.8傳出參數(shù)2.9白空格所有進入Xad應(yīng)用程序的數(shù)據(jù)都被視為“按現(xiàn)狀”——無論通過數(shù)據(jù)綁定指定或由Xad作者靜態(tài)地定義。因此,Xad將不展示任何用于控制白空格的UI組件專用控件。這表示,與Xaml不同,不在UI元素級展示xml:space=“Preserve|Default”—這是Xad與Xaml未對齊的區(qū)域。選擇不在每個UI元素、數(shù)據(jù)源、變換等上支持“保留白空格”參數(shù)將允許我們對Office類應(yīng)用程序發(fā)生興趣——即這一類型的白空格管理對Office類應(yīng)用程序是不實際的。相反,我們展示W(wǎng)hitespaceTransform(白空格變換)(臨時名稱—MM3特征),將允許Xad作者定義如何以更為全局/數(shù)據(jù)驅(qū)動的方式處理白空格??紤]以下情形...將所有白空格視為按現(xiàn)狀(asis)。意思是如果具有以下Xad......則顯現(xiàn)為“Steve”類似地,對于......它顯現(xiàn)為“Steve”類似地,對于......它顯現(xiàn)為“Steve”同樣...<TextText=“$foo”/>其中$foo=“Steve”(對$foo的值的所有導出重復。)2.10結(jié)構(gòu)缺少XAD內(nèi)的結(jié)構(gòu)并不排除任何應(yīng)用程序功能。然而,對于大XAD應(yīng)用程序結(jié)構(gòu)確實簡化數(shù)個創(chuàng)作工作流??紤]具有在頂層定義的一個動作(保存)和三個狀態(tài)(最近文檔、用戶偏好和企業(yè)偏好)的應(yīng)用程序。如果該應(yīng)用程序具有數(shù)個窗格(建模成類型為“fwk:UIElement”的導出標簽),則問題是1.每個參數(shù)必須被顯式地傳遞給每個窗格(數(shù)據(jù)參數(shù)經(jīng)由Xquery的聚集可被用來減少數(shù)據(jù)參數(shù)的數(shù)量,但不會有助于非數(shù)據(jù)參數(shù))2.添加一額外動作(例如打印)要求向每個窗格添加一新參數(shù)(注意,如果窗格被設(shè)計成共享參數(shù)組則可避免每個窗格的標簽定義的更改;然而所有窗格實例仍需被更新)3.沒有根據(jù)嵌套類別將參數(shù)分組的機制(通過其屬性是其它類的類以典型OO實現(xiàn);經(jīng)由連接器接口以XAF實現(xiàn))該情形通過以下示圖說明以進一步闡明為便于說明,首先將討論“單層結(jié)構(gòu)”(以解決前兩個問題),然后一般化為“嵌套結(jié)構(gòu)”(以解決第三個問題)。實際上僅有一個作為“結(jié)構(gòu)”的集體特征。2.10.1單層結(jié)構(gòu)以下XAD將被寫成為指定該結(jié)構(gòu)的簽名使用“app:ActionsAndDataSignature”簽名的樣本結(jié)構(gòu)將是結(jié)構(gòu)可在標簽定義內(nèi)使用,其一個示例如下所示窗格的一個實例將是在主體內(nèi),以下綁定將對類型為“sys:EventHandler”的所有參數(shù)有效·“$ActionAndData.PrintAction”·“$ActionAndData.SaveAction”在主體內(nèi),以下綁定將對類型為“sys:Data”的所有參數(shù)有效·“$ActionAndData.RecentDocuments”·“$ActionAndData.UserPreferences”·“$ActionAndData.EnterprisePreferences”注意,如果作為例子,用戶偏好由以下形式的數(shù)據(jù)樹建模則有可能經(jīng)由“$ActionsAndData.UserPreferences/AutoSaveFrequency”綁定到自動保存頻率設(shè)置。在主體內(nèi),以下綁定對簽名“app:ActionsAndDataSignature”的所有參數(shù)(通常是要求訪問應(yīng)用程序的動作和喜好的其它導出標簽的參數(shù))有效·“$ActionAndData”2.10.2嵌套結(jié)構(gòu)同樣的情形可使用嵌套結(jié)構(gòu)(僅僅是單層結(jié)構(gòu)的推廣)來解決在主體內(nèi),以下綁定將對類型為“sys:EventHandler”的所有參數(shù)有效·“$ActionAndData.Actions.Print”·“$ActionAndData.Actions.Save”在主體內(nèi),以下綁定將對類型為“sys:Data”的所有參數(shù)有效·“$ActionAndData.RecentDocuments”·“$ActionAndData.Preferences.User”·“$ActionAndData.Preferences.Enterprise”在主體內(nèi),以下綁定對簽名“app:ActionsAndDataSignature”的所有參數(shù)(通常是要求訪問應(yīng)用程序的動作和偏好的其它導出標簽的參數(shù))有效·“$ActionAndData”在主體內(nèi),以下綁定對簽名“app:ActionsSignature”的所有參數(shù)(通常是僅要求訪問應(yīng)用程序的動作的其它導出標簽的參數(shù))有效·“$ActionAndData.Actions”在主體內(nèi),以下綁定對簽名“app:PreferencesSignature”的所有參數(shù)(通常是僅要求訪問應(yīng)用程序的喜好的其它導出標簽的參數(shù))有效·“$ActionAndData.Preferences”2.11樣式Avalon樣式的主要應(yīng)用為·默認特定元素的屬性值·默認特定元素下的視覺樹的外觀·默認對特定元素的輸入響應(yīng)(視覺觸發(fā)器)·指定如何顯示一控件的重復的孩子這些被分成三類1.包含在SDK1中的樣式的各方面;通過將XAML模型一般化并使其可應(yīng)用于XAD特定概念(例如導出標簽)來另外添加值;該語法并非必須是相同的,而僅需足夠接近以限定為對準區(qū)域。例如,默認屬性值。2.在無實質(zhì)性設(shè)計的一般化程度上有前途而包含的樣式的各方面;這些是有價值的方面且要求以某種方式包含后-SDK1例如視覺樹和視覺觸發(fā)器。3.像當前設(shè)計一樣易損壞的、且不像對于制作“辦公室級應(yīng)用程序”能按比例縮放的樣式的各方面;它們通過優(yōu)選XAD方法解決。例如顯示重復孩子。此外,可為了兼容性支持XAML方法,但這些決定將制成后-SDK。本文檔著眼于于SDK1中包含的領(lǐng)域,即默認屬性值。2.11.1用于默認目的的樣式XAD引擎將處理被指定為資源的名為<sys:Style>的特定標簽。將允許指定默認參數(shù)值,并將不限于UI實體。以下是默認指定的一個示例這表示在對TextBox指定另一默認樣式以前,XAD引擎將在創(chuàng)建TextBox時進行以下動作·僅當未指定明確的Width(寬度)時,將其Width設(shè)定為100%·僅當未指定明確的Height(高度)時,將其Height設(shè)定為100%·僅當未指定明確的Background(背景)時,將其Background設(shè)定為實心紅色畫刷“樣式信息”將簡單地與XAD引擎已保留的分層環(huán)境一起存儲以便鏈接。樣式的查找是散列查找并且無需向上走查樹。在此會與Avalon不同,因為利用了存在XAD運行時人工制品的事實(延遲處理范圍)。此外,涉及遍歷視覺樹的方法將嚴格限制對UI實體的默認。關(guān)閉一樣式可通過不對要設(shè)計樣式的實體指定參數(shù)來實現(xiàn)。以下將禁用TextBox的任何先前的樣式默認值將可等同地應(yīng)用于導出標簽應(yīng)用于非UI實體的默認值的一個示例是這表示如果未明確指定XmlFileDataSource的AccessMode(存取模式)參數(shù),則它被設(shè)定為ReadOnly。注意,必要參數(shù)必須在XAD內(nèi)指定。依賴于通過樣式(例如XmlFileDataSource的Path(路徑)參數(shù))設(shè)定必要參數(shù)是不可能的。該限制存在以容許編寫。依賴于樣式的存在是脆弱的。此外,將可能在類型層次上指定默認這表示在對UIElement指定另一默認樣式以前,XAD引擎將在創(chuàng)建任一UI連接器時進行以下動作·如果1.支持Width參數(shù)2.并且未明確指定Width參數(shù)3.并且未指定所討論UI元素的專用樣式(例如TextBox專用樣式),則Width被設(shè)定為100%·對于Height同上·對于Background同上2)要求嚴格的類型匹配?或者應(yīng)當另外檢查“最接近IsAssignableForm”匹配?樣式的類型檢查比常規(guī)的XAD更不嚴格。具體地·因為每個UIElement都可引入它自己的參數(shù),所以將不檢查“類型樣式”(例如,以上的“UIElement”示例)上的參數(shù)。如果類型為簽名且因此指定了某些參數(shù),那些參數(shù)將是經(jīng)類型檢查的(因為在XAD中不允許覆蓋參數(shù),所以這是可能的)?!邮絻?nèi)所附加參數(shù)的值將被檢查,即將禁止DockPanel.Dock=“Garbage”。然而,將有可能將任何經(jīng)聲明的附加參數(shù)寫入到樣式上。例如,即使樣式可應(yīng)用于不是DockPanel的孩子的TextBox,也可能寫成如下3)將標注全局的附加參數(shù)。這在任何情形中都將要求用于冒泡事件的后-SDK1。與XAML相似,將支持通過所有實體上稱為“Style”(樣式)的隱式系統(tǒng)級參數(shù)綁定到一特定樣式。然而該樣式仍然需要在范圍中。注意。范圍限制并不真正專用于樣式,而是劃定范圍的綁定模型的結(jié)果。如果需要,可支持與諸如Styles的特定類型的全局綁定,但目前將查看劃定范圍的模型可使用到什么程度。即使它沒有實際應(yīng)用,但注意為了一致性起見,將可能寫成如下綁定到樣式是類型-安全的。因此以下將導致差錯總之,將支持Avalon的模型以在幾個區(qū)域內(nèi)默認使用樣式并添加值·默認值應(yīng)用于所有實體(并非僅僅UI實體)·默認值應(yīng)用于導出標簽(而非僅原語標簽)·默認可在例如所有UIElement的類型層上完成(Avalon最終極有可能支持這個)對于SDK1將不實現(xiàn)類型級上的默認。2.11.2Avalon的視覺樹的樣式化對該區(qū)域的XAD設(shè)計連同相應(yīng)的UI連接器設(shè)計一起將通過后-SDK1來完成。2.11.3樣式化和視覺觸發(fā)器對該區(qū)域的XAD設(shè)計連同相應(yīng)的UI連接器設(shè)計一起將通過后-SDK1來完成。2.12設(shè)定范圍的參數(shù)一些參數(shù)引入一新的范圍。引入新范圍的參數(shù)具有設(shè)為真的“NewScope”屬性出于不同原因參數(shù)可選擇引入范圍·要引入范圍變量·要引入一個單位的延遲和/或重復工作·以上全部將在本節(jié)中定義設(shè)定范圍的變量和延遲/重復工作的概念。與設(shè)定范圍的參數(shù)相關(guān)聯(lián)的實體存在于范圍邊界上。依靠它們所關(guān)聯(lián)的參數(shù)的優(yōu)點,它們引入一范圍邊界。以下示圖說明嵌套的范圍引入實體和分組標簽如何產(chǎn)生一范圍樹2.12.1范圍變量參數(shù)引入新范圍的一個原因是在范圍內(nèi)引入一組變量。這些變量相當像形式參數(shù),其不同之處在于它們是隱式聲明的。綁定到設(shè)定范圍的變量以綁定到形式參數(shù)相同的方法實現(xiàn)。設(shè)定范圍的變量與聲明范圍引入?yún)?shù)一起聲明。例如,考慮Text的標簽定義sys:ParamGroupRef定義對sys:ParamGroup標簽的引用,這看起來如下注意名為MouseLeftButtonDown的sys:Param的定義。它指定NewScope和名為Position_X的sys:ScopeVariable。這表示不管什么時候使用MouseLeftButtonDown參數(shù),它都將1.引入一新范圍2.展示名為Position_X的sys:ScopeVariable設(shè)定范圍的變量的要點是允許諸如以下的情形用于該應(yīng)用程序的Xad如下對于所有示例,將鼓勵你運行該Xad以感知該應(yīng)用程序的功能。通過使用與MouseLeftButtonDown相關(guān)聯(lián)的范圍變量,將能在每次作鼠標鍵按下事件發(fā)生時更新橙色矩形的位置。進一步檢查事件代碼......看到MouseLeftButtonDown參數(shù)展示兩個范圍變量Position_X和Position_Y。對那些范圍參數(shù)的值的綁定用與所有Xad綁定相同的參數(shù)來完成。例如,以下將是非法的......因為Position_X由MouseLeftButtonDown展示。2.12.2重復器模式盡管重復器模式由各種各樣的實體類型使用,但其用途由XAD標準框架中的Compound(復合物)實體來最佳地說明。數(shù)據(jù)-驅(qū)動的復合物實體被綁定于數(shù)據(jù)-集,并且對于該數(shù)據(jù)-集中的每個數(shù)據(jù)項,它顯示一子-元素。迄今為止已在許多樣本中使用了FlowPanel實體。該FlowPanel實體真正具有兩種模式·規(guī)定的(要顯示的子-實體被顯式指定為Children參數(shù))·以及數(shù)據(jù)-驅(qū)動的(使用將在本節(jié)內(nèi)定義的重復器模式)FlowPanel實體的定義并不僅僅圍繞Children參數(shù)(如迄今為止已在各示例中所提出的)。其標簽定義看起來更類似于以下與按規(guī)定指定子-實體相反,有可能指定Data參數(shù)以及RepeatedChild參數(shù)。這將FlowPanel實體置入“數(shù)據(jù)-驅(qū)動”模式中。注意,F(xiàn)lowPanel標簽定義使用<sys:Choice>標簽,這些標簽需要該標簽的任何實現(xiàn),以在使用Children參數(shù)(從而定義規(guī)定布局)或Data和RepeatedChild的<sys:ParamGroup>之間選擇。RepeatedChild參數(shù)是對于Data中的各個項實例化多次的實體。由RepeatedChild參數(shù)引入的范圍具有一名為DataContext的范圍變量。該變量被設(shè)定為與要實例化的子視圖相對應(yīng)的項。以下片段說明以數(shù)據(jù)-驅(qū)動方式對FlowPanel實體的使用假定List.xml包含以下Xml對于每個列表項,F(xiàn)lowPanel實體都將創(chuàng)建一Text實體。對于第一個Text實體,DataContext范圍變量的值將是$DataContext/@Name綁定將產(chǎn)生Name(名字)屬性。當Text被綁定于一屬性時,在該情形中它顯示為“ChrisHackmann”的屬性值。這同樣適用于每個列表-項。如果視口(view-port)足夠大,則FlowPanel實體將在屏幕上顯示如下每一行都對應(yīng)于Text實體的一次實例化。從一個實例化到另一個實例化所變化的是“DataContext”范圍變量的值。該模式被稱為“重復器模式”。它是XAD中在數(shù)據(jù)集上迭代的基礎(chǔ)。由于特定縮寫表示法‘.’(單點或句號),$DataContext/@Name綁定可被重寫為./@Name,該‘.’被保留以唯一用于DataContext范圍變量。2.12.3范圍相關(guān)的綁定限制范圍引入某些綁定限制。從外范圍到內(nèi)范圍的綁定被禁止。然而如下圖所示的從內(nèi)范圍到外范圍的綁定是被允許的。綁定到內(nèi)范圍中的標簽被禁止。2.12.4嵌套的重復器模式在有關(guān)“重復器模式”的一節(jié)中,說明了如何在數(shù)據(jù)集上實現(xiàn)簡單迭代。在本節(jié)中將考慮一種更為復雜的情形。開始考慮以下簡單數(shù)據(jù)集考慮該簡單數(shù)據(jù)集的以下視圖CustomerDescriptionPriceLuisFigoToaster49.99LuisFigoVCR199.99該視圖可用Table(表格)實體來容易地實現(xiàn),但為了說明起見將限于FlowPanel和Text實體對于熟悉命令性語言的人,僅迭代方面可被大致地建模如下現(xiàn)在考慮以下略復雜一些的數(shù)據(jù)集考慮該更復雜數(shù)據(jù)集的以下視圖CustomerDescriptionPriceLuisFigoToaster49.99LuisFigoVCR199.99LilianThuramDVDPlayer279.79LilianThuramReceiver549.99LilianThuramSub-woofer350.00該情形中的唯一實際區(qū)別是存在額外一級迭代。與在單個購買訂單(PurchaseOrder)上迭代不同,將首先在一組購買訂單上迭代。對于每個購買訂單,仍然將大致地做相同的事。主要差異是customer(客戶)欄現(xiàn)在將是“外部”迭代的函數(shù)。再一次,對于熟悉命令性代碼的人,迭代模型大致地為以命令性代碼簡單添加一級額外的迭代的相同方法,XAD將同樣做出除了該一級額外的迭代之外,本示例中另一有趣說明是使用<sys:BindingName=“OrderDataContext”>實體來從外范圍引用一范圍變量。實際上,這樣一種機制僅在相對稀少的引用以下范圍變量情形中有用·在外范圍中,以及·具有與現(xiàn)有范圍或所包含范圍中的范圍變量相同的名字2.13參數(shù)繼承在創(chuàng)建導出標簽定義時,現(xiàn)有實體的參數(shù)可通過BaseTag屬性成為可用。例如......允許Xad作者能指定如下注意,Text和FontFamily通常不被調(diào)出為標簽定義內(nèi)的Param值。這是因為這些參數(shù)在fwk:Text標簽定義中指定,并且作為指定BaseName=“fwk:Text”的結(jié)果而被自動往下傳遞至SimpleText標簽定義。此外,在基本標簽的標簽定義內(nèi)定義的值被自動地分配給SimpleText標簽定義。例如,如果FontFamily被賦予Arial的默認值,則該值被往下傳遞給SimpleText標簽定義。實例對比定義——參數(shù)值優(yōu)先。當定義一標簽時,對定義內(nèi)的屬性可靜態(tài)地提供值...如果這些未在標簽實例中指定,則它們保持“現(xiàn)有狀態(tài)”,但是如果它們得到了指定,則實例值優(yōu)先。考慮以下......以具有字號為25的綠色字體的SimpleText為例。該標簽實例中的FontSize值置換(優(yōu)先于)標簽定義內(nèi)的FontSize=“50”的聲明。特定參數(shù)可被定義為“禁用”或不“可覆蓋”;考慮以下...對于實例......因為定義將該參數(shù)定義為最小值為0且最大值也為0,所以定義標簽實例中的FontFamlily將產(chǎn)生一檢查差錯(不是警告)。注意,F(xiàn)ontFamlily參數(shù)仍然可在標簽定義內(nèi)靜態(tài)地設(shè)置,如上所示。指定與最上層標簽的類型不匹配的BaseTag值是非法的,例如......以上指定了用于其BaseTag參數(shù)的fwk:Border值,但將Text(類型為fwk:Text)定義為其最頂層標簽。2.13.1限制參數(shù)僅可通過最頂層標簽繼承,例如,如果寫出......對于實例......最頂層標簽是Border(邊界),所以其全部參數(shù)都由新的BorderText標簽自動展示,并屬于該標簽定義內(nèi)的Border標簽。共享參數(shù)由最頂層標簽耗用,例如......盡管Border和Text都具有Margin參數(shù),但在以上實例中設(shè)置Margin僅設(shè)置了Border的頁邊距而非Text的頁邊距。為了設(shè)置Text標簽上的值,它們需要經(jīng)由Sys:Param語法展示并綁定于Text標簽內(nèi),以下闡明了這一點......且標簽的實例看起來如下最后,不支持多重繼承。例如,不能定義標簽定義,然后將該標簽定義用作另一標簽定義的BaseTag。例如,以下是非法的2.14條件參數(shù)化盡管XAD是聲明性語言,但是它仍然足夠富有表現(xiàn)力以允許實體的條件構(gòu)造。兩種條件構(gòu)造方式是可能的SwitchEntity或SwitchEntities。這些方式的每一種都可通過Case(情形)或Condition(條件)標簽(但不是兩者)來參數(shù)化。Case可被視為C#switch(切換)的當然等效,而Condition與C#的一組if-else子句相似。Case和Condition的使用是互斥的,即Switch不能在其主體內(nèi)混合Case和Condition。此外,Case僅可在Switch指定其Data參數(shù)的值時使用,否則必須使用Condition。SwitchEntity、SwitchEntities、Case和Condition都存在于系統(tǒng)名字空間內(nèi)。根據(jù)規(guī)范,它們帶有前綴sys:名字空間,即sys:Case、sys:SwitchEntity等。考慮以下數(shù)據(jù)集作為示例...2.14.1CaseCase是兩個選項中較簡單的一個。它們具有單個參數(shù)Value。Value的值必須求值成IString。在不用Data的值指定Switch的情況下使用Case導致設(shè)計時檢查差錯,考慮以下非法Xad......以下Xad示出Case的正確使用...2.14.2ConditionCondition向Xad作者提供對Switch結(jié)果的高級控制。Condition展示單個參數(shù)Test。Test的值是位置模板,表示它可以是任何有效的xQuery。Condition僅可在Switch不對其Data參數(shù)指定值時使用。將Condition與已指定Data值的Switch一起使用導致設(shè)計時檢查差錯,考慮以下非法Xad......以下Xad說明Condition的正確使用...2.14.3SwitchEntity使用SwitchEntity使得作者能有條件地返回作為對切換求值的結(jié)果的單個項??紤]允許顯示數(shù)據(jù)集中的每一項的以下Xad...所得到的視圖看起來會像現(xiàn)在考慮想要用紅色Georgia字體顯示500以上的價格并用綠色Arial字體顯示100以下的價格的情形。XAD現(xiàn)在看起來像...所得到的視圖將與以下的相似(“Toaster”被顯示為綠色粗體Arial,而“Receiver”被顯示為紅色粗體Georgia)2.14.4SwitchEntitiesSwitchEntities可被用來返回多個值。這可表示匹配多個Case或Condition,或使單個Condition返回多個值。除了由SwitchEntity展示的參數(shù)外,SwitchEntities展示一MatchFirst參數(shù)。默認地MatchFirst為假,表示SwitchEntities匹配(即返回)所有匹配Case或Condition的值。在MatchFirst被設(shè)定為真的情形中,SwitchEntities僅返回首先匹配的Case或Condition的值。考慮以下指定MatchFirst等于假的Xad......取決于輸入文本框內(nèi)的值,該Xad將匹配一個或多個的Condition并適當?shù)仫@示UI。然而,如果MatchFirst被設(shè)定為真,則僅求值為真的第一Condition將使其值返回。2.14.5概要在未設(shè)定范圍的上下文中使用‘Switch’當在沒有代理的未設(shè)定范圍的上下文中(例如在Resources下)使用時,sys:SwitchEntity必須對其Type(類型)參數(shù)指定一值,考慮以下......必須定義sys:Data的Type。無法在處于為設(shè)定范圍的上下文中的SwitchEntity標簽上定義Type導致設(shè)計時檢查差錯。嵌套‘Switch’SwitchEntity/ies可用以下方式嵌套......這應(yīng)當被讀作,“如果$AppState=‘Blork’,則測試如果它顯示了值為$AppState/Foo的Text元素,注意是否有$AppState/Foo=‘Bar’”。沖突的嵌套附加參數(shù)考慮以下Xad......附加參數(shù)(用黃色高亮)沖突。最外部的參數(shù)(在sys:SwitchEntities標簽上指定的)表明該切換的返回值應(yīng)當停放于父DockPanel的頂部。相反,匹配內(nèi)部Case標簽(用青色高亮)返回一Text元素,它指定該Text應(yīng)當停放于父DockPanel的底部。這種沖突的結(jié)果如下·設(shè)計時檢查差錯,表明該Switch定義了一附加參數(shù),它遮蔽在可能返回值上指定的的附加參數(shù)·在運行時最里面的定義“獲勝”。意思是,如果內(nèi)部Case匹配,則該Text將停放于DockPanel的底部·最后,為確保清晰起見,匹配如上可見的默認情形將產(chǎn)生停放于父DockPanel頂部的Text元素,如Switch上的附加參數(shù)所指定的。2.14.6選擇器和標簽定義在一些情形中,要求將選擇器或選擇器的集合抽象成一標簽定義,從而使該選擇器能在各個區(qū)域中重復使用。考慮以下Xad......產(chǎn)生了以下應(yīng)用程序然而,以下模式是非法的...2.15關(guān)聯(lián)XAD允許任意實體與數(shù)據(jù)的關(guān)聯(lián)??紤]以下對一應(yīng)用程序的工作空間設(shè)置的建模的Xml語句注意,在此處的示例中不使用“LayoutScheme”和“ActiveDocumentIndex”——它們在那兒僅僅是使該語句的結(jié)構(gòu)與通常在應(yīng)用程序中使用的模式相似。MDI應(yīng)用程序?qū)堰@樣的一個狀態(tài)傳遞給該應(yīng)用程序內(nèi)的各個子系統(tǒng)。這些子系統(tǒng)的示例將是·在單獨的MDI子窗口中顯示每一打開文檔的內(nèi)容的實際MDI工作空間·帶有所有打開文檔的縮略圖的側(cè)欄·帶有諸如“保存所有文檔”等命令的菜單這些“子系統(tǒng)”各自都將要求不僅對文檔列表操作,而且對與這些文檔相關(guān)聯(lián)的DataSources(數(shù)據(jù)源)操作。理想地,各個子系統(tǒng)將共享該同樣的DataSources(數(shù)據(jù)源)實例。實際上共享對于諸如相關(guān)視圖等情形是必需的。該共享可通過稱為關(guān)聯(lián)管理器(AssociationManager)的實體類來實現(xiàn)。關(guān)聯(lián)管理器是創(chuàng)建并管理與數(shù)據(jù)相關(guān)聯(lián)的多個實體的實體。例如,列表關(guān)聯(lián)管理器(ListAssociationManager)創(chuàng)建并管理列表中每一列表項的關(guān)聯(lián)該XAD表示以下含義·該列表關(guān)聯(lián)管理器正在管理<OpenDocument>列表的關(guān)聯(lián)?!τ诹斜碇械拿總€項(即每個<Document>),將創(chuàng)建文件數(shù)據(jù)源(FileDataSource)作為“相關(guān)聯(lián)實體”?!っ總€FileDataSources將使其File(文件)參數(shù)設(shè)定為相應(yīng)<Document>的Filename(文件名)。數(shù)據(jù)上下文(“.”)總是相應(yīng)的列表項(即<Document>)?!ぎ斄斜眄?即每個<Document>)被添加到列表中或從中移除時,相應(yīng)的關(guān)聯(lián)實體(即FileDataSources)被添加和移除。注意,實體的實際創(chuàng)建是按需完成的??蛻舳私?jīng)由<sys:AssociatedEntity>引用關(guān)聯(lián)該XAD表示以下含義·對于<OpenDocument>列表中的每個<Document>,停靠面板都顯示一輪廓視圖。(輪廓視圖是以輪廓格式顯示其Tree(樹)參數(shù)的假定的UI元素。)·每個輪廓視圖的Tree參數(shù)都是一關(guān)聯(lián)實體?!りP(guān)聯(lián)實體是與列表項(即每個<Document>)相關(guān)聯(lián)的FileDataSources。關(guān)聯(lián)管理器可被建模為動態(tài)字典<sys:AssociatedEntity>可被視為代理關(guān)聯(lián)管理器中的值的實體;要代理的值由<sys:AssociatedEntity>的Data參數(shù)驅(qū)動。注意,盡管在本示例中的關(guān)聯(lián)實體是DataSources(數(shù)據(jù)源),但關(guān)聯(lián)實體的類型可以是任意的,例如EventHandler(事件處理程序)。2.16標簽文檔編制以縱覽形式,用以XAD標簽文檔編制的XAF的方法是模仿C#用于受管API的引用文檔編制的方法引用注釋可被結(jié)合到XAD標簽的.xad代碼中,且該注釋可由在概念和設(shè)計上與用于受管API參考文獻的MS內(nèi)部生成的工具相似的工具來提取和后處理。三個附加規(guī)范涵蓋XAD引用文檔編制·XAD標簽文檔內(nèi)容和后處理情形·XAD標簽文檔標記和演示·XAD標簽文檔生成工具這些規(guī)范的內(nèi)容基于其名稱應(yīng)當容易區(qū)分。以下形式語言規(guī)范章節(jié)包括對控制引用文檔編制的結(jié)構(gòu)的引用文檔編制標記標簽的論述。對于所有文檔編制相關(guān)標簽的完整細節(jié),參看前述的文檔標記和演示規(guī)范。3.形式語言規(guī)范本節(jié)提供了用于前一節(jié)中較不形式地介紹的許多語言構(gòu)造的形式聲明?!罢Z言構(gòu)造”意味著在System名字空間中生存的標簽(http://schemas.microsoft.com/2005/xad/system)。如上所述,XAD代碼被寫為形式良好的Xml。XAD文件的第一個標簽要求是<sys:Xad>。文件通常(但不一定)具有.xad擴展名。對該語言而言基礎(chǔ)的打包和部署構(gòu)造while僅在第5節(jié)中形式定義。XAD語言的局部XSD規(guī)范可在http://xafteam/xafenv/doc/Platform/Application%20Components/xad.xds獲得。該規(guī)范被認為是“局部的”主要是因為XSD沒有足夠的表達力來捕捉許多結(jié)構(gòu)上的約束。3.1布爾屬性XADSystem標簽上的所有布爾屬性都是可選的。默認值總是為假。這實際上意味著無需指定布爾屬性,除非其值必須為真。換言之,缺少屬性總是意味著其值為假,而存在則應(yīng)意味著其值為真。出于一致性和可讀性的原因,建議框架擴展者在定義其自己的布爾參數(shù)時遵循這一約定。3.2限定名XAD是一種基于Xml的語言,且大量使用Xml限定名。限定名屬于特定名字空間以確保唯一性并避免沖突(參見http://www.w3.org/TR/REC-xml-names/以獲得更多細節(jié))。使用限定名的XAD語言構(gòu)造是·類型·標簽定義·簽名·公有參數(shù)組對于給定的XAD應(yīng)用程序,以上列出的每一構(gòu)造存儲桶(bucket)內(nèi)的每一實例必須具有跨整個存儲桶唯一的限定名。例如,不能有具有相同名字的兩種類型或者具有相同名字的兩個簽名。然而,來自不同存儲桶的項可具有相同的名字。例如,標簽和簽名可具有相同的名字,或者參數(shù)組和類型可具有相同的名字。3.3關(guān)鍵字3.3.1<Xad>3.3.2<Doc>示例3.3.3<Description>參見前一示例以了解對<description>標簽的簡單使用。參見XADTagsDocmarkupandpresentationspec以獲得對<description>標簽的使用的更全面處理。3.3.4<Type>3.3.5<TagDefinition>3.3.6<Signature>3.3.7<ParamGroup>(<Xad>下)3.3.8<Const>3.3.9<Param>3.3.10<OutParam>3.3.11<ParamGroup>(<Choice>下)3.3.12<ParamGroupRef>3.3.13<Choice>3.3.14<ParamDefaultValue>3.3.15<ConstDefaultValue>3.3.16<Entity>3.3.17<Function>3.3.18<Body>3.3.19<ScopeVariable>3.3.20<AttachedParam>3.4內(nèi)置實體3.4.1<InlineData>3.4.2<Binding>3.4.3<XPath>3.4.4<Mapping>3.4.5<DynamicEntity>注意,當指定Namespace時,Tag的值必須是局部名,即,Tag的值不能是“scal:DatePicker”,相反,它必須是“DatePicker”??紤]以下Xad差錯情況差錯1檢查與DyanmicEntity相關(guān)聯(lián)的差錯情形當試圖加載動態(tài)實體時,發(fā)生一系列的檢查差錯,這些檢查差錯被置入與該DynamicEntity相關(guān)聯(lián)的狀態(tài)板。3.4.6<AssociatedEntity>差錯情況差錯1無效關(guān)聯(lián)情形使用列表關(guān)聯(lián)管理器,作者傳入不解析到對該管理器關(guān)聯(lián)的數(shù)據(jù)節(jié)點。3.4.7<AssociatedDataEntities>3.4.8<SwitchEntity>3.4.9<SwitchEntities>3.4.10<Case>3.4.11<Condition>3.5實體構(gòu)建器實體構(gòu)建器是用于創(chuàng)建實體和/或?qū)ζ溥B線(wiring)的用戶定義的.NET類。實體構(gòu)建器用于實現(xiàn)原語XAD標簽。XAD語言定義了用于對實體構(gòu)建器連線的要求,因為它們是XAD運行時間和該語言的自定義擴展之間的交互點。取決于實體構(gòu)造和連線,有以下四種方法來實現(xiàn)定義新實體的原語標簽N構(gòu)造連線要創(chuàng)建的類構(gòu)建器類描述1簡單否是否創(chuàng)建實體如創(chuàng)建類的一個新實例那樣簡單。構(gòu)造器不取XAD運行時間不了解的任何參數(shù)。標簽簽名不定義任何參數(shù),因此實體不要求對參數(shù)的任何連線。2簡單是是是創(chuàng)建實體如創(chuàng)建類的一個新實例那樣簡單。標簽簽名指定傳入?yún)?shù),且因此實體要求被連線到它們。必須指定實體構(gòu)建器來實現(xiàn)連線。3復雜否否是實體構(gòu)造在某種程度上(使用工廠、傳遞構(gòu)造器參數(shù)等)是復雜的。必須指定實體構(gòu)建器來實現(xiàn)構(gòu)造。標簽簽名不指定參數(shù),因此無需由構(gòu)建器實現(xiàn)任何連線。4復雜是否是實體構(gòu)造在某種程度上(使用工廠、傳遞構(gòu)造器參數(shù)等)是復雜的。標簽簽名指定傳入?yún)?shù)。必須指定實體構(gòu)建器來實現(xiàn)實體的構(gòu)造和連線。注意在4種情況中的3種中,必須指定實體構(gòu)建器類。XAD定義了用于實體構(gòu)建器的兩個接口取決于實體構(gòu)造和連線,實體構(gòu)建器可實現(xiàn)這接口之一或兩者N構(gòu)造連線ICreateEntityIWireEntity1簡單是否是2復雜否是否3復雜是是是對實體構(gòu)建器的要求·無狀態(tài)。不允許實體構(gòu)建器在對Create和/或Wire方法的兩次調(diào)用之間保持局部狀態(tài)。XAD運行時間可出于效率原因創(chuàng)建實體構(gòu)建器的對象池。因此,對構(gòu)建器方法的調(diào)用的次序和數(shù)目沒有保證?!o播放時行為。實體構(gòu)建器可完成兩件事——創(chuàng)建實體和對實體連線。不允許其它任何事情。不允許實體構(gòu)建器使用它們創(chuàng)建或連線的實體的任何其它接口。以下示例示出了原語標簽的標簽定義以及相應(yīng)實體構(gòu)建器的實現(xiàn)此處是同一標簽的簡化版本的一個示例。由于實體無需訪問常量參數(shù)且沒有任何特殊的構(gòu)造器參數(shù),因此實體構(gòu)建器無需實現(xiàn)實體構(gòu)造,僅實現(xiàn)連線3.6動作一般而言,動作是實體,它實現(xiàn)實體類型“fwk:EventHandler”。命令可如任何其它實體一樣來實現(xiàn)——通過實現(xiàn)實體類并對標簽定義連線。然而,動作被識別為最常見的實體之一,且XAD支持實現(xiàn)替換它們的更簡單方式。XAD允許將動作實現(xiàn)為函數(shù)而不是實體。在后臺,XAD運行時間將XAD參數(shù)映射到C#參數(shù)并調(diào)用函數(shù)。用作命令實現(xiàn)的函數(shù)必須滿足以下要求·定義為實體類的方法。實體類提供對實體域服務(wù)的訪問??稍谕粚嶓w類上實現(xiàn)一個以上命令函數(shù)。然而,這僅僅是打包方便,且并不意味著動作之間的任何交互?!o狀態(tài)。XAD運行時間在運行時決定如何管理命令實體的實例。例如,可能為每一次命令調(diào)用創(chuàng)建實體類的新實例。不允許動作在一次調(diào)用到另一次之間保持狀態(tài)。它們需要了解的關(guān)于應(yīng)用程序的所有信息必須作為參數(shù)來傳遞?!o引用和傳出參數(shù)。作為函數(shù)實現(xiàn)的動作不能具有輸出參數(shù)。XAD一般不支持引用參數(shù),因此命令函數(shù)也不能使用它們。動作通過對作為傳入?yún)?shù)傳遞的可寫數(shù)據(jù)進行連線來對應(yīng)用程序狀態(tài)做出改變。命令函數(shù)取實體作為參數(shù)。通常,參數(shù)是數(shù)據(jù)實體。XAD通過允許強類型化的訪問來便于對數(shù)據(jù)實體的訪問。除了使用類屬數(shù)據(jù)實體類型ICRange之外,命令作者具有使用強類型化的存取器作為參數(shù)類型的選項。注意,代替對文件名使用傳出或引用參數(shù),使用更新存取器。指定數(shù)據(jù)實體不支持的存取器是錯誤的。除了命令函數(shù)之外,必須編寫對應(yīng)的標簽定義。標簽定義中的參數(shù)名必須完全匹配命令函數(shù)中的標簽名。XAD運行時間按照名字來匹配參數(shù),因此具有不匹配參數(shù)名是錯誤的。參數(shù)次序無關(guān)緊要。允許可任選參數(shù)(Min="0")。可任選參數(shù)的默認值可在標簽定義中指定。如果沒有指定默認值,則XAD運行時間將傳遞空,且客戶端代碼必須準備好處理它。定義沒有默認值的值類型可任選參數(shù)是錯誤的。允許設(shè)定參數(shù)(Max="unbounded")。設(shè)定參數(shù)必須在函數(shù)中被類型化為ICollection??稍趯硎褂妙悓?,來用該項的類型專門研究該集合。4)自定義檢查器應(yīng)實現(xiàn)什么接口?5)如何處理參數(shù)名和附加參數(shù)名之間的沖突?6)是否希望支持動態(tài)實例化實體上的傳出參數(shù)?7)是否要以某種方式使用類屬使得傳給Wire的實體是強類型化的?關(guān)于參數(shù)的值又如何?4.公共框架實體5.部署模型5.1XAD應(yīng)用程序XAD應(yīng)用程序由各種相關(guān)片斷構(gòu)成。XAD打包和部署模型定義了用于出于以下目的將這些片斷組合在一起并定義它們之間的關(guān)系的規(guī)則·標識應(yīng)用程序的所有部分(應(yīng)用程序的成份)·驗證應(yīng)用程序的完整性·在解釋和編譯兩種模式中運行應(yīng)用程序·部署應(yīng)用程序·版本化XAD使用基于組合件的打包和部署模型,它遵循Microsoft部署策略(見Fusion,http://fusion以獲得其細節(jié))。Fusion處理如版本化、并排安裝、“DLLhell”、管理、策略等問題,因此它對于充分利用其部署模型和服務(wù)是有益的。各種應(yīng)用程序片斷被組合成更大的包,稱為組合件。組合件被組合以形成應(yīng)用程序每一XAD應(yīng)用程序具有一入口點—應(yīng)用程序處理從其開始的標簽。對應(yīng)用程序入口點的要求為·標簽必須在根組合件中定義。·標簽的局部名必須是Main。名字空間必須是http://schemas.microsoft.com/2005/xad/system·如果標簽取參數(shù),則它們必須是簡單數(shù)據(jù)類型(string、Integer、Boolean等),因此它們可從命令行被傳遞。5.2XAD組合件XAD組合件是最小部署單元。它是具有XAD語義的融合(fusion)組合件。XAD組合件由以下兩個部分構(gòu)成·部件清單(見5.3)·成份文件組合件成份文件(部件清單中列出)包含實際XAD代碼(標簽定義、實體類型、簽名等)以及作為應(yīng)用程序的部分(數(shù)據(jù)方案、元數(shù)據(jù)、資源等)的任何其它信息。一旦將XAD或方案文件作為成份在部件清單中列出,其內(nèi)容變得對以下各項可用·組合件中的所有XAD文件·依賴XAD組合件中的所有XAD文件類型、簽名、參數(shù)組和標簽定義可被定義為“內(nèi)部”,在這一情況下它們在其組合件外部是不可見的。XAD文件不引用其它XAD或方案文件。依賴性(使用來自其它文件的標簽、類型等)在組合件級上而非文件級上處理。然而,XAD應(yīng)用程序中使用的其它語言可支持文件引用。例如,XSD支持包括和導出偽指令(directive)。包括或?qū)С龅奈募蛔詣映蔀榻M合件的部分。它們必須明確地作為成份文件列出。8)關(guān)于知識產(chǎn)權(quán)(IP)保護應(yīng)做什么?編譯的組合件可能是答案。所有成份文件必須位于部件清單所處的同一文件夾或子文件夾中(支持子文件夾的任意深的嵌套級別)。對XAD組合件有以下兩種格式·非PE多文件組合件。PE代表“可移植可執(zhí)行”。這一格式在開發(fā)期間是方便的。沒有包含整個組合件的單個文件。成份文件在它們由XAD作者創(chuàng)建并保存在盤上時被使用。XAD運行時間通過讀取部件清單來發(fā)現(xiàn)它們。對成份文件的任何改變在保存文件時立即反映在組合件上。不需要編譯步驟來使用XAD應(yīng)用程序中的組合件?!?NET組合件這是XAD組合件的編譯形式,對部署是方便的。編譯提供了更好的性能。XAD組合件以二進制格式儲存,并且可以用強名來簽署,因此它可如其它.NET組合件一樣在GAC(全局組合件高速緩存)中部署。它是必需的,于是編譯的XAD組合件,出于差錯處理和生成有意義Watson轉(zhuǎn)儲的原因,將允許將差錯糾正回原始的XAD源。5.3組合件部件清單XAD組合件部件清單是Fusion部件清單,并且可由Fusion來耗用。它完整地描述了XAD組合件。部件清單是具有“.manifest”擴展名的Xml文件。最新的Fusion部件清單方案可在http://teamweb/manifest/Shared%20Documents/Latest%20Man上找到。部件清單可使用文本編輯器來手動創(chuàng)建,或通過開發(fā)工具來創(chuàng)建。在開發(fā)時,部件清單扮演了配置文件的角色——它記錄了組合件的所有部分及其依賴性。在運行時,部件清單扮演了XAD運行時間用于找出并加載應(yīng)用程序的所有部分的目錄的角色。XAD運行時間不理解整個Fusion部件清單方案——它識別其某些部分并忽略其余部分。XAD識別的部件清單部分有·組合件身份·描述·對其它組合件的依賴性·成份文件列表Fusion部件清單方案目標名字空間是“urn:schemas-microsoft-com:asm.v2”。該方案是可擴展的——可添加來自其它名字空間的元素和屬性。XAD僅添加幾個屬性作為http://schemas.microsoft.com/2005/xad/assembly名字空間中定義的擴展。XAD不用元素來擴展部件清單方案。以下參考描述了XAD識別的Fusion部件清單Xml元素和屬性以及XAD添加的屬性。5.3.1部件清單標簽9)“culture”屬性的用途是什么?在.NET中它僅供衛(wèi)星組合件使用。如何處理局部化資源?10)類型屬性的當前用途的問題-被歸檔為“用于后向兼容性”并且可在將來移除-沒有方法來全局地保留值“xad”-類型僅在依賴項上指定時才有意義是否應(yīng)改為在dependentAssembly元素上定義自己的擴展屬性?11)行為映射文件的將來是什么?5.3.2示例部件清單該示例部件清單描述了帶有名字“Demo”和版本“1.0.0.0”的組合件?!癉emo”組合件依賴于以下兩個其它組合件·“Microsoft.XAF.XAD.Framework”——XAD組合件(type="xad")·“DemoEntityBuilders"——.NET組合件(未指定類型)“Demo”組合件具有以下兩個成份文件·DemoTags.xad—XAD文件,最終可包含標簽定義、簽名、實體類型和公有參數(shù)組?!emoDataSchema.xsd—方案文件5.4組合件依賴性通過建立對另一組合件的依賴性,XAD組合件可使用其非內(nèi)部的·實體類型·簽名·標簽定義·參數(shù)組·方案對另一XAD組合件的依賴性是通過在部件清單中包括其在依賴性組合件列表中的身份并指定屬性type="xad"來建立的。無需指定文件或路徑信息。組合件身份在運行時解析且將加載對應(yīng)的組合件(見“組合件綁定、加載和卸載”)。XAD組合件也可依賴于.NET組合件。對.NET組合件的依賴性以與對XAD組合件的依賴性完全相同的方式來建立,除了不指定type屬性或該屬性具有不同值之外。對.NET組合件的依賴性必須在每次在以下各項中由XAD組合件引用.NET類型時建立·實體類型定義·原語標簽定義中的實體引用·原語標簽定義中的實體構(gòu)建器引用·原語標簽定義中的命令類引用·元數(shù)據(jù)此處是應(yīng)用于XAD組合件依賴性的規(guī)則·一個組合件可以依賴于多個組合件(A可依賴于B、C、D等)·多個組合件可以依賴于同一組合件(B、C、D等可依賴于A)·組合件依賴性是非傳遞的(如果A依賴于B且B依賴于C,則A不依賴于C。如有必要,A必須明確地引用C。)·不支持循環(huán)依賴性(如果A依賴于B且B依賴于C,則C不能依賴于A)5.5組合件綁定、加載和卸載綁定是將組合件身份解析到其物理位置的過程。組合件身份不包含如路徑和文件的位置信息。Fusion定義了.NET運行時間使用的組合件綁定算法。XAD長期將使用該綁定算法作為由Fusion提供的服務(wù)。在短期它實現(xiàn)其子算法(Childrenet)。要求所有的非強命名組合件(沒有公鑰標記)必須在應(yīng)用程序文件夾下存在。應(yīng)用程序文件夾是包含根/主組合件的部件清單的文件夾。給定組合件身份,XAD運行時間使用以下算法找出組合件1.如果組合件類型不是“XAD”,則假定它是.NET組合件并將加載委托給.NET框架。2.對XAD組合件,檢查應(yīng)用程序文件夾中具有組合件名稱的部件清單文件并加載它。3.如果未找到,則檢查應(yīng)用程序文件夾中具有組合件名稱的子文件夾。如果找到,則檢查具有組合件名稱的部件清單文件并加載它。4.如果未找到且這是調(diào)試構(gòu)建,則對環(huán)境變量XADPATH中指定的每一文件夾重復步驟2和3。這僅是開發(fā)時的工具。XADPATH中的路徑用分號隔開。一旦找到,由XAD運行時間加載組合件及其所有依賴項。該過程是遞歸的——它對依賴項重復。使每一依賴項的內(nèi)容對依賴組合件可用。重要的是注意,不使組合件的內(nèi)容對所有組合件全局可用,僅對其直接依賴項可用。方案是這一規(guī)則的例外。在加載具有方案成份文件的組合件時,加載方案并將其添加到全局方案集合,從而使得它們對所有組合件可用。然而,這是對當前實現(xiàn)的限制且不應(yīng)被認為是要求。它最可能在將來改變。有兩種方法來加載組合件通過另一組合件部件清單中的靜態(tài)依賴性。在程序設(shè)計上。通過LoadAssemblyCommand。通過低級公有API。從根組合件(應(yīng)用程序組合件)開始并到達其依賴項、其依賴項的依賴項等等,形成靜態(tài)依賴組合件的任意深的圖。XAD運行時間在應(yīng)用程序啟動時加載所有這些組合件。開發(fā)者也可加載不被指定為靜態(tài)依賴項的組合件。編程上加載的組合件的特征作為目標的主情形是對插件(見插件模型以獲得更多細節(jié))的支持。應(yīng)用程序組合件(根)以及所有編程上加載的組合件形成了一組頂層組合件。僅頂層組合件對應(yīng)用程序元數(shù)據(jù)有貢獻。僅具有根組合件的例外的頂層組合件可在編程上卸載。如果組合件沒有作為靜態(tài)依賴項來加載,則即使它稍后也作為頂層組合件在編程上加載,它也不能被卸載。卸載這一組合件僅導致將其從頂層組合件中移除但不從靜態(tài)加載的組合件中移除。5.6打包情形5.6.1單文件應(yīng)用程序“Helloworld”是簡單的單文件應(yīng)用程序的一個示例。單文件應(yīng)用程序具有單個XAD文件,它包含運行該應(yīng)用程序所需的所有信息。最起碼該文件必須包含主標簽的標簽定義——應(yīng)用程序入口點。無需創(chuàng)建組合件或組合件部件清單。對單文件應(yīng)用程序的要求是·僅依賴于標準框架。標準框架默認可用,且無需在組合件部件清單中指定為依賴項。如果應(yīng)用程序僅使用來自標準框架的標簽、類型和簽名,則它無需在其部件清單中指定任何依賴性(部件清單中沒有依賴性部分)。·在單個文件中具有所有標簽。如果僅有一個文件,則應(yīng)用程序不要求部件清單文件的成份文件部分。一旦有多于一個文件,則無論其類型如何,應(yīng)用程序都要求部件清單來描述成份文件。如果滿足這些要求,則應(yīng)用程序完全不要求組合件部件清單,因為所有重要部分都為空。它是單文件應(yīng)用程序。5.6.2導出標簽的庫XAD允許XAD作者通過定義其自己的標簽來擴展語言。最簡單的方式是定義導出標簽,因為它們是由XAD實現(xiàn)的且不需要低級編程技術(shù)。XAD作者最終將提出一組可重復使用的自定義標簽并且希望跨多個組合件和應(yīng)用程序來共享它們。這可通過在分開的組合件中打包標簽來完成,該分開的組合件然后可由其它組合件引用。在以下示例中,有兩個可重復使用的導出標簽,它們在MyTags.xad文件中定義并在MyLibrary組合件中打包。MyLibrary組合件由MyApplication組合件引用,后者使用由該庫提供的標簽。以下是它如何工作的·MyTags.xad文件定義兩個標簽—TextWithLabel和Hyperlink?!yTags.xad文件作為成份文件在MyLibrary部件清單中列出。這使得文件中的所有標簽對MyLibrary組合件客戶端可用?!yApplication組合件引用MyLibrary組合件,并且因此能夠訪問MyLibrary中定義的所有標簽?!yApplication文件使用MyLibrary組合件中定義的Hyperlink標簽。5.6.3原語標簽的庫XAD可通過定義自定義原語或?qū)С鰳撕瀬頂U展。盡管導出標簽更易于定義,因為它們是使用XAD來實現(xiàn)的,但原語標簽可提供更豐富的功能,因為它們是使用如VB和C#的低級編程語言來實現(xiàn)的。這些語言提供了對OS和機器資源的完全訪問。組件、工具和平臺開發(fā)者可定義原語標簽,該標簽可由XAD作者在多個XAD應(yīng)用程序中重復使用。打包原語標簽幾乎與打包導出標簽(見以上示例)相同。有以下兩個主要的不同·標簽定義包含對實體構(gòu)建器類而非XAD主體的引用·包含原語標簽的組合件的部件清單必須指定對包含實體構(gòu)建器的.NET組合件的附加依賴性實體構(gòu)建器是.NET組件,該組件知道如何創(chuàng)建對應(yīng)于原語標簽的實體并對其連線(參見語言概念以獲得關(guān)于實體構(gòu)建器的更多細節(jié))。以下示例將Hyperlink實現(xiàn)為原語標簽客戶端代碼與使用Hyperlink作為導出標簽的代碼相同。客戶端組合件既不展現(xiàn)給來自其它組合件來的標簽的實現(xiàn)細節(jié)也不展現(xiàn)給其依賴項。6.插件模型6.1插件是什么?插件(也稱為內(nèi)插附件或插入件)是自含式軟件包,它擴展了給定軟件應(yīng)用程序的基本特征集而無需升級應(yīng)用程序。插件允許在新特征或第三方擴展變得可用時遞增地添加它們而無需等待并經(jīng)歷昂貴的升級循環(huán)。為使插件體系結(jié)構(gòu)工作有四個重要的要求·必須定義并公布可擴展性協(xié)議·擴展的應(yīng)用程序必須正確地實現(xiàn)可擴展性協(xié)議·插件必須正確地實現(xiàn)可擴展性協(xié)議·應(yīng)用程序必須支持插件的發(fā)現(xiàn)和加載6.2XAD插件模型XAD插件模型基于以下關(guān)鍵概念·組合件的動態(tài)加載·元數(shù)據(jù)驅(qū)動的可擴展性協(xié)議·動態(tài)實體實例化6.2.1組合件的動態(tài)加載插件在組合件中打包。這并不是令人驚奇的,因為XAD應(yīng)用程序的所有部分都在組合件中打包。通常組合件通過組合件部件清單中指定的靜態(tài)依賴項來加載(參見組合件依賴性)。XAD運行時間自動加載所有的靜態(tài)依賴項。在這一情況下,組合件不作為靜態(tài)依賴項在任何部件清單中列出。相反,應(yīng)用程序可使用系統(tǒng)定義的命令<loadAssembly>,通過指定其部件清單路徑來加載組合件。路徑僅是數(shù)據(jù)片斷,并且可從用戶輸入、應(yīng)用程序狀態(tài)、配置文件等中獲得。一旦加載了組合件,更新元數(shù)據(jù)且其實體變得可用于動態(tài)實例化。6.2.2元數(shù)據(jù)驅(qū)動的可擴展性協(xié)議可擴展XAD應(yīng)用程序在單獨的組合件中定義其可擴展性協(xié)議,因此它可由應(yīng)用程序和編寫擴展的第三方兩者來公布和引用。可擴展性協(xié)議具有以下兩個部分·元數(shù)據(jù)方案術(shù)語“元數(shù)據(jù)”一般指的是“關(guān)于數(shù)據(jù)的數(shù)據(jù)”。在本說明書的上下文中,元數(shù)據(jù)用作由插件實現(xiàn)的對特征的描述。元數(shù)據(jù)可包括標簽名、要傳遞的參數(shù)、用于UI的人們可讀文本等??蓴U展應(yīng)用程序定義了元數(shù)據(jù)方案(從插件中所期望的)。插件提供內(nèi)容。·標簽簽名插件通過定義XAD標簽實現(xiàn)其特征。應(yīng)用程序使用這些標簽來訪問插件特征。應(yīng)用程序定義標簽簽名(插件應(yīng)導致什么實體類型以及它們?nèi)∈裁磪?shù)),而插件提供標簽定義(標簽名和實際實現(xiàn))。簽名可與接口相比,而標簽定義可與接口實現(xiàn)相比。XAD支持可通過系統(tǒng)定義的標簽<Matadata>來訪問的全局元數(shù)據(jù)樹。元數(shù)據(jù)樹是來自所有動態(tài)加載的組合件的所有元數(shù)據(jù)成份文件的并集(參見文件類型以獲得關(guān)于成份的細節(jié))。在運行時,每次當加載或卸載具有元數(shù)據(jù)成份文件的組合件時自動更新元數(shù)據(jù)樹。發(fā)送適當?shù)母淖兺ㄖ?,因此?yīng)用程序可動態(tài)地更新其自身。使用元數(shù)據(jù)樹,應(yīng)用程序可發(fā)現(xiàn)加載了什么插件并使用它們提供的特征。6.2.3動態(tài)實體實例化通常,XAD作者直接用XAD代碼編寫XAD標簽。通過使用XAD標簽,作者靜態(tài)地聲明了要由XAD運行時間創(chuàng)建什么實體。插件定義了用于訪問它們實現(xiàn)的特征的標簽。由于插件在編寫應(yīng)用程序時是不可用的,因此XAD作者不可能知道并使用由插件定義的標簽。作者僅知道并靜態(tài)地定義標簽簽名。實際標簽名和最終的參數(shù)值由插件通過元數(shù)據(jù)來提供。應(yīng)用程序完全知道元數(shù)據(jù)方案是什么,因為它是應(yīng)用程序定義的可擴展性協(xié)議的部分。它讀取元數(shù)據(jù)并按照標簽名動態(tài)地實例化實體。XAD支持用于按標簽名來進行動態(tài)實體實例化的系統(tǒng)定義的標簽<DynamicEntity>。僅具有代理的類型的實體可被動態(tài)實例化。實體僅在它們在以下各項中定義時才能被動態(tài)實例化·動態(tài)加載的組合件·組合件的靜態(tài)依賴性組合件,使用DynamicEntity標簽6.3插件情形以下情形描述了可通過插件擴展以支持新文件類型的文件應(yīng)用程序。該應(yīng)用程序的思路是它可打開和顯示任何類型的文件,只要它具有支持該文件類型的插件。該示例具有3個部分·FileExtensionProtocol組合件定義文件應(yīng)用程序的擴展協(xié)議。該擴展協(xié)議由用于各個文件標簽的元數(shù)據(jù)方案和簽名構(gòu)成。它在單獨的組合件中定義,因此應(yīng)用程序和各種插件都可引用它。·File組合件用于文件應(yīng)用程序代碼的組合件。·SmartFilesAddIn組合件。由設(shè)想的公司Smarts.com提供的插件組合件。6.3.1FileExtensionProtocol組合件6.3.2File組合件6.3.3SmartFilesAddIn組合件7.附錄A代碼編寫約定以下是建議的XAD代碼編寫約定的列表。標準XAD框架遵循所有這些約定。第三方可以選擇采用這些約定中的部分或全部。這些約定由XADCop來強制。XADCop是本質(zhì)上類似于.Net框架中的FxCop的XAD專用檢查器。12)$待完成一旦可用,到XADCop文檔的鏈接7.1用于System名字空間的“sys”前綴13)$待完成7.2名字的Pascal外包裝14)$待完成7.3簽名名字必須以“Signature”結(jié)束15)$待完成7.4“Set”參數(shù)的名字必須以“s”結(jié)束16)$待完成7.5“Singular”實體標簽的名字必須不以“s”結(jié)束17)$待完成7.6選擇器標簽的名字必須以“Selector”結(jié)束18)$待完成7.7Param(如果指定)必須是實體的第一個屬性19)$待完成7.8Name(如果指定)必須是實體的Param(如果指定)之后的第一個屬性20)$待完成權(quán)利要求1.一種其上儲存有計算機可執(zhí)行指令的計算機可讀介質(zhì),所述指令在由計算機執(zhí)行時實現(xiàn)一種配置軟件應(yīng)用程序以實現(xiàn)所述軟件應(yīng)用程序的一個或多個功能的方法,包括提供多個應(yīng)用程序組件;基于由所述應(yīng)用程序接收的一個或多個數(shù)據(jù)事件確定連接組件圖的結(jié)構(gòu)以及所述多個組件中的哪些連接到所述多個組件中的其它組件以形成所述連接組件將所述多個應(yīng)用程序組件的一部分配置為所述連接組件圖以提供所述應(yīng)用程序的第一功能;響應(yīng)于由所述多個組件之一接收數(shù)據(jù)事件,由所述多個組件中的一個或多個其它組件調(diào)用一處理;以及響應(yīng)于由所述多個組件中的一個或多個其它組件調(diào)用一處理,重新配置所述連接組件圖以執(zhí)行所述應(yīng)用程序的第二功能。2.如權(quán)利要求1所述的計算機可讀介質(zhì),其特征在于,將所述多個應(yīng)用程序組件的所述部分配置為所述連接組件圖還包括由應(yīng)用程序描述引擎將所述多個組件中的每一個經(jīng)由一公共接口連接到所述多個組件中的一個或多個其它組件,以允許經(jīng)由所述公共接口在不同類型的組件之間傳遞數(shù)據(jù);以及由所述應(yīng)用程序描述引擎實例化所述連接組件圖,包括所述連接組件圖中的連接組件之間的任何連接,使得所述連接組件圖在被執(zhí)行時實現(xiàn)所述應(yīng)用程序的第一功能。3.如權(quán)利要求1所述的計算機可讀介質(zhì),其特征在于基于由所述應(yīng)用程序接收到的一個或多個數(shù)據(jù)事件確定連接組件圖的結(jié)構(gòu)以及所述多個組件中的哪些連接到所述多個組件中的其它組件以形成所述連接組件圖包括確定所述多個組件中的哪些應(yīng)被組合在一起作為所述連接組件圖中的連接組件單元,其中所述連接組件單元是響應(yīng)于由所述應(yīng)用程序接收的一個或多個數(shù)據(jù)事件實現(xiàn)所述應(yīng)用程序的功能所需的;以及將所述多個應(yīng)用程序組件的所述部分配置為所述連接組件圖以提供所述應(yīng)用程序的第一功能包括將應(yīng)被組合在一起的所述多個組件配置為連接組件單元,作為用于響應(yīng)于由所述應(yīng)用程序接收的一個或多個數(shù)據(jù)事件實現(xiàn)所述應(yīng)用程序的功能的組件域。4.如權(quán)利要求1所述的計算機可讀介質(zhì),其特征在于由所述多個組件中的一個或多個其它組件調(diào)用一處理包括在第一處理階段中讀取與負責調(diào)用所述處理的數(shù)據(jù)事件相關(guān)聯(lián)的數(shù)據(jù),并請求表示所述連接組件圖的任何所要求的重新配置的任何數(shù)據(jù);以及在第二處理階段中重新配置所述連接組件圖以實現(xiàn)所述應(yīng)用程序的第二功能。5.如權(quán)利要求3所述的計算機可讀介質(zhì),其特征在于,還包括由所述多個組件中的一個或多個其它組件調(diào)用一處理包括由與所述數(shù)據(jù)事件相關(guān)聯(lián)的組件域調(diào)用一處理;在所述組件域中的第一處理階段中,讀取與負責調(diào)用所述處理的數(shù)據(jù)事件相關(guān)聯(lián)的數(shù)據(jù),并請求表示所述組件域的任何要求的重新配置的任何數(shù)據(jù);以及在所述組件域中的第二處理階段中,重新配置所述組件域以實現(xiàn)所述應(yīng)用程序的第二功能。6.如權(quán)利要求3所述的計算機可讀介質(zhì),其特征在于,被配置在一起作為用于響應(yīng)于由所述應(yīng)用程序接收的一個或多個數(shù)據(jù)事件而實現(xiàn)所述應(yīng)用程序的功能的組件域的所述組件,用作為應(yīng)用程序執(zhí)行的一個單元,該單元用于從配置所述組件域的時刻橫跨到響應(yīng)于要求所述組件域重新配置的數(shù)據(jù)事件而重新配置所述組件域的時刻的生存期。7.如權(quán)利要求2所述的計算機可讀介質(zhì),其特征在于由所述應(yīng)用程序描述引擎實例化所述連接組件圖包括由可用于從所述應(yīng)用程序接收描述所述第一功能的一個或多個應(yīng)用程序描述的應(yīng)用程序描述引擎來實例化所述連接組件圖,并且還包括由所述應(yīng)用程序描述引擎解釋所述一個或多個應(yīng)用程序描述,以確定所述多個組件中的哪些應(yīng)被連接以形成所述連接組件圖。8.如權(quán)利要求7所述的計算機可讀介質(zhì),其特征在于,還包括經(jīng)由所述應(yīng)用程序描述接收用于組合并結(jié)構(gòu)化所述連接組件圖的一個或多個聲明性規(guī)則,其中所述應(yīng)用程序描述引擎還用于根據(jù)經(jīng)由所述應(yīng)用程序描述接收到的所述聲明性規(guī)則來實例化所述連接組件圖。9.如權(quán)利要求7所述的計算機可讀介質(zhì),其特征在于,由可用于從所述應(yīng)用程序接收描述所述第一功能的一個或多個應(yīng)用程序描述的應(yīng)用程序描述引擎實例化所述連接組件圖包括由可用于從所述應(yīng)用程序接收根據(jù)描述所述第一功能的可擴展標記語言結(jié)構(gòu)化的一個或多個應(yīng)用程序描述的應(yīng)用程序描述引擎來實例化所述連接組件圖;并且其中所述應(yīng)用程序描述引擎還用于根據(jù)所述可擴展標記語言結(jié)構(gòu)化數(shù)據(jù)以傳遞給所述多個組件中的一個或多個。10.如權(quán)利要求2所述的計算機可讀介質(zhì),其特征在于在由所述應(yīng)用程序描述引擎實例化所述連接組件圖之前,從包含所述多個組件的組件庫中檢索所述多個組件中構(gòu)成所述連接組件圖的部分。11.如權(quán)利要求10所述的計算機可讀介質(zhì),其特征在于,從包含所述多個組件的組件庫中檢索所述多個組件中構(gòu)成所述連接組件圖的部分包括從由用戶界面連接器、動作組件、數(shù)據(jù)連接器、存取器組件、變換器組件以及接口組件構(gòu)成的組件庫中檢索所述多個組件的部分。12.如權(quán)利要求10所述的計算機可讀介質(zhì),其特征在于,從包含所述多個組件的組件庫中檢索所述多個組件中構(gòu)成所述連接組件圖的部分包括檢索至少一個用戶界面(UI)連接器,所述用戶界面連接器接收一個或多個UI事件并將所述一個或多個UI事件轉(zhuǎn)換成所述數(shù)據(jù)事件,并且接收對應(yīng)于任何改變的數(shù)據(jù)的標準格式數(shù)據(jù)表示并與UI連接以將所述任何改變的數(shù)據(jù)提供給所述UI。13.如權(quán)利要求12所述的計算機可讀介質(zhì),其特征在于,從包含所述多個組件的組件庫中檢索所述多個組件中構(gòu)成所述連接組件圖的部分包括檢索連接到UI連接器的至少一個動作組件,所述動作組件接收所述數(shù)據(jù)事件并將其變換成標準格式動作。14.如權(quán)利要求13所述的計算機可讀介質(zhì),其特征在于,從包含所述多個組件的組件庫中檢索所述多個組件中構(gòu)成所述連接組件圖的部分包括檢索同時連接到所述動作組件和所述UI組件的至少一個數(shù)據(jù)連接器,所述數(shù)據(jù)連接器接收標準格式動作并連接到數(shù)據(jù)存儲以完成在所述數(shù)據(jù)上的標準格式動作,并將所述標準格式數(shù)據(jù)表示發(fā)送給所述UI連接器。15.如權(quán)利要求14所述的計算機可讀介質(zhì),其特征在于,從包含所述多個組件的組件庫中檢索所述多個組件中構(gòu)成所述連接組件圖的部分包括檢索將所述標準格式數(shù)據(jù)表示處理成UI定制格式的至少一個變換器。16.如權(quán)利要求15所述的計算機可讀介質(zhì),其特征在于,從包含所述多個組件的組件庫中檢索所述多個組件中構(gòu)成所述連接組件圖的部分包括檢索將所述標準格式動作處理成標準格式數(shù)據(jù)定制動作的至少一個存取器組件。17.如權(quán)利要求10所述的計算機可讀介質(zhì),其特征在于,從包含所述多個組件的組件庫中檢索所述多個組件中構(gòu)成所述連接組件圖的部分包括檢索實現(xiàn)兩個或多個其它組件之間的接口以允許所述兩個或多個其它組件之間的通信的第三方組件。18.如權(quán)利要求17所述的計算機可讀介質(zhì),其特征在于,還包括實現(xiàn)兩個或多個其它組件之間的接口以允許所述兩個或多個其它組件之間的通信,包括根據(jù)用于實現(xiàn)由所述第三方組件提供給所述應(yīng)用程序描述引擎的接口的一個或多個聲明性規(guī)則來實現(xiàn)所述接口。19.一種配置軟件應(yīng)用程序以實現(xiàn)所述軟件應(yīng)用程序的一個或多個功能的方法,包括提供多個應(yīng)用程序組件;由應(yīng)用程序描述引擎將所述多個組件中的每一個經(jīng)由一公共接口連接到所述多個組件中的一個或多個其它組件,以允許經(jīng)由所述公共接口在不同類型的組件之間傳遞數(shù)據(jù);以及由所述應(yīng)用程序描述引擎實例化由所述多個組件構(gòu)成的連接組件圖,包括所述連接組件圖中的連接組件之間的任何連接,使得所述連接組件圖在被執(zhí)行時實現(xiàn)所述應(yīng)用程序的第一功能。20.一種配置軟件應(yīng)用程序以實現(xiàn)所述軟件應(yīng)用程序的一個或多個功能的方法,包括提供多個應(yīng)用程序組件;由應(yīng)用程序描述引擎將所述多個組件中的每一個經(jīng)由一公共接口連接到所述多個組件中的一個或多個其它組件,以允許經(jīng)由所述公共接口在不同類型的組件之間傳遞數(shù)據(jù);由所述應(yīng)用程序描述引擎實例化由所述多個組件構(gòu)成的連接組件圖,包括所述連接組件圖中的連接組件之間的任何連接,使得所述連接組件圖在被執(zhí)行時實現(xiàn)所述應(yīng)用程序的第一功能;響應(yīng)于由所述多個組件之一接收一數(shù)據(jù)事件,由所述多個組件中的一個或多個其它組件調(diào)用一處理;以及響應(yīng)于由所述多個組件中的一個或多個其它組件調(diào)用一處理,重新配置所述連接組件圖以實現(xiàn)所述應(yīng)用程序的第二功能。全文摘要本發(fā)明涉及XML應(yīng)用程序框架(XAF)。XAF應(yīng)用程序是數(shù)據(jù)驅(qū)動的,使得對計算機系統(tǒng)的所有操作都是以數(shù)據(jù)為焦點的。另外,XAF應(yīng)用程序中使用的組件根據(jù)如何顯示數(shù)據(jù)以及使用什么數(shù)據(jù)類型來實例化和連接。XAF內(nèi)的應(yīng)用程序包括用戶界面(UI)連接器、動作模塊以及數(shù)據(jù)連接器。UI連接器接收UI事件并將UI事件連接到動作模塊。動作模塊從UI事件生成標準格式動作并將其發(fā)送到數(shù)據(jù)連接器。數(shù)據(jù)連接器將標準格式動作轉(zhuǎn)換成改變數(shù)據(jù)存儲中的數(shù)據(jù)的數(shù)據(jù)專用動作。數(shù)據(jù)連接器然后將對應(yīng)于改變的數(shù)據(jù)的標準格式數(shù)據(jù)表示發(fā)送回UI連接器以將改變的數(shù)據(jù)提供給UI。文檔編號G06F15/00GK101512503SQ200680014594公開日2009年8月19日申請日期2006年4月20日優(yōu)先權(quán)日2005年4月29日發(fā)明者A·S·威廉姆斯,C·A·西澤伯斯基,C·威滕伯格申請人:微軟公司