專利名稱::Xml應(yīng)用程序框架的制作方法版權(quán)公告本專利文獻(xiàn)的公開內(nèi)容的一部分包含受版權(quán)保護(hù)的材料。版權(quán)所有者不反對(duì)任何人如在美國(guó)專利商標(biāo)局的專利文件或記錄中那樣對(duì)本專利文獻(xiàn)或?qū)@_內(nèi)容的影印復(fù)制,但是無論如何另外保留所有的版權(quán)。背景一般而言,軟件系統(tǒng)提供了組織和互連計(jì)算機(jī)系統(tǒng)內(nèi)的軟件組件的軟件體系結(jié)構(gòu)。這些軟件組件執(zhí)行向軟件應(yīng)用程序給予其功能的操作。一般而言,應(yīng)用程序以若干特征來操作,這些特征各自具有一個(gè)或多個(gè)組件。組件,以及因此的特征可從將操作剖析成更小且更簡(jiǎn)單任務(wù)的一個(gè)或多個(gè)底層軟件組件來形成。當(dāng)構(gòu)造軟件應(yīng)用程序時(shí),軟件開發(fā)者必須使用諸如C#等開發(fā)語(yǔ)言來創(chuàng)建軟件組件。在創(chuàng)建命令代碼,即向軟件組件給予其功能的軟件代碼時(shí),開發(fā)者必須通過調(diào)用或其它構(gòu)造來創(chuàng)建所有組件之間的鏈接。對(duì)于由應(yīng)用程序提供的任何功能,軟件開發(fā)者一般為執(zhí)行應(yīng)用程序?qū)S霉δ艿乃胁煌浖M件創(chuàng)建代碼,并對(duì)彼此依賴來完成任務(wù)的軟件組件之間的互連手動(dòng)書寫代碼。軟件開發(fā)者創(chuàng)建用戶界面(UI)、數(shù)據(jù)構(gòu)造、以及對(duì)用戶和應(yīng)用程序之間的交互所需的所有操作。在許多應(yīng)用程序中,UI、操作和數(shù)據(jù)構(gòu)造是應(yīng)用程序?qū)S玫?。由此,為了?chuàng)建應(yīng)用程序,軟件開發(fā)者通常創(chuàng)建大量的代碼。另外,軟件開發(fā)者一般組織并創(chuàng)建軟件的不同片段之間的所有相互關(guān)系。為創(chuàng)建任何應(yīng)用程序,軟件開發(fā)者必須是非常熟練的,因?yàn)橛糜趧?chuàng)建應(yīng)用程序的底層語(yǔ)言是復(fù)雜的。由于用于生成應(yīng)用程序的當(dāng)前方法的復(fù)雜性,且由于用于給定應(yīng)用程序的代碼的特殊性及其不可避免的互連性,軟件開發(fā)者無法容易地在沒有巨大努力以及不冒對(duì)現(xiàn)有應(yīng)用程序的損壞的風(fēng)險(xiǎn)的情況下對(duì)當(dāng)前應(yīng)用程序進(jìn)行修改或擴(kuò)展。本發(fā)明正是針對(duì)這些和其它考慮來作出的。概述提供本概述來以簡(jiǎn)化的形式引入以下將在詳細(xì)描述中進(jìn)一步描述的某些概念。本概述并不旨在標(biāo)識(shí)本權(quán)利要求的主題的關(guān)鍵特征或必要特征。本發(fā)明的各實(shí)施例通過提供一種軟件應(yīng)用程序框架來解決上述和其它問題,該框架用于為給定軟件應(yīng)用程序生成運(yùn)行時(shí)結(jié)構(gòu)并用于管理該軟件應(yīng)用程序的執(zhí)行。由本發(fā)明的應(yīng)用程序框架生成的應(yīng)用程序由連接的應(yīng)用程序組件的集合或圖組成。根據(jù)該應(yīng)用程序框架配置的應(yīng)用程序的功能通過將各應(yīng)用程序組件組動(dòng)態(tài)地配置到組件域中來啟用,其中每一域被配置成啟用該應(yīng)用程序的一給定功能,例如顯示字處理文檔中的圖片。為生成用于應(yīng)用程序的運(yùn)行時(shí)結(jié)構(gòu),應(yīng)用程序?qū)⒂糜诿恳凰璧膽?yīng)用程序功能的應(yīng)用程序描述傳遞給應(yīng)用程序描述引擎。該應(yīng)用程序描述提供了用于構(gòu)造和組合組件域的聲明性規(guī)則,且該應(yīng)用程序描述引擎用于基于由應(yīng)用程序接收到的數(shù)據(jù)事件在需要時(shí)解釋用于創(chuàng)建和配置組件域的聲明性規(guī)則。由應(yīng)用程序接收到的數(shù)據(jù)事件可由用戶動(dòng)作,例如,響應(yīng)于對(duì)用戶界面中的功能按鈕或控件或數(shù)據(jù)對(duì)象的用戶選擇來生成。數(shù)據(jù)事件也可由外部改變,例如作為運(yùn)行外部進(jìn)程的結(jié)果由應(yīng)用程序接收或從另一應(yīng)用程序或第三方來源接收的數(shù)據(jù)來生成。根據(jù)一個(gè)實(shí)施例,應(yīng)用程序描述和應(yīng)用程序描述引擎根據(jù)可擴(kuò)展標(biāo)記語(yǔ)言(XML)來結(jié)構(gòu)化和/或操作。盡管可在該應(yīng)用程序框架中使用XML來提供陳述該框架內(nèi)的動(dòng)作或其它發(fā)生事件的標(biāo)準(zhǔn)且簡(jiǎn)單的手段,但是該應(yīng)用程序框架不限于僅使用XML。該應(yīng)用程序描述引擎解釋對(duì)每一所需功能的應(yīng)用程序描述,然后獲得為每一所需功能構(gòu)造組件域所需的應(yīng)用程序組件。根據(jù)一個(gè)實(shí)施例,該應(yīng)用程序描述引擎從與應(yīng)用程序相關(guān)聯(lián)地維護(hù)的組件庫(kù)中獲得應(yīng)用程序組件。例如,該應(yīng)用程序描述引擎可構(gòu)造用于顯示文檔中的文本的一個(gè)域、用于顯示文檔中的圖片對(duì)象的第二個(gè)域、以及用于格式化應(yīng)用程序的功能的第三個(gè)域等等。根據(jù)各實(shí)施例,該應(yīng)用程序框架還包括用于管理應(yīng)用程序的執(zhí)行和包括該應(yīng)用程序的域的執(zhí)行管理模型。當(dāng)在應(yīng)用程序的執(zhí)行期間發(fā)生例如刪除數(shù)據(jù)表中的數(shù)據(jù)項(xiàng)等要求調(diào)用給定應(yīng)用程序功能且因此要求調(diào)用啟用該功能的特定組件域的數(shù)據(jù)事件時(shí),由應(yīng)用程序向主體域分派單個(gè)處理線程以執(zhí)行根據(jù)該數(shù)據(jù)驅(qū)動(dòng)事件的域的組件。一旦單個(gè)處理線程進(jìn)入主體域,該域的組件由該線程根據(jù)執(zhí)行階段模型來執(zhí)行。在第一階段,即讀取/請(qǐng)求階段,讀取所需數(shù)據(jù),例如,要從表對(duì)象中刪除的一個(gè)值,隨后是所需改變的請(qǐng)求,例如,從示例表對(duì)象中刪除所請(qǐng)求的值的請(qǐng)求。在第二階段,即重新確認(rèn)/重新配置階段期間,由應(yīng)用程序描述引擎根據(jù)所請(qǐng)求的改變重新確認(rèn)或重新配置該主體域。即,應(yīng)用程序描述引擎在必要時(shí)根據(jù)適用于數(shù)據(jù)改變的新配置來重新配置該域。在重新配置階段期間,應(yīng)用程序描述引擎可丟棄該域的某些組件、獲得該域的新組件或?qū)⒃撚蛲耆珡U棄。由此,給定域是具有等于初始配置和后續(xù)的重新配置之間的時(shí)間的生存期的組件的集合,其中后續(xù)的重新配置進(jìn)而開始給定域的下一配置(如果有)的生存期。因此,由應(yīng)用程序描述引擎生成的每一組件域用作執(zhí)行應(yīng)用程序的給定數(shù)據(jù)驅(qū)動(dòng)功能所需的組件的集合,且該域具有由應(yīng)用程序?qū)υ撚虻姆?wù)的需求所確定的生存期。本發(fā)明及其改進(jìn)的更全面理解可通過參考以下簡(jiǎn)要概述的附圖、以下本發(fā)明示例性實(shí)施例的詳細(xì)描述以及所附權(quán)利要求書來獲得。附圖簡(jiǎn)述圖1A是示出一種計(jì)算環(huán)境和基本計(jì)算設(shè)備的功能圖,它們可用根據(jù)本發(fā)明的應(yīng)用程序框架來構(gòu)造應(yīng)用程序并在該框架下執(zhí)行應(yīng)用程序。圖1B示出了一計(jì)算機(jī)屏幕顯示,它示出了由示出一個(gè)或多個(gè)顯示數(shù)據(jù)對(duì)象的示例字處理應(yīng)用程序顯示的一個(gè)示例字處理文檔。圖2A是示出根據(jù)本發(fā)明的應(yīng)用程序、應(yīng)用程序描述引擎和一個(gè)或多個(gè)組件域之間的交互的功能圖。圖2B是示出根據(jù)本發(fā)明的具有連接到一個(gè)或多個(gè)UI以及一個(gè)或多個(gè)數(shù)據(jù)存儲(chǔ)的應(yīng)用程序組件的應(yīng)用程序框架的一個(gè)示例性實(shí)施例的功能圖。圖3是示出根據(jù)本發(fā)明的具有連接在UI和數(shù)據(jù)存儲(chǔ)之間并由示例性應(yīng)用程序描述和示例性XAD引擎配置或重新配置的多個(gè)應(yīng)用程序的XML應(yīng)用程序框架的另一示例性實(shí)施例的功能圖。圖4是示出根據(jù)本發(fā)明的用于執(zhí)行XAF應(yīng)用程序內(nèi)的事件的方法的一個(gè)實(shí)施例的流程圖。圖5是示出根據(jù)本發(fā)明的用于創(chuàng)建和配置或重新配置XAF應(yīng)用程序的一個(gè)實(shí)施例的流程圖。圖6示出了數(shù)據(jù)層的組織并示出了數(shù)據(jù)層和包括數(shù)據(jù)存儲(chǔ)和數(shù)據(jù)客戶端的其它組件之間的連接。圖7示出了事務(wù)變換操作的操作流程。圖8示出了根據(jù)事務(wù)變換操作執(zhí)行的控制操作。圖9示出了在本發(fā)明的一個(gè)實(shí)施例中執(zhí)行的操作的操作流程。圖10是對(duì)根據(jù)本發(fā)明的可在計(jì)算環(huán)境中操作以要求軟件方法執(zhí)行的多層分階段模型的一個(gè)實(shí)施例。圖11是根據(jù)本發(fā)明的具有分階段模型中的用于定制軟件方法執(zhí)行的軟件組件的模塊化軟件系統(tǒng)的一個(gè)實(shí)施例。圖12是根據(jù)本發(fā)明的在整個(gè)計(jì)算機(jī)系統(tǒng)上操作以對(duì)該系統(tǒng)內(nèi)定制任何軟件方法執(zhí)行的第一或頂層階段模型或空間的一個(gè)實(shí)施例。圖13是根據(jù)本發(fā)明的可在主階段空間的一個(gè)或多個(gè)階段期間操作以定制對(duì)數(shù)據(jù)的檢索和寫入的子-階段空間的一個(gè)實(shí)施例。圖14A和圖14B是根據(jù)本發(fā)明的可在主階段空間的一個(gè)或多個(gè)階段期間操作以定制對(duì)即插即用系統(tǒng)的配置和操作的子-階段空間的一個(gè)實(shí)施例。圖15示出了根據(jù)本發(fā)明的包含聲明關(guān)于軟件方法對(duì)特定階段的執(zhí)行的約束的階段約束屬性的數(shù)據(jù)結(jié)構(gòu)或語(yǔ)言屬性。圖16A和16B示出了根據(jù)本發(fā)明的用于將計(jì)算機(jī)系統(tǒng)的操作分階段的方法的一個(gè)實(shí)施例。圖17是根據(jù)本發(fā)明的可用于提供并儲(chǔ)存在分階段域中操作的用戶聯(lián)系人信息的示例性計(jì)算機(jī)系統(tǒng)。圖18示出了根據(jù)本發(fā)明的一個(gè)實(shí)施例的被配置成并發(fā)地執(zhí)行多個(gè)對(duì)象的示例系統(tǒng)。圖19示出了根據(jù)本發(fā)明的一個(gè)實(shí)施例的被配置成并發(fā)地執(zhí)行多個(gè)對(duì)象的另一示例系統(tǒng)。圖20描繪了內(nèi)部、單線程對(duì)象和外部對(duì)象之間的異步通信。圖21示出了當(dāng)并發(fā)性域與數(shù)據(jù)庫(kù)接口時(shí)的示例執(zhí)行路徑。圖22示出了其中第一并發(fā)性域與數(shù)據(jù)庫(kù)接口的操作流程圖。圖23示出了當(dāng)?shù)谝徊l(fā)性域與第二并發(fā)性域接口時(shí)的示例執(zhí)行路徑。圖24示出了其中第一并發(fā)性域與第二并發(fā)性域接口的操作流程圖。圖25是與被創(chuàng)建來形成可執(zhí)行應(yīng)用程序的數(shù)據(jù)和對(duì)象有關(guān)的應(yīng)用程序描述的高級(jí)描繪。圖26示出了在被執(zhí)行來創(chuàng)建并連接應(yīng)用程序組件圖時(shí)的圖25中所示的應(yīng)用程序描述。圖27示出了圖25和26的應(yīng)用程序描述的內(nèi)部組件與用于處理和/或查看數(shù)據(jù)的結(jié)果對(duì)象之間的相互關(guān)系。圖28是示出其中執(zhí)行標(biāo)記語(yǔ)言的本發(fā)明的一個(gè)實(shí)施例的操作特性的流程圖。圖29是示出其中應(yīng)用程序被動(dòng)態(tài)配置的本發(fā)明的一個(gè)實(shí)施例的操作特性的流程圖。圖30示出了由本發(fā)明的一個(gè)實(shí)施例中的創(chuàng)建操作執(zhí)行的操作的操作流程。詳細(xì)描述現(xiàn)在將參考其中示出本發(fā)明的實(shí)施例的附圖來更全面描述本發(fā)明。然而,本發(fā)明可以用許多不同的形式來具體化,且不應(yīng)被解釋為限于此處所述的實(shí)施例。相反,提供這些實(shí)施例以致力于使得公開內(nèi)容全面且完整,并使得它能夠向本領(lǐng)域的技術(shù)人員完全傳達(dá)本發(fā)明的范圍。如上簡(jiǎn)要描述的,本發(fā)明的各實(shí)施例提供了一種用于為給定應(yīng)用程序生成運(yùn)行時(shí)結(jié)構(gòu)并用于管理軟件應(yīng)用程序的執(zhí)行的軟件應(yīng)用程序框架。給定軟件應(yīng)用程序的運(yùn)行時(shí)結(jié)構(gòu)由執(zhí)行該軟件應(yīng)用程序的一個(gè)或多個(gè)相應(yīng)功能所需的一個(gè)或多個(gè)應(yīng)用程序組件域組合。組件域由應(yīng)用程序描述引擎響應(yīng)于對(duì)每一域從應(yīng)用程序接收的應(yīng)用程序描述來生成。在應(yīng)用程序的執(zhí)行期間,每一組件域用作應(yīng)用程序執(zhí)行管理的單元,其中每一域用于執(zhí)行該應(yīng)用程序的相應(yīng)功能。當(dāng)應(yīng)用程序接收到與給定組件域相關(guān)聯(lián)的數(shù)據(jù)改變時(shí),該組件域由應(yīng)用程序描述引擎按需重新配置以響應(yīng)于該相關(guān)聯(lián)的數(shù)據(jù)。應(yīng)用程序接收的數(shù)據(jù)改變或事件可由用戶動(dòng)作,例如響應(yīng)于對(duì)用戶界面中的功能按鈕或控件或數(shù)據(jù)對(duì)象的用戶選擇來生成。數(shù)據(jù)事件也可由外部改變,例如作為運(yùn)行外部進(jìn)行的結(jié)果由應(yīng)用程序接收的或從另一應(yīng)用程序或第三方來源接收的數(shù)據(jù)來生成。由此,應(yīng)用程序是基于由應(yīng)用程序接收和/或處理的數(shù)據(jù)來組織和動(dòng)態(tài)重新配置的連接組件的集合或圖。其中可實(shí)現(xiàn)本發(fā)明的合適的計(jì)算系統(tǒng)環(huán)境100的一個(gè)示例在圖1中示出。計(jì)算系統(tǒng)環(huán)境100僅為合適的計(jì)算環(huán)境的一個(gè)示例,并非對(duì)本發(fā)明的使用范圍或功能提出任何局限。也不應(yīng)將計(jì)算環(huán)境100解釋為對(duì)示例性操作環(huán)境100中示出的任一組件或其組合具有任何依賴或需求。本發(fā)明可以使用眾多其它通用或?qū)S糜?jì)算系統(tǒng)環(huán)境或配置來操作。適用于本發(fā)明的眾所周知的計(jì)算系統(tǒng)、環(huán)境和/或配置包括但不限于個(gè)人計(jì)算機(jī)、服務(wù)器計(jì)算機(jī)、手持式或膝上設(shè)備、多處理器系統(tǒng)、基于微處理器的系統(tǒng)、機(jī)頂盒、可編程消費(fèi)者電子設(shè)備、網(wǎng)絡(luò)PC、小型機(jī)、大型機(jī)、包括任一上述系統(tǒng)或設(shè)備的分布式計(jì)算環(huán)境等等。本發(fā)明可以在諸如程序模塊等由計(jì)算機(jī)執(zhí)行的計(jì)算機(jī)可執(zhí)行指令的一般上下文中描述。一般而言,程序模塊包括例程、程序、對(duì)象、組件、數(shù)據(jù)結(jié)構(gòu)等等,它們執(zhí)行特定的任務(wù)或?qū)崿F(xiàn)特定的抽象數(shù)據(jù)類型。本發(fā)明也可以在分布式計(jì)算環(huán)境中實(shí)踐,其中,任務(wù)由通過通信網(wǎng)絡(luò)鏈接的本地和遠(yuǎn)程處理設(shè)備來執(zhí)行。在分布式計(jì)算環(huán)境中,程序模塊可以位于包括存儲(chǔ)器存儲(chǔ)設(shè)備的本地和遠(yuǎn)程計(jì)算機(jī)存儲(chǔ)介質(zhì)中。參考圖1A,用于實(shí)現(xiàn)本發(fā)明的示例性計(jì)算機(jī)系統(tǒng)100包括計(jì)算機(jī)110形式的通用計(jì)算設(shè)備。計(jì)算機(jī)110的組件可包括但不限于,處理單元120、系統(tǒng)存儲(chǔ)器130以及將包括系統(tǒng)存儲(chǔ)器130的各類系統(tǒng)組件耦合至處理單元120的系統(tǒng)總線121。系統(tǒng)總線121可以是若干種總線結(jié)構(gòu)類型的任一種,包括存儲(chǔ)器總線或存儲(chǔ)器控制器、外圍總線以及使用各類總線體系結(jié)構(gòu)中的任一種的局部總線。作為示例而非局限,這類體系結(jié)構(gòu)包括工業(yè)標(biāo)準(zhǔn)體系結(jié)構(gòu)(ISA)總線、微通道體系結(jié)構(gòu)(MCA)總線、增強(qiáng)ISA(EISA)總線、視頻電子技術(shù)標(biāo)準(zhǔn)協(xié)會(huì)(VESA)局部總線以及外圍部件互連(PCI)總線,也稱為Mezzanine總線。計(jì)算機(jī)110通常包括各種計(jì)算機(jī)可讀介質(zhì)。計(jì)算機(jī)可讀介質(zhì)可以是可由計(jì)算機(jī)110訪問的任一可用介質(zhì),包括易失性和非易失性介質(zhì)、可移動(dòng)和不可移動(dòng)介質(zhì)。作為示例而非局限,計(jì)算機(jī)可讀介質(zhì)包括計(jì)算機(jī)存儲(chǔ)介質(zhì)和通信介質(zhì)。計(jì)算機(jī)存儲(chǔ)介質(zhì)包括以用于儲(chǔ)存諸如計(jì)算機(jī)可讀指令、數(shù)據(jù)結(jié)構(gòu)、程序模塊或其它數(shù)據(jù)等信息的任一方法或技術(shù)實(shí)現(xiàn)的易失性和非易失性,可移動(dòng)和不可移動(dòng)介質(zhì)。計(jì)算機(jī)存儲(chǔ)介質(zhì)包括但不限于,RAM、ROM、EEPROM、閃存或其它存儲(chǔ)器技術(shù)、CD-ROM、數(shù)字多功能盤(DVD)或其它光盤存儲(chǔ)、磁帶盒、磁帶、磁盤存儲(chǔ)或其它磁存儲(chǔ)設(shè)備、或可以用來儲(chǔ)存所預(yù)期的信息并可由計(jì)算機(jī)110訪問的任一其它介質(zhì)。通信介質(zhì)通常具體化為諸如載波或其它傳輸機(jī)制的已調(diào)制數(shù)據(jù)信號(hào)中的計(jì)算機(jī)可讀指令、數(shù)據(jù)結(jié)構(gòu)、程序模塊或其它數(shù)據(jù),并包括任一信息傳送介質(zhì)。術(shù)語(yǔ)“已調(diào)制數(shù)據(jù)信號(hào)”指以對(duì)信號(hào)中的信息進(jìn)行編碼的方式設(shè)置或改變其一個(gè)或多個(gè)特征的信號(hào)。作為示例而非局限,通信介質(zhì)包括有線介質(zhì),如有線網(wǎng)絡(luò)或直接連線連接,以及無線介質(zhì),如聲學(xué)、RF、紅外和其它無線介質(zhì)。上述任一的組合也應(yīng)當(dāng)包括在計(jì)算機(jī)可讀介質(zhì)的范圍之內(nèi)。系統(tǒng)存儲(chǔ)器130包括以易失性和/或非易失性存儲(chǔ)器形式的計(jì)算機(jī)存儲(chǔ)介質(zhì),如只讀存儲(chǔ)器(ROM)131和隨機(jī)存取存儲(chǔ)器(RAM)132?;据斎?輸出系統(tǒng)133(BIOS)包括如在啟動(dòng)時(shí)幫助在計(jì)算機(jī)110內(nèi)的元件之間傳輸信息的基本例程,通常儲(chǔ)存在ROM131中。RAM132通常包含處理單元120立即可訪問或者當(dāng)前正在操作的數(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í)行用于儲(chǔ)存在RAM132中或從其中執(zhí)行的所有軟件的應(yīng)用程序。計(jì)算機(jī)110也可包括其它可移動(dòng)/不可移動(dòng)、易失性/非易失性計(jì)算機(jī)存儲(chǔ)介質(zhì)。僅作示例,圖1A示出了計(jì)算機(jī)110具有對(duì)不可移動(dòng)、非易失性磁介質(zhì)141,如硬盤驅(qū)動(dòng)器進(jìn)行讀寫的不可移動(dòng)、非易失性存儲(chǔ)器接口140。計(jì)算機(jī)110還可包括對(duì)諸如磁盤驅(qū)動(dòng)器等設(shè)備151進(jìn)行讀寫的非易失性存儲(chǔ)器接口150,設(shè)備151對(duì)諸如磁盤等可移動(dòng)、非易失性介質(zhì)152進(jìn)行讀寫。另外,計(jì)算機(jī)110可包括對(duì)諸如CDROM或其它光學(xué)介質(zhì)等可移動(dòng)、非易失性光盤156進(jìn)行讀寫的光盤驅(qū)動(dòng)器155??梢栽谑纠圆僮鳝h(huán)境中使用的其它可移動(dòng)/不可移動(dòng)、易失性/非易失性計(jì)算機(jī)存儲(chǔ)介質(zhì)包括但不限于,磁帶盒、閃存卡、數(shù)字多功能盤、數(shù)字錄像帶、固態(tài)RAM、固態(tài)ROM等等。硬盤驅(qū)動(dòng)器141通常通過不可移動(dòng)存儲(chǔ)器接口,如接口140連接到系統(tǒng)總線121,磁盤驅(qū)動(dòng)器151和光盤驅(qū)動(dòng)器155通常通過可移動(dòng)存儲(chǔ)器接口,如接口150連接到系統(tǒng)總線121。上文討論并在圖1A中示出的驅(qū)動(dòng)器及其關(guān)聯(lián)的計(jì)算機(jī)存儲(chǔ)介質(zhì)為計(jì)算機(jī)110提供了計(jì)算機(jī)可讀指令、數(shù)據(jù)結(jié)構(gòu)、程序模塊和其它數(shù)據(jù)的存儲(chǔ)。例如,示出硬盤驅(qū)動(dòng)器141儲(chǔ)存操作系統(tǒng)144、應(yīng)用程序145、其它程序模塊146和程序數(shù)據(jù)147,它們可以與操作系統(tǒng)134、應(yīng)用程序135、其它程序模塊136和程序數(shù)據(jù)137相同,也可以與它們不同。這里對(duì)操作系統(tǒng)144、應(yīng)用程序145、其它程序模塊146和程序數(shù)據(jù)147給予不同的標(biāo)號(hào)來說明至少它們是不同的副本。用戶可以通過鏈接到用戶輸入設(shè)備,如鍵盤162和定位設(shè)備161的用戶輸入接口160向計(jì)算機(jī)110輸入命令和信息。其它輸入設(shè)備(未示出)可包括話筒、操縱桿、游戲墊、圓盤式衛(wèi)星天線、掃描儀等等。這些和其它輸入設(shè)備通常通過耦合至系統(tǒng)總線121的用戶輸入接口160連接至處理單元120,但是也可以通過其它接口和總線結(jié)構(gòu)連接,如并行端口、游戲端口或通用串行總線(USB)。監(jiān)視器191或其它類型的顯示設(shè)備也通過接口,如視頻接口190連接至系統(tǒng)總線121。除監(jiān)視器之外,計(jì)算機(jī)110也可包括其它外圍輸出設(shè)備,如揚(yáng)聲器194和打印機(jī)193,它們通過輸出外圍接口192連接。計(jì)算機(jī)110可以使用到一個(gè)或多個(gè)遠(yuǎn)程計(jì)算機(jī),如遠(yuǎn)程計(jì)算機(jī)180的邏輯連接在網(wǎng)絡(luò)化環(huán)境中操作。遠(yuǎn)程計(jì)算機(jī)180可以是個(gè)人計(jì)算機(jī)、服務(wù)器、路由器、網(wǎng)絡(luò)PC、對(duì)等設(shè)備或其它常見的網(wǎng)絡(luò)節(jié)點(diǎn),并通常包括許多或所有以上相對(duì)于計(jì)算機(jī)110所描述的元件,盡管在圖1A中僅示出了存儲(chǔ)器存儲(chǔ)設(shè)備181。圖1A描述的邏輯連接包括局域網(wǎng)(LAN)171和廣域網(wǎng)(WAN)173,但也可包括其它網(wǎng)絡(luò),如無線網(wǎng)絡(luò)。這類網(wǎng)絡(luò)環(huán)境常見于辦公室、企業(yè)范圍計(jì)算機(jī)網(wǎng)絡(luò)、內(nèi)聯(lián)網(wǎng)以及因特網(wǎng)中。當(dāng)在LAN網(wǎng)絡(luò)環(huán)境中使用時(shí),計(jì)算機(jī)110通過網(wǎng)絡(luò)接口或適配器170連接至LAN171。當(dāng)在WAN網(wǎng)絡(luò)環(huán)境中使用時(shí),計(jì)算機(jī)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)境中,相對(duì)于計(jì)算機(jī)110所描述的程序模塊或其部分可儲(chǔ)存在遠(yuǎn)程存儲(chǔ)器存儲(chǔ)設(shè)備181中。作為示例而非局限,遠(yuǎn)程應(yīng)用程序185駐留在存儲(chǔ)器設(shè)備181上。可以理解,示出的網(wǎng)絡(luò)連接是示例性的,且可以使用在計(jì)算機(jī)之間建立通信鏈路的其它裝置。為理解和說明起見,按照其中顯示示例數(shù)據(jù)對(duì)象的示例應(yīng)用程序用戶界面來描述本發(fā)明的各實(shí)施例將是有利的。圖1B示出了顯示一示例字處理文檔的計(jì)算機(jī)屏幕顯示,該文檔由示出一個(gè)或多個(gè)所顯示的數(shù)據(jù)對(duì)象的示例字處理應(yīng)用程序來顯示。示例用戶界面195示出了用戶可用于根據(jù)相關(guān)聯(lián)軟件應(yīng)用程序的功能來輸入、編輯或另外處理一個(gè)或多個(gè)數(shù)據(jù)對(duì)象的典型的軟件應(yīng)用程序用戶界面。例如,用戶界面195示出了一個(gè)示例字處理應(yīng)用程序,它在頂部具有一個(gè)或多個(gè)功能控件,包括“File(文件)”控件、“Edit(編輯)”控件、“View(視圖)”控件和“Other(其它)”控件。應(yīng)當(dāng)理解,圖1B所示的功能控件僅出于示例的目的,并非對(duì)適用于本發(fā)明的軟件應(yīng)用程序中可用的大量用戶界面類型、布局和相關(guān)聯(lián)功能的限制。用戶界面195包括滾動(dòng)條199,用于如用戶所需地向上或向下滾動(dòng)用戶界面工作區(qū)中包含的數(shù)據(jù)。一個(gè)示例字處理文檔在用戶界面195的工作區(qū)中示出。該示例文檔,例如信、備忘錄、報(bào)表等包括文本對(duì)象196、嵌入的圖片對(duì)象197、以及嵌入的表格對(duì)象198。仍參考圖1B,顯示在用戶界面195中的文檔由用戶滾動(dòng),使得文本對(duì)象196在頁(yè)面的頂部,嵌入的圖片對(duì)象197被顯示在兩個(gè)文本對(duì)象之間,而表格對(duì)象198在頁(yè)面底部部分可見。即,表格對(duì)象198正進(jìn)入視圖,但是尚未完全顯示在用戶界面195的工作區(qū)中。如將在以下詳細(xì)描述的,根據(jù)本發(fā)明的各實(shí)施例,負(fù)責(zé)顯示示例用戶界面195和示例數(shù)據(jù)對(duì)象196、197、198的軟件應(yīng)用程序是被一起分組在邏輯分組中的相關(guān)組件的集合或圖,或者是用于提供應(yīng)用程序所需的功能的域。在任何給定實(shí)例下,應(yīng)用程序包括由這些相關(guān)組件的邏輯分組構(gòu)成的運(yùn)行時(shí)結(jié)構(gòu),此處被稱為域,它是在該實(shí)例下提供應(yīng)用程序的功能所需的。當(dāng)執(zhí)行應(yīng)用程序時(shí),基于應(yīng)用程序接收到的數(shù)據(jù)的改變以及應(yīng)用程序處理該數(shù)據(jù)改變所需的相關(guān)聯(lián)功能來動(dòng)態(tài)地配置組件域。例如,仍參考圖1B,用于當(dāng)前顯示在用戶界面195中的文檔的一個(gè)說明性運(yùn)行時(shí)結(jié)構(gòu)包括文本域,該文本域包括顯示和處理文本對(duì)象196所需的應(yīng)用程序組件。包括了包含顯示和處理圖片對(duì)象197所需的應(yīng)用程序組件的圖片域,包括了包含顯示和處理顯示在圖片對(duì)象197之下的第二文本對(duì)象所需的應(yīng)用程序組件的第二文本域,并包括了包含顯示進(jìn)入的表格對(duì)象198所需的應(yīng)用程序組件的表格域。與本運(yùn)行時(shí)結(jié)構(gòu)相關(guān)聯(lián)的其它組件域包括用于其它功能的應(yīng)用程序組件,包括滾動(dòng)條199的位置和移動(dòng)、用戶界面中的功能控件的位置和顯示屬性、以及提供當(dāng)前要求的功能所需的應(yīng)用程序的任何其它方面。如以下將詳細(xì)描述的,在其中數(shù)據(jù)事件由應(yīng)用程序接收的應(yīng)用程序執(zhí)行期間,組件域的運(yùn)行時(shí)結(jié)構(gòu)響應(yīng)于數(shù)據(jù)驅(qū)動(dòng)的事件按要求被動(dòng)態(tài)重新確認(rèn)和/或重新配置。例如,如果用戶選擇圖片對(duì)象197來刪除或進(jìn)行其它修改,則應(yīng)用程序?qū)?shù)據(jù)改變傳遞給應(yīng)用程序描述引擎,后者動(dòng)態(tài)地重新配置負(fù)責(zé)顯示圖片對(duì)象197的組件域,使得該組件域?qū)ㄓ糜诨谒邮盏臄?shù)據(jù)事件,例如圖片對(duì)象197的刪除或其它修改來顯示圖片對(duì)象197的適當(dāng)?shù)膽?yīng)用程序組件。在應(yīng)用程序所需的新功能,例如,諸如將表格對(duì)象198等新數(shù)據(jù)對(duì)象輸入到用戶界面195中的視圖中的情況下,應(yīng)用程序?qū)⒃L問應(yīng)用程序描述引擎來生成由顯示傳入的數(shù)據(jù)對(duì)象所需的一個(gè)或多個(gè)應(yīng)用程序組件構(gòu)成的新組件域。圖2A是示出應(yīng)用程序、應(yīng)用程序描述引擎以及一個(gè)或多個(gè)組件域之間的交互的功能圖。根據(jù)本發(fā)明的各實(shí)施例,提供了用于將應(yīng)用程序配置為用于執(zhí)行該應(yīng)用程序的一個(gè)或多個(gè)功能的連接組件圖的應(yīng)用程序框架。參考圖2A,應(yīng)用程序204、304示出了用于根據(jù)對(duì)相應(yīng)應(yīng)用程序的編程來提供一個(gè)或多個(gè)有用功能的任何軟件應(yīng)用程序,例如字處理應(yīng)用程序、電子表格應(yīng)用程序、幻燈片演示應(yīng)用程序、數(shù)據(jù)庫(kù)應(yīng)用程序、桌面出版應(yīng)用程序、電子郵件應(yīng)用程序以及日歷應(yīng)用程序等。實(shí)際上,如從以下描述中將理解的,本發(fā)明的各實(shí)施例不限于任何特定的軟件應(yīng)用程序。根據(jù)本發(fā)明的各實(shí)施例,應(yīng)用程序204、304由多個(gè)應(yīng)用程序組件構(gòu)成,其每一個(gè)都由軟件開發(fā)者創(chuàng)建,用于獨(dú)立于其它組件或與其它組件相關(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ù)顯示等,是由當(dāng)一起操作時(shí)啟用并提供預(yù)期功能的應(yīng)用程序組件來啟用的。例如,以上在圖1B中示出的給定軟件應(yīng)用程序的用于顯示文本對(duì)象196或圖片對(duì)象197的功能可包括必須根據(jù)提供所需功能的特定序列來執(zhí)行的多個(gè)應(yīng)用程序組件。如上所述,應(yīng)用程序204、304在任何時(shí)刻,不論在運(yùn)行時(shí)結(jié)構(gòu)的給定實(shí)例下還是在給定執(zhí)行期間,都是連接的應(yīng)用程序組件的一個(gè)集合或圖。對(duì)不同應(yīng)用程序組件以及不同應(yīng)用程序組件之間的交互的詳細(xì)描述在以下參考圖2B、3、4、5來描述。如上簡(jiǎn)要描述的,在任何給定時(shí)刻,應(yīng)用程序204、304包括一運(yùn)行時(shí)結(jié)構(gòu),它是應(yīng)用程序在該時(shí)刻所需的連接的應(yīng)用程序組件的實(shí)例化。如下所述,在應(yīng)用程序執(zhí)行期間,應(yīng)用程序組件的實(shí)例化基于應(yīng)用程序所接收的數(shù)據(jù)按應(yīng)用程序改變所需來動(dòng)態(tài)地重新配置。為了生成應(yīng)用程序組件的給定運(yùn)行時(shí)結(jié)構(gòu),應(yīng)用程序204、304將每一所需功能的應(yīng)用程序描述從應(yīng)用程序描述318傳遞到應(yīng)用程序描述引擎320。應(yīng)用程序描述318的詳細(xì)描述以及應(yīng)用程序描述引擎的操作在以下被提供。例如,回頭參考圖1B,用于用戶界面195的運(yùn)行時(shí)結(jié)構(gòu)的實(shí)例化和相關(guān)聯(lián)的數(shù)據(jù)將要求應(yīng)用程序組件顯示用戶界面195及其相關(guān)聯(lián)的功能控件,即文本對(duì)象196、圖片對(duì)象197、進(jìn)入的表格對(duì)象198,并顯示滾動(dòng)條199的當(dāng)前位置。應(yīng)用程序204、304將用于應(yīng)用程序當(dāng)前所需的功能的應(yīng)用程序描述傳遞給應(yīng)用程序配置或描述引擎320,用于生成和配置提供這些功能中的每一個(gè)所需的應(yīng)用程序組件的分組。根據(jù)本發(fā)明的一個(gè)實(shí)施例,從應(yīng)用程序傳遞給應(yīng)用程序描述引擎的應(yīng)用程序描述包括如下參考圖2B和3描述的根據(jù)可擴(kuò)展標(biāo)記語(yǔ)言(XML)結(jié)構(gòu)化并格式化的聲明性規(guī)則。應(yīng)用程序描述引擎320是包含用于解釋從應(yīng)用程序204、304接收到的每一所需功能的應(yīng)用程序描述并用于構(gòu)建和配置向應(yīng)用程序204、304提供所需功能的應(yīng)用程序組件分組(此處稱為組件域或并發(fā)性域)的足夠的計(jì)算機(jī)可執(zhí)行指令的軟件模塊。根據(jù)一個(gè)實(shí)施例,應(yīng)用程序描述引擎320如下參考圖2B、3、4、5所述根據(jù)可擴(kuò)展標(biāo)記語(yǔ)言來操作。應(yīng)用程序描述引擎的功能和操作在以下參考圖3且在“應(yīng)用程序描述語(yǔ)言”的標(biāo)題下詳細(xì)描述。一旦應(yīng)用程序描述引擎320從應(yīng)用程序204、304接收到與應(yīng)用程序所需的功能相關(guān)聯(lián)的應(yīng)用程序描述,該應(yīng)用程序描述引擎即按照滿足每一所描述的功能,例如如圖1B所示的顯示圖片對(duì)象197所需的應(yīng)用程序組件來解釋應(yīng)用程序描述。一旦應(yīng)用程序描述引擎確定了所需的組件以及所需組件之間的關(guān)系,應(yīng)用程序描述引擎320即從組件庫(kù)322中獲得所需的應(yīng)用程序組件,包括所需的組件接口。根據(jù)本發(fā)明的各實(shí)施例,組件庫(kù)322可以是與如字處理應(yīng)用程序等特定應(yīng)用程序相關(guān)聯(lián)的應(yīng)用程序組件的集合或庫(kù),或者組件庫(kù)可以是應(yīng)用程序描述引擎320從中可獲得用于向多個(gè)不同類型的應(yīng)用程序,如字處理應(yīng)用程序、電子表格應(yīng)用程序、幻燈片演示應(yīng)用程序、數(shù)據(jù)庫(kù)應(yīng)用程序等提供功能的組件的組件集合。一旦應(yīng)用程序描述引擎獲得了所需的應(yīng)用程序組件(例如,軟件編程的個(gè)別模塊),該應(yīng)用程序描述引擎即創(chuàng)建用于應(yīng)用程序204、304當(dāng)前所需的功能的每一個(gè)的組件域。如圖2A中所示,響應(yīng)于應(yīng)用程序204、304對(duì)圖1B所示的數(shù)據(jù)的當(dāng)前數(shù)據(jù)顯示需求,應(yīng)用程序描述引擎320創(chuàng)建用于文本對(duì)象196的第一組件域250、用于圖片對(duì)象197的第二組件域、以及用于表格對(duì)象198的第三組件域260。即,這些組件域中的每一個(gè)由應(yīng)用程序描述引擎320創(chuàng)建,使得每一域包括提供該應(yīng)用目前要求的功能所需的那些應(yīng)用程序組件。例如,圖片域255由應(yīng)用程序描述引擎320生成,以包括應(yīng)用程序204、304以其當(dāng)前的顯示特性和屬性顯示圖片對(duì)象197所需的那些應(yīng)用程序組件。應(yīng)當(dāng)理解,圖2A中所示的域示出了可對(duì)圖1B中所示的數(shù)據(jù)對(duì)象生成的域,但是對(duì)于用于應(yīng)用程序204、304的運(yùn)行時(shí)結(jié)構(gòu)的任何其它實(shí)例,其中顯示了不同的數(shù)據(jù)對(duì)象、且顯示或定位或另外配置了不同的用戶界面功能,則由應(yīng)用程序描述引擎320按需生成一組不同的域250、255、260。根據(jù)各實(shí)施例,提供了一種執(zhí)行管理模型,其中每一組件域用作為用于應(yīng)用程序204、304的一個(gè)執(zhí)行管理單元。當(dāng)應(yīng)用程序204、304接收數(shù)據(jù)事件時(shí),如以下參考圖2B、3、4、5詳細(xì)描述的,應(yīng)用程序204、304將應(yīng)用程序描述318傳遞給應(yīng)用程序描述引擎320,用于動(dòng)態(tài)重新配置一個(gè)或多個(gè)當(dāng)前配置的域250、255、250,或用于按需創(chuàng)建新域。例如,回頭參考圖1B,當(dāng)向上滾動(dòng)文檔時(shí),應(yīng)用程序204、304要求來自應(yīng)用程序描述引擎320的用于顯示新數(shù)據(jù)對(duì)象的組件域。例如,在將表格對(duì)象198滾動(dòng)進(jìn)入視圖之前,應(yīng)用程序204、304不要求表格對(duì)象域260,這在圖2A中示出,因?yàn)閼?yīng)用程序204、304當(dāng)前不要求顯示表格對(duì)象198的功能。然而,一旦操作應(yīng)用程序204、304的操作系統(tǒng)134檢測(cè)到表格對(duì)象正被滾動(dòng)進(jìn)入視圖,則操作系統(tǒng)通知應(yīng)用程序204、304,它現(xiàn)在必須顯示表格對(duì)象198及其相關(guān)聯(lián)的數(shù)據(jù)。作為響應(yīng),應(yīng)用程序204、304如上所述將用于進(jìn)入的表格對(duì)象198的應(yīng)用程序描述傳遞給應(yīng)用程序描述引擎320。應(yīng)用程序描述引擎320解釋該應(yīng)用程序描述、獲得所需的應(yīng)用程序組件、并動(dòng)態(tài)地創(chuàng)建其中包括了顯示該進(jìn)入的表格對(duì)象198所需的那些應(yīng)用程序組件的表格對(duì)象域260。類似地,如果圖1B所示的文檔被向上滾動(dòng)使得表格對(duì)象滾動(dòng)離開頁(yè)面的底部,則操作系統(tǒng)將通知應(yīng)用程序204、304,不再要求表格對(duì)象198的顯示。應(yīng)用程序描述引擎響應(yīng)于從應(yīng)用程序204、304接收到的應(yīng)用程序描述將丟棄為應(yīng)用程序204、304顯示表格對(duì)象198所創(chuàng)建的表格對(duì)象域260,因?yàn)椴辉僖笙惹帮@示表格對(duì)象所需的組件域。由此,應(yīng)用程序描述引擎可基于應(yīng)用程序204、304在執(zhí)行期間的要求來動(dòng)態(tài)創(chuàng)建或廢棄給定組件域。在應(yīng)用程序204、304的執(zhí)行期間,通過管理每一組件域的操作和組件結(jié)構(gòu)來實(shí)現(xiàn)執(zhí)行管理。仍參考圖2A,在應(yīng)用程序204、304的執(zhí)行期間,當(dāng)應(yīng)用程序204、304接收到調(diào)用給定域250、255、260的功能的數(shù)據(jù)事件時(shí),應(yīng)用程序204經(jīng)由相應(yīng)的域來處理該數(shù)據(jù)事件。例如,如果用戶選擇表格對(duì)象198中的一個(gè)數(shù)據(jù)項(xiàng),接著選擇應(yīng)用程序204、304的刪除控件來刪除所選的數(shù)據(jù)項(xiàng),則應(yīng)用程序204、304接收到域所選的數(shù)據(jù)項(xiàng)和所選的刪除控件相關(guān)聯(lián)的數(shù)據(jù)事件。如本領(lǐng)域的技術(shù)人員所理解的,對(duì)數(shù)據(jù)項(xiàng)的選擇和對(duì)刪除控件的選擇由負(fù)責(zé)操作應(yīng)用程序204、304的操作系統(tǒng)來檢測(cè),并且向應(yīng)用程序204、304作出該數(shù)據(jù)事件的適當(dāng)通知。響應(yīng)于該數(shù)據(jù)事件,應(yīng)用程序204、304向負(fù)責(zé)處理與表格對(duì)象198相關(guān)聯(lián)的數(shù)據(jù)事件的適當(dāng)域260分派單個(gè)處理線程275。在該主體域,此處也稱為并發(fā)性域處,單個(gè)處理線程275進(jìn)入該組件域,并且在一系列階段中處理該數(shù)據(jù)事件。關(guān)于向用于經(jīng)由域的組件來處理數(shù)據(jù)驅(qū)動(dòng)的事件的主體域分派單個(gè)處理線程的詳細(xì)描述,見以下在標(biāo)題“對(duì)并發(fā)性域的多線程化”下陳述的描述。繼續(xù)當(dāng)前示例,一旦選擇了刪除控件來從表格對(duì)象198中刪除所選數(shù)據(jù)項(xiàng),則響應(yīng)于刪除表格項(xiàng)的動(dòng)作數(shù)據(jù)單個(gè)處理線程被分派給域260。一旦該處理線程進(jìn)入該域,啟動(dòng)第一處理階段,即讀數(shù)據(jù)/請(qǐng)求數(shù)據(jù)階段。例如,在第一階段期間,由組件域260讀取該數(shù)據(jù)事件以確定表格對(duì)象198中將受到該數(shù)據(jù)驅(qū)動(dòng)的事件的影響的數(shù)據(jù)項(xiàng)或數(shù)據(jù)值。接著,作為第一操作階段的一部分,請(qǐng)求對(duì)數(shù)據(jù)的改變,例如從表格對(duì)象198中刪除所選數(shù)據(jù)項(xiàng)的請(qǐng)求。作為響應(yīng),表格對(duì)象域中的數(shù)據(jù)連接器組件建立從表格對(duì)象198中刪除所選數(shù)據(jù)項(xiàng)的請(qǐng)求。對(duì)包括數(shù)據(jù)連接器組件的應(yīng)用程序204、205的組件的詳細(xì)描述在以下參考圖2B、3、4、5來提供。一旦讀數(shù)據(jù)/請(qǐng)求數(shù)據(jù)階段完成,處理線程將通知分派器對(duì)象(以下詳細(xì)描述),下一處理階段可以開始。下一處理階段包括其中由應(yīng)用程序描述引擎作出響應(yīng)于數(shù)據(jù)事件的對(duì)組件域的改變的重新確認(rèn)/重新配置階段。在該重新確認(rèn)/重新配置階段期間,通知與將受到影響的數(shù)據(jù)相關(guān)聯(lián)的所有數(shù)據(jù)連接器組件,例如與將從表格對(duì)象198中刪除的數(shù)據(jù)項(xiàng)相關(guān)聯(lián)的數(shù)據(jù)連接器組件標(biāo)記這些數(shù)據(jù)項(xiàng)以供重新確認(rèn)/重新配置。根據(jù)一個(gè)實(shí)施例,對(duì)受影響數(shù)據(jù)的標(biāo)記在讀數(shù)據(jù)/請(qǐng)求數(shù)據(jù)階段的子-階段期間進(jìn)行。一旦標(biāo)記了所有受影響數(shù)據(jù)項(xiàng),重新確認(rèn)/重新配置階段繼續(xù),且按需處理每一標(biāo)記的數(shù)據(jù)項(xiàng)。例如,刪除要從表格對(duì)象198中刪除的數(shù)據(jù)項(xiàng),并且按需刪除或添加任何相關(guān)聯(lián)的域組件。例如,如果作為刪除所選數(shù)據(jù)項(xiàng)的結(jié)果需要移除構(gòu)成受影響域260的一個(gè)或多個(gè)應(yīng)用程序組件,則應(yīng)用程序描述引擎將在響應(yīng)于數(shù)據(jù)事件的重新確認(rèn)階段期間響應(yīng)于傳遞給應(yīng)用程序描述引擎的應(yīng)用程序描述318重新配置該域以移除這些組件。另一方面,如果該受影響的域需要新的應(yīng)用程序組件,則應(yīng)用程序描述引擎同樣將獲得新的應(yīng)用程序組件以集成到受影響的域中并對(duì)該域進(jìn)行重新配置。由此,受影響的組件域在應(yīng)用程序執(zhí)行期間基于與該域相關(guān)聯(lián)的數(shù)據(jù)事件來動(dòng)態(tài)地重新配置。此處所描述的組件域250、255、260中用于處理數(shù)據(jù)事件的執(zhí)行階段模型的詳細(xì)描述在以下標(biāo)題“應(yīng)用程序框架分階段模型”中提供。如上所述,每一組件域由應(yīng)用程序描述引擎320基于應(yīng)用程序204、304對(duì)組件域的當(dāng)前需求來配置。并且,如上所述,當(dāng)應(yīng)用程序204、304的需求響應(yīng)于例如數(shù)據(jù)對(duì)象的刪除、數(shù)據(jù)對(duì)象的添加或數(shù)據(jù)對(duì)象的修改等數(shù)據(jù)事件而改變時(shí),則按需創(chuàng)建新的組件域或者重新配置現(xiàn)有的組件域。給定組件域中的每一新組件具有等于該組件域中的其它組件的生存期,因?yàn)榻o定組件域生存期在其由應(yīng)用程序描述引擎實(shí)例化時(shí)或在其由應(yīng)用程序描述引擎重新配置時(shí)開始,并且在該組件域被丟棄或者隨后由應(yīng)用程序描述引擎重新配置時(shí)結(jié)束。由此,給定組件域是在該組件域的特定配置的時(shí)間期間內(nèi)生存、并在該組件域的后續(xù)的重新配置時(shí)終止或消逝的應(yīng)用程序功能和管理單元,其中組件域的隨后重新配置的版本出于應(yīng)用程序執(zhí)行管理的目的而被認(rèn)為是一個(gè)新的組件域。以上描述了用于作為連接組件的集合或圖來配置軟件應(yīng)用程序并用于經(jīng)由一個(gè)或多個(gè)組件域來管理應(yīng)用程序的結(jié)構(gòu)和執(zhí)行的應(yīng)用程序框架,以下參考圖2B、3、4、5提供構(gòu)成給定應(yīng)用程序的組件以及這些組件之間的通信的詳細(xì)描述。此外,以下對(duì)圖2B、3、4和5的討論提供了上述一個(gè)示例性實(shí)施例的描述,其中應(yīng)用程序框架是基于可擴(kuò)展標(biāo)記語(yǔ)言(XML)的應(yīng)用程序框架。XML應(yīng)用程序框架(XAF)提供了如上所述用于執(zhí)行和創(chuàng)建軟件應(yīng)用程序的方法和系統(tǒng)。XAF在標(biāo)準(zhǔn)語(yǔ)言上被構(gòu)建,它在軟件系統(tǒng)中以標(biāo)準(zhǔn)格式表示數(shù)據(jù)改變、數(shù)據(jù)事件、UI事件或所有其它發(fā)生事件。在一個(gè)示例性實(shí)施例中,XAF采用XML(可擴(kuò)展標(biāo)記語(yǔ)言)將數(shù)據(jù)表示為XML數(shù)據(jù),并將應(yīng)用程序表示為XML應(yīng)用程序。之后,將在描述中使用XML來表示標(biāo)準(zhǔn)語(yǔ)言。然而,本領(lǐng)域的技術(shù)人員將認(rèn)識(shí)到,本發(fā)明不限于使用XML。XAF軟件系統(tǒng)是數(shù)據(jù)聚焦、數(shù)據(jù)驅(qū)動(dòng)的,并提供強(qiáng)大的數(shù)據(jù)變換能力,包括但不限于與來自互不知曉的來源的異類數(shù)據(jù)交互。XAF的所有部分都可被描述為針對(duì)或涉及數(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ā)明的各實(shí)施例中,XAF應(yīng)用程序組件實(shí)際上基于如何顯示數(shù)據(jù)、數(shù)據(jù)是什么以及如何儲(chǔ)存數(shù)據(jù)來實(shí)例化和互連。由此,XAF能夠在運(yùn)行時(shí)創(chuàng)建并縫合“正確的”組件來以正確的方式處理特定數(shù)據(jù)。在構(gòu)建應(yīng)用程序時(shí),XAF允許應(yīng)用程序“作者”提供關(guān)于如何基于數(shù)據(jù)類型和用戶界面(UI)來創(chuàng)建組件并將其連接在一起的規(guī)則。這些規(guī)則和組件可以用XML來編寫。XML允許用于對(duì)當(dāng)前上下文敏感的豐富且可組構(gòu)的UI,并允許軟件開發(fā)者以組構(gòu)的方法來構(gòu)建應(yīng)用程序。軟件作者可以在減少對(duì)硬編碼應(yīng)用程序邏輯所需求的聲明性模型中端到端地構(gòu)建特征或應(yīng)用程序。例如,軟件作者只需聲明某一特定UI連接器與某一特定UI和某一特定動(dòng)作相配。XAF然后將該UI連接器與該UI和動(dòng)作連接在一起。另外,該XML應(yīng)用程序框架提供了預(yù)構(gòu)建的組件、應(yīng)用程序特征和示例應(yīng)用程序的豐富的庫(kù)。盡管仍需要某些命令性代碼,但是XAF將組件放置在庫(kù)中。庫(kù)允許其它軟件作者在聲明性模型中使用或利用這些組件。由此,軟件開發(fā)者可通過為組件生成新的命令性代碼來創(chuàng)建其自己的組件,但是軟件作者也可采用預(yù)構(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包括一個(gè)或多個(gè)UI連接器206、一個(gè)或多個(gè)動(dòng)作208以及一個(gè)或多個(gè)數(shù)據(jù)連接器210。在某些實(shí)施例中,應(yīng)用程序204還包括一個(gè)或多個(gè)存取器212或一個(gè)或多個(gè)變換器214和/或216。應(yīng)用程序204內(nèi)的組件用于將UI事件變換成數(shù)據(jù)改變以及將數(shù)據(jù)改變變換成UI事件。由此,UI連接器206耦合到一個(gè)或多個(gè)UI218和/或220。另外,數(shù)據(jù)連接器210耦合到一個(gè)或多個(gè)數(shù)據(jù)存儲(chǔ)222和/或224。在XAF202內(nèi),應(yīng)用程序204中的數(shù)據(jù)事件或數(shù)據(jù)表示采用標(biāo)準(zhǔn)格式。例如,數(shù)據(jù)事件和數(shù)據(jù)表示采用XML。UI連接器206提供了應(yīng)用程序204與一個(gè)或多個(gè)UI218和/或220之間的連接。在一個(gè)實(shí)施例中,UI218和/或220是向用戶顯示信息的圖形用戶界面。UI連接器206呈現(xiàn)并支持應(yīng)用程序用戶編輯XAF202內(nèi)的數(shù)據(jù)的能力。UI連接器206在XAF數(shù)據(jù)層(由數(shù)據(jù)連接器210和數(shù)據(jù)存儲(chǔ)222和/或224來表示)與特定UI218和/或220之間映射數(shù)據(jù)。另外,UI連接器206將UI事件從UI218和/或220映射到數(shù)據(jù)存儲(chǔ)222和/或224內(nèi)的數(shù)據(jù)編輯操作。UI連接器206對(duì)UI218和/或220中的UI元素的類型是專用的。由此,對(duì)于UI218和/或220內(nèi)的數(shù)據(jù)項(xiàng)的每一UI表示,存在一相應(yīng)的UI連接器206。在一個(gè)示例中,諸如電子表格中的單元格值等顯示在UI218和/或220中的數(shù)據(jù)元素將具有耦合到該數(shù)據(jù)元素的特定UI連接器206,它將對(duì)該數(shù)據(jù)的用戶修改轉(zhuǎn)換成UI事件以連接到XAF數(shù)據(jù)上的動(dòng)作208。由此,UI連接器206將特定UI事件轉(zhuǎn)換成一般在XAF應(yīng)用程序204內(nèi)表示的XAF動(dòng)作208。在一個(gè)實(shí)施例中,應(yīng)用程序204內(nèi)的所有數(shù)據(jù)改變被表示為XML數(shù)據(jù)改變。在另一示例中,用戶可操作諸如滾動(dòng)條等用戶界面控件。滾動(dòng)條的改變?cè)斐闪薝I218和/或220的狀態(tài)的改變。UI狀態(tài)改變也可被表示為數(shù)據(jù)改變。由此,UI連接器206可接收例如滾動(dòng)條操作等UI事件、將該UI事件轉(zhuǎn)換成用于XAF數(shù)據(jù)層的XML數(shù)據(jù)改變事件。UI連接器206將UI事件連接到動(dòng)作208。動(dòng)作208是用于XAF數(shù)據(jù)層中的數(shù)據(jù)改變的聲明性語(yǔ)句。例如,對(duì)滾動(dòng)條的用戶操作可創(chuàng)建“點(diǎn)擊滾動(dòng)條”事件。UI連接器206將該UI事件連接到諸如“將滾動(dòng)條向下遞增一個(gè)位置”等動(dòng)作208。在一個(gè)實(shí)施例中,數(shù)據(jù)改變動(dòng)作用XML來表示。例如,數(shù)據(jù)改變可作為XML語(yǔ)句出現(xiàn)<Dropdowndata=$taskpanelist><copyDeltaactionpeform="onselectedchange"data=selectedvalue"target="currenttaskPane"/>數(shù)據(jù)連接器210整理去往和來自外部數(shù)據(jù)存儲(chǔ)222和/或224的數(shù)據(jù)。類似于UI連接器206,數(shù)據(jù)連接器210在不同數(shù)據(jù)存儲(chǔ)222和/或224中的內(nèi)部XAF數(shù)據(jù)表示和外部數(shù)據(jù)類型之間進(jìn)行轉(zhuǎn)換。由此,對(duì)每一外部數(shù)據(jù)類型存在數(shù)據(jù)專用數(shù)據(jù)連接器210。數(shù)據(jù)連接器210接收動(dòng)作208,并將標(biāo)準(zhǔn)格式XAF數(shù)據(jù)動(dòng)作208轉(zhuǎn)換成數(shù)據(jù)專用動(dòng)作以影響數(shù)據(jù)存儲(chǔ)222和/或224內(nèi)的數(shù)據(jù)。在一個(gè)實(shí)施例中,數(shù)據(jù)連接器210將XML數(shù)據(jù)動(dòng)作轉(zhuǎn)換成數(shù)據(jù)專用動(dòng)作。例如,由標(biāo)準(zhǔn)格式XML語(yǔ)句表示的滾動(dòng)條操作被轉(zhuǎn)換成界面狀態(tài)專用數(shù)據(jù)改變并被發(fā)送到儲(chǔ)存特定界面狀態(tài)數(shù)據(jù)的數(shù)據(jù)存儲(chǔ)222或224。另外,數(shù)據(jù)連接器210將數(shù)據(jù)存儲(chǔ)222和/或224中的改變轉(zhuǎn)換成發(fā)送到UI連接器206的標(biāo)準(zhǔn)格式XAF數(shù)據(jù)表示。UI連接器206將標(biāo)準(zhǔn)格式XAF數(shù)據(jù)表示轉(zhuǎn)換成發(fā)送到UI218和/或220的UI事件。由此,對(duì)于UI218和/或220中的任何改變,UI連接器206將用戶界面事件連接到動(dòng)作208。動(dòng)作208被發(fā)送到將動(dòng)作208轉(zhuǎn)換成數(shù)據(jù)存儲(chǔ)222和/或224中的數(shù)據(jù)專用改變的數(shù)據(jù)連接器210。一旦數(shù)據(jù)被改變,數(shù)據(jù)連接器210將數(shù)據(jù)存儲(chǔ)222和/或224中改變的數(shù)據(jù)轉(zhuǎn)換成標(biāo)準(zhǔ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ù)對(duì)應(yīng)用程序204內(nèi)發(fā)生的所有動(dòng)作處理數(shù)據(jù)和UI事件之間的這些周期性的改變。在某些實(shí)施例中,數(shù)據(jù)存儲(chǔ)222和/或224中的數(shù)據(jù)的改變也迫使UI218和/或220的改變而無需發(fā)生用戶事件,諸如由用戶控制之外的另一操作強(qiáng)迫改變的數(shù)據(jù)。應(yīng)用程序204內(nèi)的某些可任選組件包括存取器212和變換器214和/或216。存取器212在動(dòng)作208和數(shù)據(jù)連接器210之間調(diào)解。為存取某一特定數(shù)據(jù)存儲(chǔ)222和/或224中的某一特定類型的數(shù)據(jù),動(dòng)作208可指定使用用于該數(shù)據(jù)的存取器212或“存取模型”。存取器212允許應(yīng)用程序204存取諸如JPEG、MPEG等不同類的特定類型的數(shù)據(jù)。由此,無論數(shù)據(jù)存儲(chǔ)222和/或224內(nèi)的數(shù)據(jù)的類型如何,應(yīng)用程序204都接口并改變?cè)摂?shù)據(jù)。存取器212確保數(shù)據(jù)連接器210管理包括尚未設(shè)計(jì)或開發(fā)的數(shù)據(jù)類型在內(nèi)的任何數(shù)據(jù)類型。存取器212將標(biāo)準(zhǔn)格式動(dòng)作變換成標(biāo)準(zhǔn)格式的數(shù)據(jù)-定制動(dòng)作。在其它實(shí)施例中,一個(gè)或多個(gè)變換器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可通過一個(gè)或多個(gè)簡(jiǎn)單改變來將表式數(shù)據(jù)修改成數(shù)據(jù)列表,其中每一簡(jiǎn)單改變由單個(gè)變換器214和/或216執(zhí)行。由此,由數(shù)據(jù)連接器210輸出的任何形式的數(shù)據(jù)都可通過一個(gè)或多個(gè)規(guī)范變換器214和/或216變換成可由UI連接器206接受并使用的形式。關(guān)于諸如變換器214、216等事務(wù)變換的操作的詳細(xì)討論,見以下標(biāo)題“事務(wù)變換”下的描述??筛鶕?jù)本發(fā)明的各實(shí)施例利用其它類型的變換。例如,功能變換可使用諸如XQuery等功能語(yǔ)言來描述。代理(proxy)變換取一位置列表,并以別名數(shù)據(jù)序列的形式來代理在這些位置處找到的數(shù)據(jù)。求解器(solver)變換實(shí)施指定的求解器技術(shù)并為效率起見支持高速緩存。例如,一個(gè)求解器變換在數(shù)字上對(duì)代數(shù)等式系統(tǒng)求解,而另一求解器則在符號(hào)上對(duì)這些系統(tǒng)求解。高速緩存和索引變換是數(shù)據(jù)級(jí)的通過(pass-through)變換(即,輸出數(shù)據(jù)等于輸入數(shù)據(jù)),并且高速緩存和索引變換在指定維度中添加高速緩存和索引以加速下游的索引存取。根據(jù)本發(fā)明的各實(shí)施例,該應(yīng)用程序框架采用了此處描述的應(yīng)用程序的組件之間的公共接口。由于該框架依賴于在此處描述的各種組件之間的數(shù)據(jù)通信,因此組件之間統(tǒng)一數(shù)據(jù)結(jié)構(gòu)(例如XML等)和公共接口允許用于應(yīng)用程序配置和管理的有效數(shù)據(jù)交換。現(xiàn)在參考圖3,在本發(fā)明的各實(shí)施例中,XAF300包括兩個(gè)或多個(gè)應(yīng)用程序302和/或304,如圖3所示。較大的應(yīng)用程序302可包括用作子模塊或子組件的一個(gè)或多個(gè)應(yīng)用程序306和/或308。所有應(yīng)用程序302和/或304,不論是較大的應(yīng)用程序還是子組件,都具有諸如UI連接器206等UI連接器、諸如動(dòng)作208等動(dòng)作、以及諸如數(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可被約束到特定階段或域,如以下將詳細(xì)描述。在本發(fā)明的各實(shí)施例中,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件以及將這些組件綁定在一起的方案和標(biāo)簽。在本發(fā)明的各實(shí)施例中,方案和標(biāo)簽涉及組件如何交互。組件可以是UI連接器、動(dòng)作、存取器、數(shù)據(jù)連接器、變換器或其它軟件組件。在某些實(shí)施例中,組件以命令代碼來編寫,并且向應(yīng)用程序提供了逐點(diǎn)(point-wise)功能。由此,組件可以是向諸如UI連接器、動(dòng)作、數(shù)據(jù)連接器等XAF組件提供可操作性的底層軟件。盡管應(yīng)用程序描述318可使用其它格式來表示,但是在一個(gè)實(shí)施例中,XAD318用XML來表示。標(biāo)簽是XML標(biāo)簽。方案和標(biāo)簽提供了用于聲明規(guī)則的句法和語(yǔ)義框架。XAD允許應(yīng)用程序作者聲明應(yīng)用程序范圍的資源和命令。命令是基于諸如鼠標(biāo)點(diǎn)擊、鍵盤選擇、語(yǔ)音命令等事件執(zhí)行的代碼比特位。在各實(shí)施例中,用戶創(chuàng)建用戶界面中的事件,而在其它實(shí)施例中,某進(jìn)程的另一動(dòng)作可創(chuàng)建事件。命令可以采用命名動(dòng)作的形式,例如改變選擇動(dòng)作、編輯視圖動(dòng)作、檢索數(shù)據(jù)動(dòng)作和編輯條目動(dòng)作,如以下參考圖17所描述的。應(yīng)當(dāng)理解,這些命名動(dòng)作是出于說明的目的,并且不是對(duì)適用于本發(fā)明各實(shí)施例的命令和/或命名動(dòng)作的限制。XAD318由XAD引擎320進(jìn)行語(yǔ)法分析。最初,XAD引擎320在啟動(dòng)應(yīng)用程序時(shí)對(duì)XAD318進(jìn)行語(yǔ)法分析。之后,XAD引擎320在需要時(shí)對(duì)XAD318進(jìn)行語(yǔ)法分析。例如,根據(jù)一個(gè)實(shí)施例,XAD318在運(yùn)行時(shí)由XAD引擎320進(jìn)行語(yǔ)法分析以諸如在實(shí)例化并連接插件組件時(shí)重新配置應(yīng)用程序。根據(jù)另一實(shí)施例,提供其中在編譯時(shí)對(duì)XAD進(jìn)行語(yǔ)法分析并將其轉(zhuǎn)換成由XAD引擎在運(yùn)行時(shí)解釋的記號(hào)序列的編譯模型。當(dāng)不編譯時(shí),在XAD被加載到存儲(chǔ)器中時(shí)完成文本語(yǔ)法分析,并且將其作為數(shù)據(jù)結(jié)構(gòu)來儲(chǔ)存。XAD引擎320處理規(guī)則、標(biāo)識(shí)資源、實(shí)例化組件、并連接組件、組分和命令。組件和資源可以是命令性代碼,諸如以C#編寫的可執(zhí)行代碼。命令性代碼表征了在UI連接器、動(dòng)作、數(shù)據(jù)連接器和其它XAF組件之下的實(shí)的軟件組件和軟件類。組件從諸如組件庫(kù)322等組件庫(kù)中拉出。組件庫(kù)322保持具有XAF300的任何應(yīng)用程序內(nèi)使用的所有組件。庫(kù)322內(nèi)的整個(gè)組件集合對(duì)任何應(yīng)用程序都可用。由此,XAF300允許對(duì)應(yīng)用程序組件和創(chuàng)建這些組件的代碼的豐富共享。另外,XAF是非常可擴(kuò)展的,因?yàn)榭捎绍浖_發(fā)者創(chuàng)建新組件并將其儲(chǔ)存到組件庫(kù)322中。XAD引擎320因此可以通過讀取XAD318中軟件作者所創(chuàng)建的新規(guī)則來調(diào)用、實(shí)例化和連接新組件。新規(guī)則和新組件然后可形成新XAF組件、新數(shù)據(jù)類型、新數(shù)據(jù)存儲(chǔ)、新UI或甚至是新應(yīng)用程序。XAD和XAD引擎在以下將更詳細(xì)描述。用于執(zhí)行用戶事件的方法400的一個(gè)實(shí)施例在圖4中示出。在該實(shí)施例中,首先發(fā)生用戶事件操作402。然而,本領(lǐng)域的技術(shù)人員將認(rèn)識(shí)到,方法400可用于執(zhí)行不與用戶事件相對(duì)應(yīng)的數(shù)據(jù)改變。如所描述的,由應(yīng)用程序接收的數(shù)據(jù)改變或事件可由用戶動(dòng)作,例如響應(yīng)于對(duì)用戶界面中的功能按鈕或控件或數(shù)據(jù)對(duì)象的用戶選擇來生成。數(shù)據(jù)事件也可由外部改變,例如作為運(yùn)行外部進(jìn)程的結(jié)果由應(yīng)用程序接收或從另一應(yīng)用程序或第三方來源接收的數(shù)據(jù)來生成。另外,如以上結(jié)合圖2B所解釋的,用戶事件可以是用戶在諸如UI218等UI內(nèi)執(zhí)行的任何改變或交互。連接操作404在諸如UI連接器206等UI連接器處接收用戶事件,并將用戶事件連接到諸如動(dòng)作208等相應(yīng)的動(dòng)作。提供操作406為動(dòng)作中表示的數(shù)據(jù)改變提供標(biāo)準(zhǔn)格式動(dòng)作。在一個(gè)實(shí)施例中,XML語(yǔ)句表示用于數(shù)據(jù)改變的動(dòng)作。在一個(gè)實(shí)施例中,可任選輔助操作408將動(dòng)作連接到諸如存取器212等存取器以幫助配置用于改變的特定數(shù)據(jù)的動(dòng)作。存取器將數(shù)據(jù)專用動(dòng)作發(fā)送給諸如數(shù)據(jù)連接器210等數(shù)據(jù)連接器。轉(zhuǎn)換操作410接收該數(shù)據(jù)-專用動(dòng)作,并將這一標(biāo)準(zhǔn)格式動(dòng)作(可以是XML語(yǔ)句)轉(zhuǎn)換成用于諸如數(shù)據(jù)存儲(chǔ)222等特定數(shù)據(jù)存儲(chǔ)的代碼和數(shù)據(jù)-專用操作。在數(shù)據(jù)存儲(chǔ)中作出數(shù)據(jù)改變。然后,數(shù)據(jù)連接器從數(shù)據(jù)存儲(chǔ)中讀取改變的數(shù)據(jù)。改變的數(shù)據(jù)被轉(zhuǎn)換成諸如XML數(shù)據(jù)表示等標(biāo)準(zhǔn)格式數(shù)據(jù)表示??扇芜x地,然后標(biāo)準(zhǔn)格式數(shù)據(jù)表示被發(fā)送到諸如變換器214等變換器??扇芜x改變操作412將由變換器接收的數(shù)據(jù)記錄改為UI專用數(shù)據(jù)語(yǔ)句。例如,該數(shù)據(jù)改變可要求以分類列表來顯示數(shù)據(jù)。一個(gè)或多個(gè)變換器可對(duì)檢索到的數(shù)據(jù)進(jìn)行分類并創(chuàng)建以分類列表呈現(xiàn)數(shù)據(jù)的最終數(shù)據(jù)語(yǔ)句。變換器然后將改變并變換的數(shù)據(jù)提供給諸如UI連接器206等UI連接器。連接操作414然后接收改變的數(shù)據(jù)并與UI組件連接以顯示并提供該改變的數(shù)據(jù)。由此,UI現(xiàn)在提供了改變的數(shù)據(jù)的視圖。在一個(gè)實(shí)施例中,數(shù)據(jù)改變可以是用戶界面狀態(tài),并且改變的數(shù)據(jù)的顯示是改變的用戶界面的顯示。如由繼續(xù)回到用戶事件操作402的流程所表示的,接收事件、影響數(shù)據(jù)改變以及顯示改變的數(shù)據(jù)的過程400是迭代的,并且可對(duì)每一用戶事件或數(shù)據(jù)改變重復(fù)實(shí)現(xiàn)。如果數(shù)據(jù)改變或事件導(dǎo)致或要求應(yīng)用程序的重新配置,則可如以下參考圖5所描述來創(chuàng)建并連接和/或重新配置新組件。用于創(chuàng)建和配置應(yīng)用程序的方法500的一個(gè)實(shí)施例在圖5中示出。運(yùn)行(launch)操作502啟動(dòng)諸如應(yīng)用程序204等應(yīng)用程序。在一個(gè)實(shí)施例中,用戶通過用戶事件,諸如通過點(diǎn)擊應(yīng)用程序圖標(biāo)來啟動(dòng)應(yīng)用程序。語(yǔ)法分析操作504對(duì)諸如XAD318等XAD進(jìn)行語(yǔ)法分析。在一個(gè)實(shí)施例中,語(yǔ)法分析標(biāo)識(shí)并處理XAD內(nèi)的方案和/或規(guī)則。標(biāo)識(shí)操作506標(biāo)識(shí)應(yīng)用程序所必需的資源和/或組件。在一個(gè)實(shí)施例中,組件和資源在諸如組件庫(kù)322等組件庫(kù)中找到。實(shí)例化操作508實(shí)例化該組件。在一個(gè)實(shí)施例中,諸如XAD引擎320等XAD引擎中的幫助器代碼在形式上實(shí)例化組件庫(kù)中所標(biāo)識(shí)的組件。在另一實(shí)施例中,實(shí)例化一組臨時(shí)的創(chuàng)建器組件。該創(chuàng)建器組件然后實(shí)例化關(guān)于輸入數(shù)據(jù)和與XAD中的標(biāo)簽相關(guān)聯(lián)的規(guī)則的處理組件。連接操作510連接實(shí)例化的組件。在一個(gè)實(shí)施例中,XAD引擎根據(jù)所使用的數(shù)據(jù)或處理的用戶事件來連接組件。一旦實(shí)例化并連接了應(yīng)用程序組件,等待操作512即等待用戶事件。由此,XAD引擎與該應(yīng)用程序一起維持一種被動(dòng)存在(passivepresence)。XAD引擎連續(xù)地監(jiān)視數(shù)據(jù)改變,并響應(yīng)于由諸如數(shù)據(jù)連接器210等數(shù)據(jù)連接器提供的數(shù)據(jù)改變。在數(shù)據(jù)改變時(shí),確定操作514確定數(shù)據(jù)改變是否要求應(yīng)用程序的重新配置,如插入插件組件。如果要求重新配置,則流程通過“是”繼續(xù)到語(yǔ)法分析操作504。如果不要求重新配置,則流程通過“否”繼續(xù)到等待操作512。如此處所描述的,提供了一種用于為給定軟件應(yīng)用程序生成運(yùn)行時(shí)結(jié)構(gòu)并用于管理軟件應(yīng)用程序的執(zhí)行的應(yīng)用程序框架。以下是上述本發(fā)明實(shí)施例的各方面的詳細(xì)描述,包括事務(wù)變換的操作和功能、經(jīng)由階段建模和線程化的組件域處理、以及用于生成和重新配置應(yīng)用程序組件的應(yīng)用程序描述引擎的操作。事務(wù)變換如上所述,提供了用于經(jīng)由一個(gè)或多個(gè)連接器接收和儲(chǔ)存數(shù)據(jù)的一個(gè)或多個(gè)數(shù)據(jù)存儲(chǔ)。根據(jù)本發(fā)明的各實(shí)施例,數(shù)據(jù)可通過使用一個(gè)或多個(gè)“事務(wù)變換”來選擇性地與數(shù)據(jù)存儲(chǔ)隔離。圖6示出了數(shù)據(jù)層的組織并示出了數(shù)據(jù)層與包括數(shù)據(jù)存儲(chǔ)和數(shù)據(jù)客戶端在內(nèi)的其它組件之間的連接。事務(wù)變換614包括用于儲(chǔ)存隔離的數(shù)據(jù)和關(guān)于數(shù)據(jù)的狀態(tài)信息的緩存模塊616,以及結(jié)合緩存模塊616使用二-階段提交協(xié)議使得失敗的提交不必導(dǎo)致數(shù)據(jù)丟失的控制模塊618。以下更詳細(xì)討論緩存模塊616和控制模塊618。數(shù)據(jù)存儲(chǔ)602和604包含在數(shù)據(jù)庫(kù)服務(wù)器或計(jì)算機(jī)可讀介質(zhì)上的數(shù)據(jù)。數(shù)據(jù)可如上所述地從數(shù)據(jù)存儲(chǔ)中讀出和寫入其中??捎蛇B接到給定數(shù)據(jù)存儲(chǔ)的代理發(fā)送檢查或某一其它請(qǐng)求以查看對(duì)數(shù)據(jù)存儲(chǔ)寫入數(shù)據(jù)是否可行。如果寫入數(shù)據(jù)是可行的,則將一肯定指示傳回代理。同樣,如果寫入數(shù)據(jù)是不可行的或者不知道是否可行,則將一否定指示傳回代理。數(shù)據(jù)連接器606和608將數(shù)據(jù)變換610、612和614連接到數(shù)據(jù)存儲(chǔ)602和604。在一個(gè)實(shí)施例中,在數(shù)據(jù)連接器606和608內(nèi)實(shí)現(xiàn)各協(xié)議以處理一種或多種類型的數(shù)據(jù)存儲(chǔ)。每一協(xié)議處理一種或多種類型的數(shù)據(jù)存儲(chǔ),諸如使用特定格式編碼的數(shù)據(jù)庫(kù)文件。數(shù)據(jù)連接器協(xié)議最小單元地提交從數(shù)據(jù)客戶端622和624接收到的數(shù)據(jù)修改或改變。以上參考圖2B描述的UI連接器206是數(shù)據(jù)客戶端622、624的示例。在一個(gè)實(shí)施例中,數(shù)據(jù)連接器606和608通過保守并發(fā)性(pessimisticconcurrency)來實(shí)現(xiàn)最小單元性。保守并發(fā)性涉及鎖定數(shù)據(jù)存儲(chǔ)中的數(shù)據(jù)的子集(例如,一條或多條記錄)以防止客戶端以影響其它客戶端的方式修改數(shù)據(jù)。在保守并發(fā)性模型中,當(dāng)客戶端執(zhí)行導(dǎo)致應(yīng)用鎖定的動(dòng)作時(shí),其它客戶端不能執(zhí)行將與該鎖定沖突的動(dòng)作,直到擁有該鎖定的客戶端釋放該鎖定。這一模型在其中可能有對(duì)數(shù)據(jù)的大量競(jìng)爭(zhēng)和/或其中用鎖定保護(hù)數(shù)據(jù)的成本低于在發(fā)生并發(fā)性沖突的情況下回退事務(wù)的成本的環(huán)境中是有用的。保守并發(fā)性最佳地在鎖時(shí)間短的時(shí)候,諸如在記錄的程序性處理時(shí)使用。在另一實(shí)施例中,數(shù)據(jù)連接器606和608使用帶有補(bǔ)償動(dòng)作的優(yōu)化并發(fā)性(optimisticconcurrency)來實(shí)現(xiàn)最小單元性。優(yōu)化并發(fā)性不利用鎖定。當(dāng)?shù)谝豢蛻舳诵枰掠涗洉r(shí),該協(xié)議確定自從該記錄由第一客戶端最后一次讀取以來另一客戶端是否改變了該記錄。優(yōu)化并發(fā)性在具有極少數(shù)據(jù)競(jìng)爭(zhēng)的環(huán)境中是有用的。補(bǔ)償動(dòng)作是補(bǔ)償事務(wù)的效應(yīng)的動(dòng)作。例如,對(duì)資金從賬戶A到賬戶B的銀行轉(zhuǎn)賬的補(bǔ)償效應(yīng)是將相同數(shù)量的資金從賬戶B轉(zhuǎn)回賬戶A。類似地,對(duì)保留酒店房間的補(bǔ)償動(dòng)作是取消保留。補(bǔ)償動(dòng)作允許事務(wù)被“回退”,或在沒有殘留副作用或其它負(fù)面結(jié)果的情況下被收回。補(bǔ)償動(dòng)作可用于在兩個(gè)客戶端之間發(fā)生沖突(例如,第一客戶端讀取一數(shù)據(jù)值,然后第二客戶端在第一客戶端試圖修改該值之前修改了該數(shù)據(jù)值)時(shí)回退事務(wù)。在一個(gè)實(shí)施例中,數(shù)據(jù)連接器606和608高速緩存分別來自數(shù)據(jù)存儲(chǔ)602和604的數(shù)據(jù)。如果數(shù)據(jù)客戶端所請(qǐng)求的數(shù)據(jù)由數(shù)據(jù)連接器高速緩存,則無需向相應(yīng)的數(shù)據(jù)存儲(chǔ)查詢所請(qǐng)求的數(shù)據(jù)。數(shù)據(jù)連接器在下文將更詳細(xì)討論。數(shù)據(jù)變換610、612、614和620根據(jù)預(yù)定義規(guī)則來編碼和/或解碼數(shù)據(jù)。數(shù)據(jù)變換610、612、614和620實(shí)現(xiàn)可執(zhí)行任意復(fù)雜的處理的功能。數(shù)據(jù)變換612和620彼此串行。因此,由數(shù)據(jù)變換612實(shí)現(xiàn)的功能的結(jié)果用作由數(shù)據(jù)變換620實(shí)現(xiàn)的功能的輸入,反之亦然。在一個(gè)實(shí)施例中,數(shù)據(jù)變換可被串行地連接以緩存先前變換的結(jié)果,并且允許更容易且模塊化地實(shí)現(xiàn)復(fù)雜功能。同樣,視圖內(nèi)的數(shù)據(jù)的子集可在不影響視圖中的其余數(shù)據(jù)的情況下提交或刷新(見下文)。數(shù)據(jù)變換614是稱為事務(wù)變換的一種特殊的數(shù)據(jù)變換,且同樣地包含緩存模塊616和控制模塊618。在一個(gè)實(shí)施例中,事務(wù)變換允許隔離的數(shù)據(jù)最小單元地且以數(shù)據(jù)在數(shù)據(jù)存儲(chǔ)之間一致的方式來提交。緩存模塊616保持來自數(shù)據(jù)客戶端622和624的隔離數(shù)據(jù)。在一個(gè)示例中,數(shù)據(jù)客戶端622和624是用于編輯數(shù)據(jù)存儲(chǔ)604中的數(shù)據(jù)的對(duì)話框。對(duì)數(shù)據(jù)作出的編輯可在作出編輯時(shí)被充分地儲(chǔ)存在緩存模塊616中。在另一實(shí)施例中,事務(wù)變換將針對(duì)其輸出的編輯請(qǐng)求映射回針對(duì)其輸入的編輯請(qǐng)求。結(jié)果,當(dāng)作出編輯時(shí),輸入/請(qǐng)求實(shí)體將這一編輯識(shí)別為完成的。此外,這些事務(wù)變換使用其緩存616來允許這些編輯的延遲且受控的映射,將如以下討論??捎墒聞?wù)變換執(zhí)行若干類型的控制操作。當(dāng)用戶希望在數(shù)據(jù)客戶端622或數(shù)據(jù)客戶端624中提交數(shù)據(jù)時(shí)(例如,當(dāng)激活與數(shù)據(jù)客戶端相關(guān)聯(lián)的“應(yīng)用”按鈕時(shí)),控制模塊618從該數(shù)據(jù)客戶端接收提交控制操作,并試圖使用以下結(jié)合圖6討論的二-階段并發(fā)性協(xié)議來提交數(shù)據(jù)。在一個(gè)實(shí)施例中,緩存模塊616中緩存的數(shù)據(jù)可在一旦成功提交之后刪除。當(dāng)用戶希望刷新緩存中的數(shù)據(jù)(且由此數(shù)據(jù)被顯示在相應(yīng)的數(shù)據(jù)客戶端中)時(shí),控制模塊618從該數(shù)據(jù)客戶端接收刷新控制操作,并刷新緩存模塊616中的數(shù)據(jù)。刷新的數(shù)據(jù)被傳播到數(shù)據(jù)客戶端,使得用戶可訪問更新的數(shù)據(jù)。刷新隔離數(shù)據(jù)的能力可代替?zhèn)鹘y(tǒng)二-階段并發(fā)性模型中的提交來使用,如以下將結(jié)合圖6進(jìn)行討論。在某些情況下,有益的是更新緩存中的數(shù)據(jù)而不廢棄一個(gè)或多個(gè)用戶使用一個(gè)或多個(gè)數(shù)據(jù)客戶端作出的未提交改變。在這一情況下,可由數(shù)據(jù)客戶端發(fā)出同步控制操作。當(dāng)控制模塊618從數(shù)據(jù)客戶端接收同步控制操作時(shí),基于數(shù)據(jù)存儲(chǔ)中的最新版本更新緩存模塊616中的隔離數(shù)據(jù),并且將對(duì)隔離數(shù)據(jù)的未提交改變與更新的數(shù)據(jù)合并。對(duì)數(shù)據(jù)的兩組或多組改變的同步過程在本領(lǐng)域中是公知的,且同步可在各種情況下使用。關(guān)于如何在給定上下文中實(shí)現(xiàn)同步的細(xì)節(jié)對(duì)于該上下文是非常特定的。例如,在產(chǎn)品數(shù)據(jù)庫(kù)的上下文中,合并數(shù)據(jù)庫(kù)中的產(chǎn)品的線是可接受的,但是合并對(duì)一個(gè)產(chǎn)品的名稱的兩種版本的改變是不可接受的。其它上下文可具有用于同步的其它規(guī)則,且所有這些都可結(jié)合本發(fā)明來使用。解決沖突也是已知的??商峁┎⒆裱P(guān)于在沖突的情況下哪些更新應(yīng)有決定性影響的預(yù)定規(guī)則。其它實(shí)施例可提醒用戶解決這些沖突。緩存模塊616維護(hù)可基于當(dāng)前在進(jìn)行中的操作的類型而變化的狀態(tài)信息。例如,如果提交正在進(jìn)行中,則狀態(tài)信息可包括提交是待決、成功還是失敗?;蛘撸绻⑿抡谶M(jìn)行中,則狀態(tài)信息可包括刷新是待決還是完成。如果同步操作正在進(jìn)行中,則狀態(tài)信息可包括同步是待決、成功還是失敗。以下更詳細(xì)討論特定的控制操作。數(shù)據(jù)客戶端可訪問的某些數(shù)據(jù)可能不需要隔離。例如,對(duì)金融數(shù)據(jù)庫(kù)(諸如用于跟蹤銀行賬戶)的更改通常是立即提交的。在一個(gè)實(shí)施例中,給定數(shù)據(jù)視圖可包括隔離和未隔離數(shù)據(jù)。在另一實(shí)施例中,給定數(shù)據(jù)客戶端可包括不能在數(shù)據(jù)客戶端內(nèi)編輯的只讀數(shù)據(jù)。響應(yīng)于從應(yīng)用程序開發(fā)者接收到應(yīng)用程序規(guī)范,本發(fā)明的一個(gè)實(shí)施例標(biāo)識(shí)該應(yīng)用程序的哪些部分需要隔離數(shù)據(jù)并按需實(shí)現(xiàn)事務(wù)變換。圖7示出了事務(wù)變換操作的操作流程。接收操作702接收應(yīng)用程序規(guī)范。在一個(gè)實(shí)施例中,應(yīng)用程序規(guī)范指定了XAF應(yīng)用程序,包括哪些數(shù)據(jù)應(yīng)被隔離,且標(biāo)識(shí)操作704標(biāo)識(shí)并標(biāo)記應(yīng)用程序內(nèi)將被隔離的相應(yīng)數(shù)據(jù)實(shí)體。實(shí)現(xiàn)操作706實(shí)現(xiàn)對(duì)應(yīng)于被標(biāo)記為要隔離的數(shù)據(jù)實(shí)體的每一數(shù)據(jù)實(shí)體的一個(gè)或多個(gè)事務(wù)變換。事務(wù)變換然后以與數(shù)據(jù)變換基本相同的方式來連接和激活。圖8示出了根據(jù)事務(wù)變換操作執(zhí)行的控制操作。接收操作802從數(shù)據(jù)客戶端接收控制操作請(qǐng)求。在一個(gè)實(shí)施例中,該請(qǐng)求通過用戶點(diǎn)擊與數(shù)據(jù)客戶端相關(guān)聯(lián)的UI控件來觸發(fā)。確定操作804確定該控制操作請(qǐng)求是否請(qǐng)求提交操作。如果該控制操作請(qǐng)求是針對(duì)提交操作的,則流程通過“是”分支到發(fā)出操作908(圖9)。如果該控制操作請(qǐng)求不是針對(duì)提交操作的,則流程通過“否”分支到確定操作806。確定操作806確定控制操作請(qǐng)求是否請(qǐng)求同步操作。如果該控制操作請(qǐng)求是針對(duì)同步操作的,則流程通過“是”分支到發(fā)出保存操作808。如果該控制操作請(qǐng)求不是針對(duì)同步操作的,則流程通過“否”分支到刷新操作810。如果請(qǐng)求了同步操作,則保存操作808保存任何未提交的改變到該緩存的數(shù)據(jù)。未提交改變可被保存到計(jì)算機(jī)可讀介質(zhì)上的一個(gè)文件、到易失性或非易失性存儲(chǔ)器或其它形式的計(jì)算機(jī)存儲(chǔ),或者被提交給外部數(shù)據(jù)庫(kù)或類似的服務(wù)。流程然后前進(jìn)到刷新操作810。刷新操作810檢索數(shù)據(jù)存儲(chǔ)中存在的緩存的數(shù)據(jù)的最新副本,并且將其放置在與事務(wù)變換相關(guān)聯(lián)的緩存中。刷新操作810可能要求查詢?nèi)舾蓴?shù)據(jù)存儲(chǔ)以確定哪一數(shù)據(jù)存儲(chǔ)包含該數(shù)據(jù)的最新副本。在另一實(shí)施例中,刷新操作810可替代地或者另加地檢查與每一數(shù)據(jù)存儲(chǔ)相關(guān)聯(lián)的數(shù)據(jù)連接器來查看該數(shù)據(jù)連接器是否包含緩存的數(shù)據(jù)的高速緩存副本。確定操作812確定該控制操作請(qǐng)求是否請(qǐng)求同步操作。在一個(gè)實(shí)施例中,確定操作812只需檢查確定操作806的結(jié)果。如果控制操作請(qǐng)求是針對(duì)同步操作的,則流程通過“是”分支到合并操作814。如果控制操作請(qǐng)求不是針對(duì)同步操作的,則流程通過“否”分支到操作流程的結(jié)束。如果請(qǐng)求了同步操作,則合并操作814將由保存操作808保存的對(duì)緩存數(shù)據(jù)的改變與由刷新操作810刷新的緩存數(shù)據(jù)合并。用于合并兩種版本的數(shù)據(jù)主體的規(guī)則基于應(yīng)用程序的上下文而變化。某些示例性規(guī)則結(jié)合圖6呈現(xiàn)。在一個(gè)實(shí)施例中,可將來自不同數(shù)據(jù)客戶端的多個(gè)改變合并在一起以實(shí)現(xiàn)每一數(shù)據(jù)客戶端中的同步性。圖9示出了如何根據(jù)本發(fā)明的一個(gè)實(shí)施例處理提交請(qǐng)求。接收操作902從數(shù)據(jù)客戶端接收數(shù)據(jù)。在一個(gè)實(shí)施例中,數(shù)據(jù)客戶端是應(yīng)用程序用戶用于輸入數(shù)據(jù)的對(duì)話框,且數(shù)據(jù)在與該對(duì)話框相關(guān)聯(lián)的UI控件被激活時(shí)發(fā)送。緩存操作904然后將數(shù)據(jù)緩存在一個(gè)或多個(gè)事務(wù)變換內(nèi)或與該一個(gè)或多個(gè)事務(wù)變換相關(guān)聯(lián)的存儲(chǔ)器中。當(dāng)接收操作906接收到對(duì)提交操作的請(qǐng)求時(shí),調(diào)用經(jīng)修改的二-階段提交協(xié)議。首先,發(fā)出操作908向與數(shù)據(jù)存儲(chǔ)相關(guān)聯(lián)的多個(gè)數(shù)據(jù)連接器發(fā)出提交請(qǐng)求。在一個(gè)實(shí)施例中,提交請(qǐng)求包括要提交的數(shù)據(jù)。提交請(qǐng)求由高速緩存該數(shù)據(jù)的一個(gè)或多個(gè)數(shù)據(jù)連接器和/或保持該數(shù)據(jù)的一個(gè)或多個(gè)數(shù)據(jù)存儲(chǔ)所接收,并且作為對(duì)數(shù)據(jù)可被最小單元地提交的保證的請(qǐng)求來對(duì)待。接收操作910從保持該數(shù)據(jù)的數(shù)據(jù)連接器和/或數(shù)據(jù)存儲(chǔ)接收響應(yīng)。一旦接收到所有的響應(yīng),確定操作912確定是否該提交請(qǐng)求的所有接收方都同意提交。如果所有接收方都同意,則流程通過“是”分支到發(fā)送操作914。如果并非所有的接收方都同意,則流程通過“否”分支到發(fā)送操作916。如果所有的接收方都同意提交數(shù)據(jù),則發(fā)送操作914向由發(fā)出操作908發(fā)出的提交請(qǐng)求的所有接收方提交命令。接收方提交該數(shù)據(jù)(即,以此變化更新其自己的數(shù)據(jù))。如果并非所有的接收方都同意提交數(shù)據(jù),則發(fā)送操作916向接收方發(fā)送異常中止命令。接收方因此知道建議的提交不會(huì)發(fā)生,并且與該提交相關(guān)聯(lián)的任何數(shù)據(jù)可被丟棄。在一個(gè)實(shí)施例中,發(fā)送操作916僅向同意提交數(shù)據(jù)的接收方發(fā)送異常中止命令,而不同意提交數(shù)據(jù)的接收方自動(dòng)丟棄該數(shù)據(jù)而無需明確地命令其這樣做。接著,刷新操作918執(zhí)行刷新控制操作來刷新緩存的數(shù)據(jù)。在一個(gè)實(shí)施例中,刷新操作918改為執(zhí)行同步控制操作來同步緩存的數(shù)據(jù)。也構(gòu)想了本發(fā)明的其它實(shí)施例。在一個(gè)實(shí)施例中,每一事務(wù)變換可包括實(shí)施同步規(guī)則的策略模塊。在另一實(shí)施例中,策略模塊規(guī)定用于刷新和同步的并發(fā)性策略。示例性并發(fā)性策略包括保守并發(fā)性(conservativeconcurrency)(其中總是制作對(duì)所有緩存的數(shù)據(jù)的完整副本)以及優(yōu)化并發(fā)性(其中數(shù)據(jù)僅在要求時(shí)被復(fù)制到緩存中)。策略模塊也可允許策略模塊化地添加以處理此處未討論的其它類型的控制操作。在另一實(shí)施例中,可使用事務(wù)變換結(jié)合查詢語(yǔ)言來訪問和處理數(shù)據(jù)。SQL(結(jié)構(gòu)化查詢語(yǔ)言)是廣泛使用的一種這樣的查詢語(yǔ)言。XQuery是另一種這樣的查詢語(yǔ)言。也構(gòu)想了結(jié)合本發(fā)明對(duì)其它查詢語(yǔ)言的使用。在又一實(shí)施例中,數(shù)據(jù)連接器610可提供和(在某種程度上)管理緩存的部分,例如圖6中的緩存和邏輯616。在這一情況下,連接器具有訪問和/或處理緩存的數(shù)據(jù)以控制數(shù)據(jù)的刷新和/或同步組件的邏輯。應(yīng)用程序框架分階段(phasing)模型如上簡(jiǎn)要描述的,應(yīng)用程序和/或應(yīng)用程序組件可被約束到某些階段。一般而言,分階段通過使軟件組件服從多層分階段模型來約束軟件方法在計(jì)算機(jī)系統(tǒng)內(nèi)的執(zhí)行。軟件組件可以是類、對(duì)象、方法或計(jì)算機(jī)系統(tǒng)內(nèi)的其它軟件代碼構(gòu)造。階段是同時(shí)且共同由一組軟件組件共享的操作狀態(tài)。計(jì)算機(jī)系統(tǒng)執(zhí)行頂層分階段模型,也稱為主分階段模型,且一個(gè)或多個(gè)子-階段在該主分階段模型的一個(gè)或多個(gè)階段期間發(fā)生。計(jì)算機(jī)系統(tǒng)內(nèi)的操作被約束到一組階段或子-階段。多層分階段模型1000的一個(gè)示例性實(shí)施例在圖10中示出。該多層分階段模型具有包括三個(gè)階段1002、1004和1006的第一或主階段模型。主階段以由箭頭1016描繪的順序發(fā)生。兩個(gè)子-階段,即子-階段11008和子-階段21010在階段11002期間發(fā)生。此外,另兩個(gè)子-階段,即子-階段2a和子-階段2b在子-階段2期間發(fā)生。由此,分階段模型1000表示了具有在其它階段或子-階段期間發(fā)生的子-階段的一組多層階段。在下文中,對(duì)階段的任何討論也可應(yīng)用于子-階段。每一軟件組件被約束于在一特定階段內(nèi)操作。對(duì)每一軟件方法施加約束以僅在該軟件方法被約束到的階段期間執(zhí)行或被調(diào)用。能夠造成沖突或矛盾結(jié)果的軟件方法被約束到不同的階段,在此該軟件方法就不能從當(dāng)前階段被合法地調(diào)用。由此,每一軟件方法以已知的方式執(zhí)行而不會(huì)在完成矛盾任務(wù)的方法之間產(chǎn)生沖突。所有方法都在一特定的階段約束下執(zhí)行,使得軟件系統(tǒng)被稱為處于與當(dāng)前階段約束兼容的狀態(tài)中。再次參考圖10,階段11002是子-階段11008和子-階段21010的超階段。另兩個(gè)子-階段,即子-階段2a1012和子-階段2b1014在子-階段21010期間發(fā)生。同樣,子-階段21010是子-階段2a1012和子-階段2b1014的超階段。任何階段或子-階段可具有子-階段。對(duì)于多層分階段模型內(nèi)的子-階段的層數(shù)沒有限制。另外,在任何階段空間中必須有至少兩個(gè)階段,但是對(duì)兩個(gè)階段之上的階段數(shù)沒有限制。另外,如果在超階段內(nèi)有子-階段,則必須有至少兩個(gè)子-階段,但是對(duì)在兩個(gè)子-階段之上的任何超階段期間發(fā)生的子-階段的數(shù)目沒有限制。任何子-階段組可在超階段期間循環(huán)一次或多次。階段模型1000示出了階段空間。階段空間是確定有效階段(圖節(jié)點(diǎn))和有效階段轉(zhuǎn)換(圖的邊)的有限有向圖。因此,階段空間確定了有效階段序列。階段空間1000被定義在階段組階段11002、階段21004和階段31006上。階段空間1000還有三個(gè)階段轉(zhuǎn)換1018a、1018b和1018c。階段轉(zhuǎn)換表示共享預(yù)轉(zhuǎn)換階段的所有軟件組件的同時(shí)階段改變何時(shí)發(fā)生。當(dāng)軟件組件共享一階段空間時(shí),這些軟件組件是階段域的一部分。階段域是對(duì)由特定階段空間定義的公共分階段模型達(dá)成一致的一組軟件。例如,同意受具有主階段1002、1004和1006的主階段空間約束的所有軟件組件是主階段域的一部分。由此,與主階段域中的軟件組件相關(guān)聯(lián)的所有軟件組件包括與主階段1002、1004和1006中的至少一個(gè)相關(guān)聯(lián)的階段約束。階段約束是限制在某一特定程序上下文中有效的階段的靜態(tài)約束。特別地,約束可被應(yīng)用于程序段,從而斷言該程序段僅在遵從該約束的階段期間執(zhí)行。在一個(gè)實(shí)施例中,階段約束被寫為括號(hào)中的屬性,諸如[Phase1]。這一數(shù)據(jù)結(jié)構(gòu)將在以下更詳細(xì)解釋。具有占據(jù)一個(gè)或多個(gè)階段域的一個(gè)或多個(gè)組件的計(jì)算機(jī)環(huán)境1100在圖11中示出。主指導(dǎo)器1102控制主階段空間的轉(zhuǎn)換和建立。該計(jì)算機(jī)環(huán)境內(nèi)的所有組件是主階段域1100的一部分,但是可占據(jù)一個(gè)或多個(gè)子-階段域。為允許創(chuàng)建階段域1100,程序作者需要選擇階段空間、在該階段空間上執(zhí)行階段轉(zhuǎn)換的策略、以及處理跨階段域邊界的消息的策略。階段域1100可由多層階段空間來表征。在本發(fā)明的各實(shí)施例中,諸如組件11104等一個(gè)或多個(gè)組件向主指導(dǎo)器1102注冊(cè)。組件11104表示任何類型的軟件構(gòu)造,包括軟件組件或方法。軟件組件1104被約束于主階段空間中的階段之一。在其它實(shí)施例中,諸如子-指導(dǎo)器11106和子-指導(dǎo)器21108等一個(gè)或多個(gè)子-指導(dǎo)器向主指導(dǎo)器1102注冊(cè)。子-指導(dǎo)器控制具有一個(gè)或多個(gè)不同階段空間的一個(gè)或多個(gè)其它階段域。由此,階段域1100具有一個(gè)或多個(gè)嵌套的階段域。諸如向子-指導(dǎo)器11106注冊(cè)的組件21110等所有組件被約束于子-階段空間內(nèi)以及主階段空間的一個(gè)或多個(gè)主階段內(nèi)的一個(gè)或多個(gè)子-階段。在一個(gè)實(shí)施例中,由子-指導(dǎo)器控制的子-階段域在單個(gè)主階段內(nèi)操作。子-階段的操作可以在單個(gè)主階段期間重復(fù)發(fā)生。在本發(fā)明的各實(shí)施例中,諸如子-指導(dǎo)器2等子-指導(dǎo)器向諸如子-指導(dǎo)器3等其它子-指導(dǎo)器注冊(cè)以創(chuàng)建進(jìn)一步嵌套的子-階段域。在某些實(shí)施例中,子-指導(dǎo)器21108控制組件31112的和子-指導(dǎo)器31114的操作。在其它實(shí)施例中,諸如子-指導(dǎo)器31114等指導(dǎo)器控制諸如組件41116和組件51118等一個(gè)以上組件。每一子-指導(dǎo)器可控制具有獨(dú)特階段的階段空間。由此,子-指導(dǎo)器11106操作第一子-階段空間,而子-指導(dǎo)器31114操作第二子-階段空間。如果二-階段空間不交互,則階段空間被稱為正交空間。正交階段空間的組合可形成笛卡爾階段空間,它可用于形成用于單個(gè)乘積的階段域。底層階段組是正交階段組的笛卡爾乘積,其中有效階段轉(zhuǎn)換也是正交階段組的有效轉(zhuǎn)換的笛卡爾乘積。在本發(fā)明的各實(shí)施例中,指導(dǎo)器是邏輯時(shí)鐘。指導(dǎo)器類似于硬件系統(tǒng)中的時(shí)鐘循環(huán)通過各階段。在每一階段轉(zhuǎn)換時(shí),指導(dǎo)器同時(shí)改變階段域內(nèi)的所有軟件組件的階段。在一個(gè)實(shí)施例中,任何子-指導(dǎo)器可同時(shí)改變子-階段域中的子-階段。邏輯時(shí)鐘等待被約束于階段的操作或在約束于該階段的子-階段內(nèi)執(zhí)行的操作的完成??捎糜谥麟A段域的階段空間1200的一個(gè)示例性實(shí)施例在圖12中示出。階段空間1200具有三個(gè)階段。在讀請(qǐng)求階段1202期間,將對(duì)數(shù)據(jù)讀或?qū)懙恼?qǐng)求或軟件系統(tǒng)中的其它軟件命令或請(qǐng)求排隊(duì),直到進(jìn)入下一階段。在一個(gè)實(shí)施例中,僅所請(qǐng)求的某些非重復(fù)方法在下一階段中執(zhí)行,而其它方法等待另一階段或階段的下一循環(huán)。更新階段1204將命令和請(qǐng)求定向到適當(dāng)?shù)能浖M件。在本發(fā)明的各實(shí)施例中,在更新階段1204,軟件組件履行命令或請(qǐng)求。在一個(gè)實(shí)施例中,更新階段1204具有在更新階段1204期間發(fā)生的子-階段空間500。一個(gè)示例性子-階段500在圖5中示出并在下文解釋。在一個(gè)實(shí)施例中,更新階段1204觸發(fā)用于數(shù)據(jù)層的子-階段。換言之,對(duì)數(shù)據(jù)寫的任何請(qǐng)求在更新階段1204的子-階段中實(shí)現(xiàn)。第三階段,即重新確認(rèn)階段1206指導(dǎo)并執(zhí)行在更新階段1204期間未處理的其它方法。在一個(gè)實(shí)施例中,檢索數(shù)據(jù)的所有請(qǐng)求在重新確認(rèn)階段1206期間完成。例如,在更新階段1204中更新了數(shù)據(jù)之后,通知所有軟件組件發(fā)生了數(shù)據(jù)改變,且被通知的軟件組件檢索更新的數(shù)據(jù)。在一個(gè)實(shí)施例中,重新確認(rèn)階段1206操作子-階段空間600。子-階段空間的一個(gè)示例性實(shí)施例1300在圖13中示出并在以下描述。為改變階段,階段空間1200通過階段轉(zhuǎn)換。在該示例性實(shí)施例中,存在表示三個(gè)階段1202、1204和1206之間的轉(zhuǎn)換的三個(gè)階段轉(zhuǎn)換1208a、1208b和1208c。如上所述,階段轉(zhuǎn)換是諸如指導(dǎo)器1102等指導(dǎo)器改變階段時(shí)鐘,且階段域中用于所有軟件組件的階段同時(shí)改變的時(shí)間點(diǎn)。對(duì)階段域內(nèi)的軟件組件的關(guān)于當(dāng)前階段或向新階段的轉(zhuǎn)換的提醒或通知可以發(fā)生。在一個(gè)實(shí)施例中,指導(dǎo)器通知階段的所有軟件組件。在其它實(shí)施例中,請(qǐng)求方法向指導(dǎo)器要求階段。在本發(fā)明的各實(shí)施例中,轉(zhuǎn)換通知被發(fā)送給階段域內(nèi)的一個(gè)或多個(gè)軟件組件。在一個(gè)實(shí)施例中,轉(zhuǎn)換通知在當(dāng)前階段期間或在下一階段的開始處發(fā)生。在其它實(shí)施例中,對(duì)通知過程采用單獨(dú)的階段。例如,階段空間1200可具有位于轉(zhuǎn)換1208a、1208b和1208c處的三個(gè)通知階段,用于通知階段域內(nèi)的軟件組件。更新階段1204的一個(gè)示例性子-階段空間1300在圖13中示出。子-階段1300在某些實(shí)施例中用于數(shù)據(jù)層。換言之,用于將數(shù)據(jù)寫入共享數(shù)據(jù)結(jié)構(gòu)的方法被約束于數(shù)據(jù)子-階段空間1300的子-階段之一。在一個(gè)實(shí)施例中,共享該數(shù)據(jù)的所有軟件組件在合約階段1302中同意提交該改變或異常中止該改變。該改變?cè)谔峤换虍惓V兄闺A段1304中被提交或異常中止。在另一實(shí)施例中,合約階段和提交或異常中止階段是“提交或異常中止”子-階段1304的子-階段,且子-階段空間1300具有標(biāo)記階段1302而非合約子-階段1302。此處,數(shù)據(jù)改變?cè)谔峤换虍惓V兄闺A段1304中作出,且使用該數(shù)據(jù)的所有軟件組件被標(biāo)記用于在標(biāo)記階段1302中更新。標(biāo)記軟件組件是在軟件組件中設(shè)置標(biāo)志,以發(fā)信號(hào)通知該軟件組件在適當(dāng)?shù)纳院箅A段中檢索更新的數(shù)據(jù)。在一個(gè)實(shí)施例中,標(biāo)記的軟件組件在重新確認(rèn)階段1206檢索數(shù)據(jù)。在另一實(shí)施例中,標(biāo)記階段1302具有兩個(gè)子-階段標(biāo)記子-階段和最終標(biāo)記子-階段。此處,使用該數(shù)據(jù)的軟件組件在標(biāo)記子-階段中被標(biāo)記,并在最終標(biāo)記子-階段中檢索數(shù)據(jù)。在重新確認(rèn)階段1206期間發(fā)生的另一示例性子-階段空間1400在圖14A中示出。約束于子-階段空間1400的軟件構(gòu)造中的一個(gè)示例性改變?cè)趫D14B中示出。子-階段空間1400提供用于即插即用操作的子-階段。即插即用子-階段空間1400具有兩個(gè)階段用子-階段1404和插子-階段1402。一般而言,在插子-階段1402中,建立、改變或移除軟件組件的組合和配置,但是不執(zhí)行任何使用時(shí)間功能。同樣,在用子-階段1404中,對(duì)常規(guī)功能使用軟件組件所建立的組合或配置,但是不建立、改變或移除組合或配置方面。模塊重新配置的一個(gè)示例性實(shí)施例在圖14B中示出。在該實(shí)施例中,軟件模塊具有第一配置1406。在諸如用戶輸入請(qǐng)求等某一動(dòng)作之后,軟件模塊改為第二配置1408。本領(lǐng)域的技術(shù)人員將認(rèn)識(shí)到,軟件模塊在第一配置1406中與在第二配置1408中不同地操作。由此,重新配置應(yīng)當(dāng)在與該軟件模塊交互的用階段期間沒有方法執(zhí)行的情況下發(fā)生。在本發(fā)明的各實(shí)施例中,在插子-階段1402,軟件實(shí)例被初始化、連接或斷開,并設(shè)置屬性。在某些實(shí)施例中,其它子-階段幫助定制在插子-階段1402中執(zhí)行的操作。在一個(gè)實(shí)施例中,插子-階段1402具有其它子-階段。構(gòu)造子-階段1410通過實(shí)例化已知的類、調(diào)用軟件組件或使用現(xiàn)有實(shí)例上的接口來獲取一個(gè)克隆的或被專門導(dǎo)出的實(shí)例來創(chuàng)建新軟件實(shí)例。最后,初始化子-階段1414設(shè)置屬性并要求正確連接的實(shí)例之間的協(xié)商。插子-階段1402中的子-階段可偏離此處所呈現(xiàn)的子-階段。另外,該子-階段1404也可包含子-階段。構(gòu)想了其它分階段空間。例如,構(gòu)想了用于用戶界面改變的子-階段空間。在用戶界面子-階段空間中,無效子-階段可允許用于構(gòu)建結(jié)構(gòu)的方法的執(zhí)行。繪制子-階段然后繪制構(gòu)建結(jié)構(gòu)。如本領(lǐng)域的技術(shù)人員將認(rèn)識(shí)到的,可對(duì)其它類型的操作使用其它階段空間。另外,本領(lǐng)域的技術(shù)人員將認(rèn)識(shí)到以上呈現(xiàn)的示例性階段空間可在階段或子-階段的數(shù)目、層或級(jí)的數(shù)目以及階段或子-階段的類型方面改變。由此,本發(fā)明是可擴(kuò)展的。在一個(gè)實(shí)施例中,新的超階段被疊加在現(xiàn)有階段空間上。在另一實(shí)施例中,新的階段被添加到現(xiàn)有的階段空間。在還有的一些實(shí)施例中,向現(xiàn)有的階段空間添加更多子-階段或子-階段空間的新層。具有約束代碼項(xiàng)執(zhí)行的階段約束的數(shù)據(jù)結(jié)構(gòu)1500的一個(gè)示例性實(shí)施例在圖15中示出。數(shù)據(jù)結(jié)構(gòu)1500是代碼元素。任何類型的代碼可具有階段約束。階段約束1502被示為在方法1504之上。階段約束1502將方法1504的操作約束于階段約束中指定的階段,在本實(shí)施例中為階段“執(zhí)行”。由此,方法1504僅在“執(zhí)行”階段或“執(zhí)行”子-階段期間執(zhí)行。在本發(fā)明的各實(shí)施例中,數(shù)據(jù)結(jié)構(gòu)包含取決于軟件組件和所執(zhí)行的操作的類型的約束的形式。在一個(gè)實(shí)施例中,約束是調(diào)用約束。調(diào)用約束將方法調(diào)用約束于指定階段。由此,在其它軟件組件或同一軟件組件中的方法的執(zhí)行通過限制這些方法僅在指定階段期間啟動(dòng)而被約束。在另一實(shí)施例中,約束是構(gòu)造器約束。構(gòu)造器是實(shí)例化軟件組件的一種特殊形式的方法。由此,軟件組件的實(shí)例化被約束于指定階段,諸如對(duì)于圖14A中的構(gòu)造子-階段1410所解釋的。在另一實(shí)施例中,約束是引用約束。引用約束約束了軟件組件的整個(gè)類以及該類的所有原語(yǔ)操作。例如,對(duì)接口施加的引用約束限制了軟件模塊之間的連接,如對(duì)于圖14A中的連接子-階段1412所解釋的。約束由軟件代碼中可被分配給任何目標(biāo)軟件組件的階段約束屬性來表達(dá)。在本發(fā)明的各實(shí)施例中,階段約束屬性被分配給整個(gè)類且是可繼承的。由此,孩子組件從其父組件繼承約束。在某些實(shí)施例中,分階段方案對(duì)同一目標(biāo)施加多個(gè)階段約束屬性。由此,軟件目標(biāo)通過多個(gè)階段約束的結(jié)合來約束。每一約束是對(duì)與所指定的階段的層次相關(guān)聯(lián)的“類型”的約束。由此,指定超階段的約束是對(duì)“超階段”的約束。指定子-階段的約束是對(duì)“子-階段”的約束。對(duì)作為子-階段的類型的約束是對(duì)關(guān)于“超類型”的所有約束的并集的約束。對(duì)類型的約束之間的關(guān)系由編譯器使用或在運(yùn)行時(shí)使用以檢查不同軟件組件之間的約束關(guān)系的有效性。實(shí)施約束可在運(yùn)行時(shí)或在編譯時(shí)發(fā)生。在編譯時(shí),可檢查對(duì)類型的約束。編譯器可對(duì)照用于具有對(duì)類型的約束的方法(它調(diào)用具有對(duì)子類型的約束的方法)的一組合法性規(guī)則來檢查對(duì)類型的約束以及對(duì)子類型的約束。如果對(duì)子類型的約束與對(duì)類型的約束相同或比它弱,例如,如果對(duì)類型的約束指定了插階段1402,而對(duì)子類型的約束指定了初始化子-階段1414,則該約束方案是有效的。在該實(shí)施例中,初始化子-階段約束1414在插子-階段1402內(nèi)執(zhí)行,且因此是較弱的約束。如果對(duì)子類型的約束與對(duì)類型的約束互不相交,例如,如果對(duì)類型的約束指定了用子-階段1404,而對(duì)子類型的約束指定了相反的插子-階段1402,則約束方案是無效的。如果對(duì)子類型的約束比對(duì)類型的約束強(qiáng)或與其重疊,例如,如果對(duì)類型的約束指定了插子-階段1402,而對(duì)子類型的約束指定了初始化子-階段1414,則約束方案是有效的,但是必須經(jīng)受某一動(dòng)態(tài)檢查。在該實(shí)施例中,如果階段域當(dāng)前同時(shí)在插子-階段1402和初始化子-階段1414中操作,則該調(diào)用方案是有效的。然而,如果域不在兩個(gè)子-階段之一中,則該方案是無效的。其它合法性規(guī)則也被構(gòu)想并結(jié)合到本發(fā)明中。用于在多層分階段域中操作計(jì)算機(jī)環(huán)境的方法1600的一個(gè)示例性實(shí)施例在圖16A和圖16B中示出。在開始之后,轉(zhuǎn)換操作1602轉(zhuǎn)換到第一階段,如請(qǐng)求階段1202。在一個(gè)實(shí)施例中,啟動(dòng)諸如主指導(dǎo)器1102等主指導(dǎo)器。在一個(gè)實(shí)施例中,諸如組件1104等組件被約束于向主指導(dǎo)器注冊(cè)的主階段之一。主指導(dǎo)器開始階段時(shí)鐘以將邏輯時(shí)間循環(huán)通過諸如階段空間1200等階段空間內(nèi)的階段。確定操作1604確定諸如組件1104等任何軟件組件是否被約束于主階段中的第一個(gè)。如果一軟件組件被約束于第一階段,則執(zhí)行操作1606在第一階段期間執(zhí)行該軟件組件。如果沒有軟件組件要執(zhí)行或者在軟件組件的執(zhí)行期間,則確定操作1608確定是否有在第一階段期間發(fā)生的子-階段空間,諸如子-階段空間1300。如果在第一階段期間沒有子-階段空間發(fā)生,則該過程通過連接器1前進(jìn)到圖16B所示的轉(zhuǎn)換操作1622。如果有在第一階段期間發(fā)生的子-階段空間,則標(biāo)識(shí)操作1610標(biāo)識(shí)該子-階段空間以及適用的子-階段。在一個(gè)實(shí)施例中,諸如子-指導(dǎo)器1106等子-指導(dǎo)器被啟動(dòng)并向控制主階段空間的主指導(dǎo)器注冊(cè)。子-指導(dǎo)器開始子-階段邏輯時(shí)鐘以循環(huán)通過子-階段空間中的各子-階段。確定操作1612確定是否有被約束于當(dāng)前子-階段的任何軟件組件,如組件1112。在一個(gè)實(shí)施例中,約束于子-階段空間的軟件組件向子-指導(dǎo)器注冊(cè)。由此,在主階段域下創(chuàng)建了嵌套的子-階段域。如果在約束于當(dāng)前子-階段的子-階段域中有軟件組件,則執(zhí)行操作1614在當(dāng)前子-階段期間執(zhí)行這些軟件組件。確定操作1616確定是否有在當(dāng)前子-階段期間發(fā)生的其它子-階段空間,諸如子-階段1410、1412和1414。如果有其它子-階段,則該過程返回到標(biāo)識(shí)操作1610以標(biāo)識(shí)其它子-階段。如果沒有其它子-階段空間要標(biāo)識(shí),則確定操作1618確定是否有任何其它子-階段空間剩下要在當(dāng)前子-階段空間中發(fā)生。如果有另一子-階段要在當(dāng)前子-階段空間中發(fā)生,則轉(zhuǎn)換操作1620轉(zhuǎn)換到子-階段空間中的下一子-階段。在一個(gè)實(shí)施例中,子-指導(dǎo)器等待,直到當(dāng)前子-階段中的所有線程被執(zhí)行,然后轉(zhuǎn)換到下一子-階段。然后,該過程再次前進(jìn)到確定操作1612。如果當(dāng)前子-階段空間中沒有剩下任何子-階段,則確定操作1618確定在任何超階段空間中是否有要轉(zhuǎn)換到的另一超階段。如果有另一超階段,則轉(zhuǎn)換操作1620轉(zhuǎn)換到下一超階段。該過程(確定超階段內(nèi)的子-階段;在子-階段內(nèi)執(zhí)行軟件組件;轉(zhuǎn)換到下一子-階段直到所有子-階段完成;以及然后轉(zhuǎn)換到下一超階段)重復(fù),直到循環(huán)通過了所有子-階段空間并且要求轉(zhuǎn)換到下一主階段。一旦子-階段循環(huán)對(duì)第一主階段結(jié)束,則該過程通過連接器1前進(jìn)到圖16B所示的轉(zhuǎn)換操作1622。轉(zhuǎn)換操作1622轉(zhuǎn)換到下一主階段,如更新階段1204。在一個(gè)實(shí)施例中,主指導(dǎo)器等待在第一階段中執(zhí)行的所有線程結(jié)束。然后,主指導(dǎo)器將邏輯階段時(shí)鐘改為下一階段。在某些實(shí)施例中,主指導(dǎo)器遵循以上參考圖11列出的轉(zhuǎn)換規(guī)則。該過程然后遵循如同用于標(biāo)識(shí)子-階段的第一階段發(fā)生時(shí)相類似的操作。由此,關(guān)于子-階段過程的某些細(xì)節(jié)此處不再討論,但是本領(lǐng)域的技術(shù)人員將認(rèn)識(shí)到如何將關(guān)于第一階段描述的細(xì)節(jié)實(shí)現(xiàn)到約束于下一階段的任何后續(xù)過程中。確定操作1624確定是否有任何軟件組件被約束于當(dāng)前主階段。如果有被約束于下一主階段的軟件組件,則執(zhí)行操作1626執(zhí)行該軟件組件。在各實(shí)施例中,這些軟件組件已向主指導(dǎo)器注冊(cè)。這些軟件組件繼續(xù)為當(dāng)前階段與主指導(dǎo)器協(xié)商。當(dāng)階段轉(zhuǎn)換和主指導(dǎo)器報(bào)告該域現(xiàn)在在下一主階段中時(shí),約束于下一主階段的軟件組件開始執(zhí)行。如果沒有約束于下一主階段的軟件組件或者在約束的軟件組件的執(zhí)行期間,則確定操作1628確定當(dāng)前主階段內(nèi)是否有任何子-階段空間。如果有子-階段空間,則標(biāo)識(shí)操作1630標(biāo)識(shí)這些子-階段空間并轉(zhuǎn)換到第一子-階段。確定操作1632確定是否有任何軟件組件約束于當(dāng)前子-階段。如果有約束于當(dāng)前子-階段的軟件組件,則執(zhí)行操作1634執(zhí)行該軟件組件。如果沒有約束于當(dāng)前子-階段的軟件組件或者在這些軟件組件的執(zhí)行期間,則確定操作1636確定當(dāng)前子-階段內(nèi)是否有其它子-階段空間。如果有其它子-階段空間,則該過程返回到標(biāo)識(shí)操作1630。如果當(dāng)前子-階段內(nèi)沒有其它子-階段空間,則確定操作1638確定是否有當(dāng)前子-階段空間中的下一子-階段或者超階段空間中的下一超階段。如果有下一子-階段或超階段,則轉(zhuǎn)換操作1640轉(zhuǎn)換到下一子-階段或超階段。如果在當(dāng)前主階段下沒有下一子-階段或超階段,則確定操作1642確定是否有下一主階段,諸如重新確認(rèn)階段1206。如果有下一主階段,則該過程返回到轉(zhuǎn)換操作1622。如果主階段空間中沒有另一主階段,則該過程通過連接器2返回到轉(zhuǎn)換操作1602并通過轉(zhuǎn)換到第一階段來開始階段循環(huán)。為進(jìn)一步解釋本發(fā)明,以下參考圖17描述在多層分階段域中操作的一個(gè)示例性計(jì)算機(jī)系統(tǒng)。該示例性計(jì)算機(jī)系統(tǒng)操作個(gè)人聯(lián)系應(yīng)用程序,諸如消息通信和協(xié)作客戶端程序。此處,用戶界面顯示地址簿中的一個(gè)或多個(gè)聯(lián)系人。用戶界面具有主視圖窗口1702。主視圖1702示出了所有聯(lián)系人并允許用戶選擇聯(lián)系人來查看關(guān)于該聯(lián)系人的更詳細(xì)信息。計(jì)算機(jī)環(huán)境1700在階段空間下操作。為解釋起見而非限制,整個(gè)系統(tǒng)1700在圖12所示的階段空間1200下操作。另外,出于解釋的目的,計(jì)算機(jī)系統(tǒng)1700當(dāng)前是在請(qǐng)求階段1202中。由此,計(jì)算機(jī)系統(tǒng)1700允許其中接收請(qǐng)求或命令的任何操作。由此,接收查看聯(lián)系人的詳細(xì)視圖1704的用戶命令1716并將其置于隊(duì)列中。另外,命令1718被發(fā)送到地址簿模塊1708以檢索所請(qǐng)求的詳細(xì)信息。數(shù)據(jù)請(qǐng)求1718也被排隊(duì)。主指導(dǎo)器1102將計(jì)算機(jī)系統(tǒng)域1700中的階段改為更新階段1204。此處,命令1716和1718分別被發(fā)送到選擇狀態(tài)模塊1706和地址簿1708。在更新階段1204期間,轉(zhuǎn)換到如以上參考圖14所解釋的用于對(duì)用戶界面的改變的用戶界面子-階段空間。無效子-階段開始。用于詳細(xì)視圖1704的命令1716開始處理。主視圖1702中的視圖被無效。例如,對(duì)詳細(xì)視圖1704的選擇被設(shè)為非活動(dòng)。另外,主視圖1702被設(shè)為非活動(dòng)窗口。詳細(xì)視圖1704用適當(dāng)?shù)挠蚝陀脩艚缑骓?xiàng)來創(chuàng)建。用戶界面子-指導(dǎo)器然后轉(zhuǎn)換到繪制子-階段。主視圖1702中對(duì)聯(lián)系人的選擇被繪制以顯現(xiàn)為非活動(dòng),例如加亮的選擇改變顏色。主視圖1702被繪制為非活動(dòng)。例如,主視圖1702窗格改變顏色以表示它是非活動(dòng)的。詳細(xì)視圖1704用用戶界面元素來繪制。字段保持打開以從地址簿模塊1708接收數(shù)據(jù)。主指導(dǎo)器1102在用戶界面子空間中的所有無效和繪制約束操作完成之后轉(zhuǎn)換到重新確認(rèn)階段1206。在重新確認(rèn)階段1206期間執(zhí)行數(shù)據(jù)檢索操作。在一個(gè)實(shí)施例中,數(shù)據(jù)檢索操作被約束于數(shù)據(jù)檢索子-階段空間。數(shù)據(jù)檢索子-階段空間具有兩個(gè)子-階段,即標(biāo)記和最終標(biāo)記,如參考圖13所解釋的。啟動(dòng)標(biāo)記子-階段。地址簿搜索需要數(shù)據(jù)更新的軟件模塊。標(biāo)記詳細(xì)視圖1704。用于數(shù)據(jù)的子-指導(dǎo)器檢索向最終標(biāo)記子-階段的子-階段空間轉(zhuǎn)換。在最終標(biāo)記子-階段中,地址簿1708從以下三個(gè)數(shù)據(jù)存儲(chǔ)之一中檢索所需的聯(lián)系人信息Exchange服務(wù)器地址簿1710、客戶端地址簿1712或MSN地址簿。在檢索到聯(lián)系人信息之后,地址簿1708將聯(lián)系人信息寫入詳細(xì)視圖1704。在完成了約束于重新確認(rèn)階段1206的所有操作之后,主指導(dǎo)器1102轉(zhuǎn)換回請(qǐng)求階段1202。此處,用戶界面再次從用戶輸入設(shè)備接受命令和請(qǐng)求。用戶在詳細(xì)視圖1704內(nèi)輸入對(duì)聯(lián)系人信息的改變。例如,用戶改變聯(lián)系人的地址。命令1720從詳細(xì)視圖1704發(fā)送到地址簿1708(原文1704,錯(cuò))以改變數(shù)據(jù)。另外,命令1722被發(fā)送到選擇狀態(tài)1706以更新主視圖1702和詳細(xì)視圖1704的視圖。在這一實(shí)施例中,命令將被排隊(duì),且主指導(dǎo)器1102轉(zhuǎn)換到更新階段1204。更新階段1204啟動(dòng)數(shù)據(jù)寫子-階段空間,諸如子-階段空間1300。在合約(agreement)子-階段1302中,地址簿將數(shù)據(jù)改變請(qǐng)求發(fā)送到若干數(shù)據(jù)存儲(chǔ)1710、1712和1714。數(shù)據(jù)存儲(chǔ)中的一個(gè)或多個(gè)可包含詳細(xì)視圖1704中改變的數(shù)據(jù)的副本。由此,具有該數(shù)據(jù)的每一數(shù)據(jù)存儲(chǔ)必須同意改變數(shù)據(jù)。由此,在合約子-階段1302期間發(fā)生投票過程。如果所有的數(shù)據(jù)存儲(chǔ)同意提交該改變,則將該合約發(fā)回地址簿1708。子-指導(dǎo)器將階段改為提交或異常中止階段1304。此處,數(shù)據(jù)改變被發(fā)送到數(shù)據(jù)存儲(chǔ)并用于更新數(shù)據(jù)。同時(shí),在更新階段1204期間,用戶界面子-階段空間發(fā)生。選擇狀態(tài)1706在無效子-階段中將主視圖1702和詳細(xì)視圖1704中包含舊數(shù)據(jù)的部分無效。在繪制子-階段中,重新繪制主視圖1702和詳細(xì)視圖1704,從而為改變的數(shù)據(jù)保持了空間。在所有子-階段在更新階段1204中完成之后,階段域1700轉(zhuǎn)換到重新確認(rèn)階段1206。在重新確認(rèn)階段1206中,其它子-階段空間包括用于標(biāo)記和最終標(biāo)記的子-階段。轉(zhuǎn)換到標(biāo)記階段,地址簿1708將主視圖1702和詳細(xì)視圖1704標(biāo)記為需要改變的數(shù)據(jù)。在最終標(biāo)記子-階段中,改變的數(shù)據(jù)被寫入主視圖1702和詳細(xì)視圖1704。這些改變可在非常短的時(shí)間內(nèi)且以精細(xì)的粒度發(fā)生。例如,階段在用戶輸入每一字符之后且在幾分之一秒的瞬間內(nèi)循環(huán)。由此,改變看似為立即發(fā)生。本示例示出了如何對(duì)系統(tǒng)內(nèi)的方法執(zhí)行施加多層分階段約束。如果命令和改變?cè)跊]有分階段的情況下發(fā)生,則主視圖1702和詳細(xì)視圖1704可能在所有數(shù)據(jù)存儲(chǔ)改變數(shù)據(jù)之前被更新。因此,用戶可取決于試圖改變數(shù)據(jù)并更新用戶界面試圖的方法的順序來查看詳細(xì)試圖1704或主試圖1702中的混合結(jié)果。利用并發(fā)性域的多線程化如上簡(jiǎn)要描述的,應(yīng)用程序和/或應(yīng)用程序組件可被約束于特定階段或特定階段域。根據(jù)本發(fā)明的各實(shí)施例,軟件應(yīng)用程序的組件可被劃分成單獨(dú)的域,用于在組件分區(qū)內(nèi)提供同步和線程隔離并用于提供組件分區(qū)之間的改進(jìn)的并發(fā)操作。圖18示出了根據(jù)本發(fā)明的一個(gè)實(shí)施例的被配置成并發(fā)地執(zhí)行多個(gè)對(duì)象的一個(gè)示例系統(tǒng)。示例系統(tǒng)1800包括并發(fā)性域1801,它是都是在單個(gè)線程1802上執(zhí)行且不直接(例如,同步地)與外部對(duì)象1810通信的一個(gè)或多個(gè)單線程化對(duì)象1803的集合(或分區(qū))。內(nèi)部線程1802根據(jù)由并發(fā)性域1801施加的邏輯來執(zhí)行對(duì)象1803。內(nèi)部線程1802僅執(zhí)行并發(fā)性域1801內(nèi)的單線程化對(duì)象1803。內(nèi)部線程1802不執(zhí)行任何外部對(duì)象1810。根據(jù)一個(gè)實(shí)施例,同一線程無需在并發(fā)性域1801的整個(gè)生命期間都用作內(nèi)部線程1802。相反,當(dāng)沒有對(duì)象要求在內(nèi)部線程1802上執(zhí)行時(shí),用作內(nèi)部線程1802的線程可返回到線程池(未示出)。當(dāng)再次要求一線程時(shí),可從線程池中拉出一新線程以用作內(nèi)部線程1802。根據(jù)另一實(shí)施例,單線程化對(duì)象1803之一具有線程親合力(affinity),這意味著單線程化對(duì)象1803需要在同一線程上執(zhí)行。在該實(shí)施例中,同一線程在并發(fā)性域1801的整個(gè)生命期間用作內(nèi)部線程1802。根據(jù)一個(gè)實(shí)施例,此處更詳細(xì)討論的次要線程1804也從線程池中分配。仍參考圖18,系統(tǒng)1800還包括至少一個(gè)次要線程1804和至少一個(gè)外部對(duì)象1810。外部對(duì)象1810的實(shí)施例包括在一個(gè)或多個(gè)次要線程1804上執(zhí)行的任何對(duì)象。次要線程1804包括除在相關(guān)聯(lián)的應(yīng)用程序中執(zhí)行的內(nèi)部線程1802之外的任何線程。如上所述,圖18中所示的示例并發(fā)性域1801包括內(nèi)部線程1802和多個(gè)單線程化對(duì)象1803。這些單線程化對(duì)象1803僅使用內(nèi)部線程1802來執(zhí)行。并發(fā)性域1801內(nèi)的對(duì)象1803與程序中的其余次要線程1804和外部對(duì)象1810隔離。次要線程1804不執(zhí)行并發(fā)性域1801中包括的任何單線程化對(duì)象1803。每一外部對(duì)象1810被配置成在次要線程1804的一個(gè)或多個(gè)上執(zhí)行。外部對(duì)象1810與并發(fā)性域1801內(nèi)的單線程化對(duì)象1803異步地通信。通信包括在對(duì)象之間傳遞數(shù)據(jù)或由另一對(duì)象調(diào)用一個(gè)對(duì)象的方法(例如,或任務(wù))。跨并發(fā)性域1801邊界的異步通信通過使用邊界對(duì)象1807來實(shí)現(xiàn)。每一并發(fā)性域1801與一個(gè)或多個(gè)邊界對(duì)象1807相關(guān)聯(lián)。這些邊界對(duì)象1807可被示為包圍并發(fā)性域1801的隔膜或帶門的墻。邊界對(duì)象1807的示例包括實(shí)現(xiàn)并發(fā)性域1801之間或并發(fā)性域1801和外部對(duì)象1810之間的自定義協(xié)議的數(shù)據(jù)連接器和對(duì)象。并發(fā)性域1801內(nèi)的單線程化對(duì)象1803使用一個(gè)或多個(gè)邊界對(duì)象1807來與外部對(duì)象1810異步通信。單線程化對(duì)象1803使用內(nèi)部線程1802來與邊界對(duì)象1807通信。邊界對(duì)象1807然后使用一個(gè)或多個(gè)次要線程1804來與外部對(duì)象1810通信。邊界對(duì)象1807由此跨并發(fā)性域1801的邊界來傳遞信息和調(diào)用。根據(jù)另一實(shí)施例,一個(gè)邊界對(duì)象1807在將信息傳遞給外部對(duì)象1810之前使用次要線程1804來與另一邊界對(duì)象1807通信。邊界對(duì)象1807用作并發(fā)性域1801的內(nèi)部線程與次要線程1804的每一個(gè)之間的接口。根據(jù)一個(gè)實(shí)施例,邊界對(duì)象1807使用次要線程1804從外部對(duì)象1810接收入站通信,并將該通信過濾給適當(dāng)?shù)膬?nèi)部對(duì)象1803。此處將更詳細(xì)描述過濾方法。根據(jù)另一實(shí)施例,邊界對(duì)象1807使用內(nèi)部線程1802從內(nèi)部對(duì)象1803接收出站通信,并使用次要線程1804將該通信發(fā)送到適當(dāng)?shù)耐獠繉?duì)象1810。根據(jù)一個(gè)實(shí)施例,邊界對(duì)象可在內(nèi)部線程上向外調(diào)用外部對(duì)象,但是這樣做的邊界對(duì)象是處于約束之下的。即,允許邊界對(duì)象向外調(diào)用外部對(duì)象必須不會(huì)因此而導(dǎo)致無界限的延遲或死鎖。另一約束防止外部對(duì)象保持對(duì)內(nèi)部對(duì)象的引用,這防止并發(fā)性域在外部對(duì)象的控制下的直接重新進(jìn)入。同步通信在第一對(duì)象在其上執(zhí)行的線程進(jìn)入第二對(duì)象以執(zhí)行第二對(duì)象的方法時(shí)發(fā)生。外部對(duì)象1810不與并發(fā)性域1801內(nèi)的單線程化對(duì)象1803同步通信。因此,執(zhí)行外部對(duì)象1810的次要線程不直接調(diào)用或進(jìn)入并發(fā)性域1801內(nèi)的單線程化對(duì)象1803。圖19示出了其中并發(fā)性域1901與外部對(duì)象1910交互的另一示例系統(tǒng)1900。異步通信的一個(gè)示例在外部對(duì)象1910和內(nèi)部對(duì)象1903之間示出。并發(fā)性域1901包括內(nèi)部線程1902、被配置成在內(nèi)部線程1902上執(zhí)行的單線程化對(duì)象1903、以及用于與外部對(duì)象1910通信的邊界對(duì)象1907。該系統(tǒng)1900的另一實(shí)施例包括多個(gè)邊界對(duì)象1907和多個(gè)單線程化對(duì)象1903。根據(jù)一個(gè)實(shí)施例,外部對(duì)象1910包括被配置成在兩個(gè)或多個(gè)次要線程1904上執(zhí)行的多線程化對(duì)象1905。多線程化對(duì)象1905的一部分1905A被示為在一個(gè)次要線程1904A上執(zhí)行,而多線程化對(duì)象1905的另一部分1905B被示為在另一次要線程1904B上執(zhí)行。根據(jù)另一實(shí)施例,外部對(duì)象1910包括被配置成在一個(gè)次要線程1904上執(zhí)行的多個(gè)多線程化對(duì)象1905或單線程化對(duì)象(未示出)。系統(tǒng)1900中的并發(fā)性域1901維護(hù)工作隊(duì)列1908。工作隊(duì)列1908是其上放置(例如,插入)任務(wù)(例如,對(duì)內(nèi)部、單線程化對(duì)象1903的方法的調(diào)用、數(shù)據(jù)更新以及其它可執(zhí)行方法)且從中移除任務(wù)的多元素?cái)?shù)據(jù)結(jié)構(gòu)。根據(jù)一個(gè)實(shí)施例,任務(wù)僅以與布置它們相同的順序從工作隊(duì)列1908中移除;即,根據(jù)先進(jìn)先出約束。根據(jù)另一實(shí)施例,放入工作隊(duì)列1908的任務(wù)被分配優(yōu)先級(jí),且每一任務(wù)根據(jù)其優(yōu)先級(jí)來移除。傳入通信由邊界對(duì)象1907放入工作隊(duì)列1908中。這些放入的通信形成了工作項(xiàng)1911,它們是對(duì)與并發(fā)性域1901相關(guān)聯(lián)的內(nèi)部、單線程化對(duì)象1903或邊界對(duì)象1907的任務(wù)的執(zhí)行的請(qǐng)求(例如,啟用或調(diào)用)。形成工作項(xiàng)1911的請(qǐng)求可由外部對(duì)象1910或另一邊界對(duì)象1907傳送到邊界對(duì)象1907。例如,在圖19中,外部對(duì)象1910的多線程化對(duì)象1905請(qǐng)求邊界對(duì)象1907執(zhí)行任務(wù),如由箭頭1920所描繪的。邊界對(duì)象1907然后將包括該任務(wù)的工作項(xiàng)1911放到工作隊(duì)列1908的末端,如由箭頭1925所描繪的。根據(jù)另一實(shí)施例,多個(gè)邊界對(duì)象1907與并發(fā)性域1901相關(guān)聯(lián),且這些邊界對(duì)象1907中的一個(gè)或多個(gè)可將工作項(xiàng)1911放入工作隊(duì)列1908。根據(jù)又一實(shí)施例,內(nèi)部、單線程化對(duì)象1903請(qǐng)求邊界對(duì)象1907將工作項(xiàng)1911放入工作隊(duì)列1908以將任務(wù)執(zhí)行推遲到稍后的時(shí)間。根據(jù)一個(gè)實(shí)施例,為了在準(zhǔn)備將新任務(wù)放入工作隊(duì)列1908時(shí)保存資源,邊界對(duì)象1907檢查工作隊(duì)列1908并確定排隊(duì)的工作項(xiàng)1911中的任一個(gè)是否包括相關(guān)任務(wù)。如果有相關(guān)任務(wù),則邊界對(duì)象1907可選擇性地將新任務(wù)與先前排隊(duì)的相關(guān)任務(wù)捆綁在一起作為一子任務(wù),而非將新任務(wù)作為全新的工作項(xiàng)1911來放置。仍參考圖19,根據(jù)一個(gè)實(shí)施例,并發(fā)性域1901包括分派器1909,用于將來自工作隊(duì)列1908的工作項(xiàng)1911分派給單線程化對(duì)象1903以供處理。分派器1909使用內(nèi)部線程1902來從工作隊(duì)列1908中移除工作項(xiàng)1911,并分派每一工作項(xiàng)1911以供在內(nèi)部線程1902上執(zhí)行。分派器1909調(diào)用包括在工作項(xiàng)1911中的任務(wù)。例如,在圖19中,分派器1909如由箭頭1930所描繪地分派來自工作隊(duì)列1908的工作項(xiàng)1911。工作項(xiàng)1911然后如由箭頭1935所描繪地在內(nèi)部線程1902上執(zhí)行。根據(jù)一個(gè)實(shí)施例,將工作項(xiàng)1911放入工作隊(duì)列1908不會(huì)迫使分派器1909運(yùn)作。相反,工作項(xiàng)1911的執(zhí)行被推遲到由并發(fā)性域1901的頂層循環(huán)邏輯所規(guī)定的時(shí)間點(diǎn)。一旦工作項(xiàng)1911被放入工作隊(duì)列1908,內(nèi)部線程1902在如由分派器1909所確定的并發(fā)性域1901的下一適當(dāng)循環(huán)中執(zhí)行所請(qǐng)求的任務(wù)。因此,外部對(duì)象1910不確定何時(shí)移除工作項(xiàng)1911以及因此的何時(shí)調(diào)用和執(zhí)行內(nèi)部、單線程化對(duì)象1903的任務(wù)。外部對(duì)象1910也不確定邊界對(duì)象1907何時(shí)在并發(fā)性域1901的內(nèi)部線程1902上執(zhí)行任務(wù)。一旦分派并完成了任務(wù),將出站結(jié)果作為回叫傳遞給邊界對(duì)象1907。邊界對(duì)象1907然后將該回叫傳遞給最初放置調(diào)用實(shí)現(xiàn)該結(jié)果的任務(wù)的工作項(xiàng)1911的外部對(duì)象1910?;亟械氖纠ㄖ甘救蝿?wù)完成的數(shù)據(jù)標(biāo)志、方法調(diào)用等。圖20描繪了內(nèi)部、單線程化對(duì)象與外部對(duì)象之間的異步通信。根據(jù)本發(fā)明的一個(gè)實(shí)施例,示出了在外部對(duì)象2001與內(nèi)部、單線程化對(duì)象2009之間的異步通信期間發(fā)生的通信鏈2000。外部對(duì)象2001首先與邊界對(duì)象2003通信2002。該通信2002一般采用對(duì)與并發(fā)性域(未示出)相關(guān)聯(lián)的一個(gè)或多個(gè)任務(wù)的調(diào)用或調(diào)用請(qǐng)求的形式。盡管所請(qǐng)求的任務(wù)實(shí)際上是單線程化對(duì)象2009的任務(wù),但外部對(duì)象2001僅將該任務(wù)與并發(fā)性域或邊界對(duì)象2003相關(guān)聯(lián)。邊界對(duì)象2003然后與工作隊(duì)列2005通信2004。這一通信2004一般包括將工作項(xiàng)(未示出)放入工作隊(duì)列2005。工作隊(duì)列2005然后與分派器2007通信2006。這一通信2006一般包括分派器2007順序地分派放入工作隊(duì)列2005的每一工作項(xiàng)。最后,分派器2007與其任務(wù)被調(diào)用的內(nèi)部、單線程化對(duì)象2009通信2008。這一通信2008一般包括對(duì)內(nèi)部、單線程化對(duì)象2009的任務(wù)的調(diào)用。在另一實(shí)施例中,外部對(duì)象2001與并發(fā)性域的另一邊界對(duì)象(未示出)通信。以上參考圖18-20描述的跨并發(fā)性域邊界的異步通信保護(hù)了內(nèi)部、單線程化對(duì)象免遭重新進(jìn)入問題。如將理解的,當(dāng)在并發(fā)性域的頂層邏輯的控制下的對(duì)象(例如,內(nèi)部、單線程化對(duì)象或邊界對(duì)象)指示內(nèi)部線程重新進(jìn)入同樣在該頂層邏輯控制下的另一對(duì)象時(shí),發(fā)生內(nèi)部控制的重新進(jìn)入。當(dāng)不在并發(fā)性域的頂層邏輯的控制下的對(duì)象(例如,外部對(duì)象)指示內(nèi)部線程重新進(jìn)入在該頂層邏輯的控制下的對(duì)象時(shí),發(fā)生外部控制的重新進(jìn)入。當(dāng)內(nèi)部對(duì)象重新進(jìn)入其自身或者同一并發(fā)性域中的另一對(duì)象時(shí),發(fā)生內(nèi)部導(dǎo)致的重新進(jìn)入。當(dāng)由外部對(duì)象引起的事件影響到重新進(jìn)入時(shí),發(fā)生于外部導(dǎo)致的重新進(jìn)入將從在并發(fā)性域的內(nèi)部對(duì)象中共同實(shí)施的邏輯中有效地移除了對(duì)重新進(jìn)入的控制。結(jié)果是非確定性的重新進(jìn)入。回頭參考圖19,僅允許跨并發(fā)性域1901的邊界的異步通信保護(hù)了內(nèi)部、單線程化對(duì)象1903免遭外部控制的重新進(jìn)入。例如,如果內(nèi)部、單線程化對(duì)象1903的執(zhí)行包括對(duì)外部對(duì)象1910的任務(wù)的調(diào)用,則內(nèi)部線程1902將進(jìn)入與并發(fā)性域1902相關(guān)聯(lián)的邊界對(duì)象1907之一,并且將調(diào)用負(fù)責(zé)請(qǐng)求外部對(duì)象1910的任務(wù)執(zhí)行的任務(wù)。內(nèi)部線程1902然后返回到執(zhí)行內(nèi)部、單線程化對(duì)象1903的任務(wù)或執(zhí)行對(duì)來自工作隊(duì)列1908的工作項(xiàng)1911的分派。由于內(nèi)部線程1902不離開并發(fā)性域1901地進(jìn)入外部對(duì)象1910,因此它不落在外部對(duì)象1910的控制之下。此外,如果允許內(nèi)部線程1902執(zhí)行外部對(duì)象1910的任務(wù),并且如果該任務(wù)的執(zhí)行包括對(duì)內(nèi)部、單線程化對(duì)象1903的另一任務(wù)的調(diào)用,則不允許內(nèi)部線程1902重新進(jìn)入并發(fā)性域1901。相反,內(nèi)部線程1902將進(jìn)入并發(fā)性域1901的邊界對(duì)象1907以調(diào)用負(fù)責(zé)放置工作項(xiàng)1911的任務(wù)?;蛘?,如上所述,在某些特定約束下,邊界對(duì)象可在內(nèi)部線程上向外調(diào)用外部對(duì)象以調(diào)用任務(wù)。在調(diào)用任務(wù)之后,內(nèi)部線程1902返回到執(zhí)行外部對(duì)象1910的任務(wù)并隨后返回到執(zhí)行內(nèi)部、單線程化對(duì)象1903的第一個(gè)原始任務(wù)。換言之,內(nèi)部線程1902不執(zhí)行外部對(duì)象1910對(duì)第二任務(wù)的調(diào)用,直到第一任務(wù)完成,且直到由并發(fā)性域1901的分派器1909指示要如此做?,F(xiàn)在參考圖21和22,描述了本發(fā)明的包括數(shù)據(jù)源的示例外部對(duì)象方面的各實(shí)施例。圖21示出了包括并發(fā)性域2101和數(shù)據(jù)源2112的系統(tǒng)2100,圖22示出了描繪并發(fā)性域2101的內(nèi)部線程2102與數(shù)據(jù)源2112的次要線程2104之間的接口的操作流程圖2200。在一個(gè)實(shí)施例中,次要線程2104包括多個(gè)次要線程2104。并發(fā)性域2101包括單線程化對(duì)象2103和分派器2109,且與邊界對(duì)象2107相關(guān)聯(lián)。并發(fā)性域2101維護(hù)表示要在并發(fā)性域2101的內(nèi)部線程2102上執(zhí)行的待決任務(wù)的工作隊(duì)列2108。在一個(gè)實(shí)施例中,數(shù)據(jù)源2112是數(shù)據(jù)庫(kù)。在另一實(shí)施例中,數(shù)據(jù)源2112是網(wǎng)絡(luò)。內(nèi)部線程2102和次要線程2104的執(zhí)行路徑在兩圖中示出。在圖21中,虛線箭頭描繪了在內(nèi)部線程2102上發(fā)生的任務(wù)執(zhí)行,而實(shí)線箭頭描繪了在一個(gè)或多個(gè)次要線程2104上發(fā)生的任務(wù)執(zhí)行。虛線和實(shí)線箭頭所涉及的標(biāo)號(hào)對(duì)應(yīng)于關(guān)于圖22所執(zhí)行的操作或任務(wù),圖22示出了沿該線程(其上任務(wù)被執(zhí)行)排列的每一任務(wù)。仍參考圖21和22,該方法在開始框2201處開始,并且前進(jìn)到操作2202,其中單線程化對(duì)象2103請(qǐng)求邊界對(duì)象2107調(diào)用與數(shù)據(jù)源2112相關(guān)聯(lián)的任務(wù)。該請(qǐng)求在并發(fā)性域2101的內(nèi)部線程2102上執(zhí)行。在操作2203中,分派器2109順序通過工作隊(duì)列2108并分派每一工作項(xiàng)2111。根據(jù)一個(gè)實(shí)施例,使用內(nèi)部線程2102以工作項(xiàng)2111被放入工作隊(duì)列2108的順序來分派這些工作項(xiàng)。例如,分派器2109以工作項(xiàng)1開始排列順序并以工作項(xiàng)7結(jié)束排列順序,假定在這期間沒有添加新工作項(xiàng)2111。任何新工作項(xiàng)2111將在工作項(xiàng)7之后添加。根據(jù)另一實(shí)施例,工作項(xiàng)2111根據(jù)所分配的優(yōu)先級(jí)值來分派。方法2202還通往方法2211,后者與操作2202同時(shí)執(zhí)行。在方法2211中,邊界對(duì)象2107調(diào)用與數(shù)據(jù)源2112相關(guān)聯(lián)的任務(wù)。該調(diào)用在次要線程2104之一上執(zhí)行。接著,該方法前進(jìn)到操作2212,其中在次要線程2104的一個(gè)或多個(gè)上執(zhí)行數(shù)據(jù)源2112的任務(wù)。接著,操作2213包括數(shù)據(jù)庫(kù)2112將執(zhí)行結(jié)果作為回叫發(fā)回邊界對(duì)象2107。結(jié)果的發(fā)送在次要線程2104的一個(gè)或多個(gè)上發(fā)生。然后,在操作2214中,邊界對(duì)象2107將回叫作為工作項(xiàng)2111放入工作隊(duì)列2108。該放置在次要線程2104的一個(gè)或多個(gè)上執(zhí)行。從操作2214,該方法前進(jìn)到操作2204。操作2203還導(dǎo)致操作2204。操作2204在分派器2109到達(dá)由邊界對(duì)象2107在操作2214中添加的回叫工作項(xiàng)2111時(shí)發(fā)生,該分派器在操作2203期間順序地執(zhí)行工作隊(duì)列2108中的工作項(xiàng)2111。分派器2109使用內(nèi)部線程2102來分派回叫。一旦分派了回叫,分派器2109在操作2205中繼續(xù)順序地分派工作隊(duì)列2108中的每一工作項(xiàng)2111。該方法在2206處結(jié)束?,F(xiàn)在參考圖23和24,描述了本發(fā)明的包括次要并發(fā)性域的示例外部對(duì)象方面的各實(shí)施例。圖23示出了分別包括第一和第二并發(fā)性域2301、2321的系統(tǒng)2300,而圖24示出了其中第一并發(fā)性域2301與第二并發(fā)性域2321接口的操作流程圖2400。每一并發(fā)性域2301、2321分別包括內(nèi)部線程2302、2322、單線程化對(duì)象2303、2323以及分派器2309、2329。每一并發(fā)性域2301、2321分別與邊界對(duì)象2307、2327相關(guān)聯(lián),并維護(hù)表示要在內(nèi)部線程2302、2322上執(zhí)行的待決工作項(xiàng)2311、2331的工作隊(duì)列2308、2328。在圖23中,第一組虛線箭頭描繪了在內(nèi)部線程2302上發(fā)生的任務(wù)執(zhí)行,一組實(shí)線箭頭描繪了在次要線程2304的一個(gè)或多個(gè)上發(fā)生的任務(wù)執(zhí)行,而第二組虛線箭頭描繪了在第二內(nèi)部線程2322上發(fā)生的任務(wù)執(zhí)行。這些虛線和實(shí)線箭頭被示為執(zhí)行第一并發(fā)性域2301與第二并發(fā)性域2321之間的通信中所涉及的各種操作。這些箭頭所涉及的參照標(biāo)號(hào)對(duì)應(yīng)于關(guān)于圖24執(zhí)行的操作或任務(wù)。仍參考圖23和24,該方法在開始框2401處開始,并前進(jìn)到操作2402和2422。操作2422包括第二并發(fā)性域2321的分派器2329使用內(nèi)部線程2322來順序地分派工作隊(duì)列2328上的每一工作項(xiàng)2331。操作2402與操作2422并發(fā)地執(zhí)行。在操作2402中,第一并發(fā)性域2301的單線程化對(duì)象2303請(qǐng)求邊界對(duì)象2307調(diào)用第二并發(fā)性域2321的對(duì)象之一的任務(wù)。在一個(gè)實(shí)施例中,所請(qǐng)求的任務(wù)是第二并發(fā)性域2321的單線程化對(duì)象2323之一的任務(wù)。在另一實(shí)施例中,所請(qǐng)求的任務(wù)是與第二并發(fā)性域2321相關(guān)聯(lián)的邊界對(duì)象2327之一的任務(wù)。從操作2402,該方法前進(jìn)到操作2403和2412。在操作2403中,第一并發(fā)性域2301的分派器2309順序地分派工作隊(duì)列2308上的每一工作項(xiàng)2311。在操作2412中,第一并發(fā)性域2301的邊界對(duì)象2307使用次要線程2304中的一個(gè)或多個(gè)來與第二并發(fā)性域2321的邊界對(duì)象2327通信。該通信包括調(diào)用任務(wù)的請(qǐng)求。然后,在操作2413中,第二邊界對(duì)象2327將所請(qǐng)求的任務(wù)作為工作項(xiàng)2331放入工作隊(duì)列2328。該放置是使用次要線程2304中的一個(gè)或多個(gè)被執(zhí)行。操作2413和操作2422都通往操作2423。在操作2423中,分派器2329到達(dá)并分派包括所請(qǐng)求的任務(wù)的工作項(xiàng)2331。該分派在第二并發(fā)性域2321的內(nèi)部線程2322上執(zhí)行。然后,在操作2424中,任務(wù)作為對(duì)第一并發(fā)性域2301中的單線程化對(duì)象2303的回叫而執(zhí)行。此時(shí),該方法再次分裂,前進(jìn)到操作2425和2414。在操作2425中,分派器2329繼續(xù)順序地分派工作隊(duì)列2328上的每一工作項(xiàng)2331。操作2414與操作2425并發(fā)地發(fā)生。在操作2414中,第二并發(fā)性域2321的邊界對(duì)象2327使用一個(gè)或多個(gè)次要線程2304來請(qǐng)求第一并發(fā)性域2301的邊界對(duì)象2307將回叫作為工作項(xiàng)2311放入工作隊(duì)列2308。接著,在操作2415中,邊界對(duì)象2307將該回叫放入工作隊(duì)列2308。該放置是在次要線程2304的一個(gè)或多個(gè)上被執(zhí)行。操作2404在第一并發(fā)性域2301的分派器2309到達(dá)放入工作隊(duì)列2308的回叫時(shí)發(fā)生。分派器2309使用第一并發(fā)性域2301的內(nèi)部線程2302來分派回叫?;亟性诓僮?405中執(zhí)行。接著,該方法前進(jìn)到操作2406,其中分派器2309繼續(xù)順序通過工作隊(duì)列2308,按序分派每一工作項(xiàng)2311。該方法在2406處結(jié)束。系統(tǒng)的另一示例(未示出)包括彼此接口且與外部對(duì)象接口的三個(gè)或更多并發(fā)性域。這一系統(tǒng)根據(jù)與此處所描述的相同的操作來順序地運(yùn)作。該系統(tǒng)中的每一并發(fā)性域包括內(nèi)部線程、一個(gè)或多個(gè)單線程化對(duì)象以及分派器。每一并發(fā)性域與至少一個(gè)邊界對(duì)象相關(guān)聯(lián)且維護(hù)一工作隊(duì)列??绮l(fā)性域邊界的所有通信都是異步的(例如,通過相應(yīng)的邊界對(duì)象、工作隊(duì)列和分派器過濾)。應(yīng)用程序描述語(yǔ)言如上簡(jiǎn)要描述的,本發(fā)明的各實(shí)施例包括應(yīng)用程序描述(XAD)和應(yīng)用程序描述(XAD)引擎,用于提供以上參考圖3描述的應(yīng)用程序框架內(nèi)包括的諸如應(yīng)用程序304等所有應(yīng)用程序和組件的聲明性規(guī)則和描述。某些實(shí)施例的各方面涉及用于創(chuàng)作數(shù)據(jù)流程、數(shù)據(jù)綁定以及表征應(yīng)用程序的規(guī)則的聲明性或描述性語(yǔ)言。其它方面涉及在運(yùn)行時(shí)處理或執(zhí)行該聲明性應(yīng)用程序的運(yùn)行時(shí)引擎,即(經(jīng)由構(gòu)建器)創(chuàng)建查看和/或處理數(shù)據(jù)的對(duì)象的“應(yīng)用程序描述”。因此,開發(fā)者無需為進(jìn)行數(shù)據(jù)處理的對(duì)象編寫實(shí)際的代碼,而是只需編寫最終被編譯和執(zhí)行的聲明性應(yīng)用程序文件。如以下將詳細(xì)討論的,這一系統(tǒng)提供了優(yōu)于對(duì)應(yīng)用程序編程的現(xiàn)有技術(shù)方法的眾多好處。對(duì)這一聲明性語(yǔ)言的使用通過聲明性地對(duì)應(yīng)用程序的數(shù)據(jù)建模、處理和轉(zhuǎn)化數(shù)據(jù)、用戶界面(UI)和UI與數(shù)據(jù)交互的方式而不同于對(duì)命令性語(yǔ)言的使用。本發(fā)明的各實(shí)施例涉及用于表征XML應(yīng)用程序框架(XAF)應(yīng)用程序的特定聲明性語(yǔ)言。該聲明性語(yǔ)言此處有時(shí)被稱為XAF應(yīng)用程序定義(XAD)。盡管此處所描述的大多數(shù)實(shí)現(xiàn)細(xì)節(jié)涉及對(duì)XML的使用,但本領(lǐng)域的技術(shù)人員將認(rèn)識(shí)到可使用其它句法來實(shí)現(xiàn)本發(fā)明的各方面。如可以理解的,為提供聲明性應(yīng)用程序文件與執(zhí)行數(shù)據(jù)處理的實(shí)例化對(duì)象的配置之間的這一分隔,在一個(gè)實(shí)施例中,可使用一種平臺(tái),諸如構(gòu)建和執(zhí)行應(yīng)用程序的平臺(tái)等。根據(jù)本發(fā)明的各方面,所使用的平臺(tái)此處被稱為XAF平臺(tái),它是用于構(gòu)建和執(zhí)行這些軟件應(yīng)用程序的平臺(tái)。特別地,XAF也使用XML來統(tǒng)一地表示數(shù)據(jù),并且采用高度組件化的方法來構(gòu)建每一應(yīng)用程序。在一個(gè)實(shí)施例中,XAF利用了XML來提供強(qiáng)大的數(shù)據(jù)變換能力和豐富的數(shù)據(jù)。外部數(shù)據(jù)和應(yīng)用程序狀態(tài)都可使用XML的能力來訪問和處理。用戶界面和復(fù)雜數(shù)據(jù)流程可在XAD中定義。如所述的,XAD是用于創(chuàng)作XAF應(yīng)用程序的一種聲明性語(yǔ)言。圖25是與被創(chuàng)建來形成可執(zhí)行應(yīng)用程序的數(shù)據(jù)和對(duì)象有關(guān)的應(yīng)用程序描述的高級(jí)描繪。XAD用于創(chuàng)建聲明或描述諸如數(shù)據(jù)集或存儲(chǔ)2504、2506和2508等數(shù)據(jù)的應(yīng)用程序描述2502,使得在運(yùn)行時(shí),組件2501、2512和2514被創(chuàng)建來處理、查看和/或編輯該數(shù)據(jù),從而本質(zhì)上構(gòu)造了構(gòu)成執(zhí)行應(yīng)用程序的對(duì)象的配置。在此處的示例性實(shí)施例中,應(yīng)用程序描述2502被表達(dá)為一組聲明性構(gòu)造,諸如形式良好的XML。應(yīng)用程序描述2502因此描述了一個(gè)或多個(gè)對(duì)象2501、2512和2514應(yīng)如何在執(zhí)行應(yīng)用程序內(nèi)配置。本質(zhì)上,應(yīng)用程序描述2502用于計(jì)算應(yīng)用程序的配置而非應(yīng)用程序的結(jié)果,后者的計(jì)算由對(duì)象2510、2512和2514來完成。由于對(duì)象2510、2512和2514可由以非聲明性語(yǔ)言編寫的其它應(yīng)用程序使用,因此XAD通過對(duì)這些對(duì)象的重用而改進(jìn)了應(yīng)用程序的開發(fā)。此外,XAD允許以傳統(tǒng)的靜態(tài)聲明性應(yīng)用程序定義時(shí)不可能的方式對(duì)應(yīng)用程序進(jìn)行動(dòng)態(tài)創(chuàng)建和修改,如以下將更詳細(xì)地討論。對(duì)于圖25中所示的數(shù)據(jù)2504、2506和2508,這些源可與文本數(shù)據(jù)存儲(chǔ)、SQL數(shù)據(jù)庫(kù)存儲(chǔ)、XML源、web服務(wù)源等有關(guān)。實(shí)際上,應(yīng)用程序描述2502被認(rèn)為是以數(shù)據(jù)為中心,使得它是數(shù)據(jù)中心的。應(yīng)用程序狀態(tài)可被認(rèn)為是另一“數(shù)據(jù)”源,且以與對(duì)象2510、2512和2514的配置在其上操作的更常規(guī)數(shù)據(jù)類似的方式來對(duì)待。開發(fā)者因此主要關(guān)注指定數(shù)據(jù)流程通過應(yīng)用程序的方式以及支配應(yīng)用程序如何響應(yīng)于該數(shù)據(jù)的規(guī)則。XAD提供了構(gòu)建和更改應(yīng)用程序的簡(jiǎn)單且廉價(jià)的方式,這使得能達(dá)到不同軟件應(yīng)用程序適當(dāng)位置(niche)和對(duì)新開發(fā)者的低復(fù)雜度阻礙的目標(biāo)。使用所要求保護(hù)的本發(fā)明構(gòu)建的應(yīng)用程序不僅具有將數(shù)據(jù)流聚集和變換到應(yīng)用程序的能力,而且還具有選擇對(duì)數(shù)據(jù)類型最適當(dāng)?shù)囊粋€(gè)或多個(gè)用戶界面的能力。對(duì)象2510、2512和2514表示被良好-分解的組件,諸如查看器、編輯器、變換器等。應(yīng)用程序描述可調(diào)用“預(yù)編程”組件和/或向集合添加新組件。對(duì)象具有被良好-定義的類型,因此相應(yīng)的XAD標(biāo)簽和參數(shù)具有XAD語(yǔ)言中相應(yīng)的類型。XAD是強(qiáng)類型化的,且XAD編譯器靜態(tài)地檢測(cè)差錯(cuò)。標(biāo)簽和參數(shù)具有返回類型和基數(shù)約束(cardinalityconstraints)。另外,數(shù)據(jù)類型支持若干附加約束方案、轉(zhuǎn)換要求以及存取器可用性(存取器是用于XML數(shù)據(jù)的強(qiáng)類型化對(duì)象外觀(facade))。XAD不僅允許簡(jiǎn)單地通過更改一個(gè)或多個(gè)文本文件來修改或增大現(xiàn)有應(yīng)用程序,而且還允許開發(fā)者約束修改和插件(可被添加到現(xiàn)有應(yīng)用程序的模塊,大致類似于瀏覽器插件)以保持安全性,以及如下更詳細(xì)描述的用戶模型集成。示例XAD應(yīng)用程序?yàn)槔斫釾AD的眾多細(xì)微差別,尤其是XAD應(yīng)用程序描述,如應(yīng)用程序描述2502,將討論一個(gè)示例描述。表1示出了根據(jù)本發(fā)明的一個(gè)實(shí)施例的示例XAD應(yīng)用程序的源代碼。表1中的示例XAD應(yīng)用程序是相對(duì)簡(jiǎn)單的,且構(gòu)想了許多其它復(fù)雜的XAD應(yīng)用程序。實(shí)際上,表1所示的示例具有顯示“HelloWorld”消息的唯一功能。表1示例XAD應(yīng)用程序描述如可以理解的,表1所示的示例包括若干XML標(biāo)簽以描述處理數(shù)據(jù)所得的對(duì)象。第1行標(biāo)識(shí)了XML的版本,而第2行標(biāo)識(shí)了用于XAD應(yīng)用程序描述的系統(tǒng)標(biāo)簽,這將在以下更詳細(xì)描述。第3-4行標(biāo)識(shí)了XAF中可用的標(biāo)簽的某些名字空間。出于本討論的目的,表1中的示例的主要部分是第8行所示的“Aplication(應(yīng)用程序)”標(biāo)簽。應(yīng)用程序標(biāo)簽是導(dǎo)致在運(yùn)行時(shí)創(chuàng)建應(yīng)用程序?qū)ο蟮囊粋€(gè)實(shí)體標(biāo)簽的示例,該應(yīng)用程序?qū)ο髤f(xié)調(diào)應(yīng)用程序并控制應(yīng)用程序功能的最高級(jí)別。類似地,第9行中的“Window(窗口)”標(biāo)簽(實(shí)體標(biāo)簽的另一示例)導(dǎo)致對(duì)窗口對(duì)象,即負(fù)責(zé)顯示應(yīng)用程序的框架的用戶界面實(shí)體的創(chuàng)建。在這一情況下,“Window”是“Application”的參數(shù)。最后,“TextBlock(文本塊)”實(shí)體,即作為第10行中的文本標(biāo)簽的結(jié)果創(chuàng)建的所得的文本對(duì)象是在運(yùn)行時(shí)創(chuàng)建的負(fù)責(zé)顯示文本(在這一情況下,為“HelloWorld”)的用戶界面實(shí)體。使用標(biāo)簽來(經(jīng)由構(gòu)建器)創(chuàng)建對(duì)象在以下將更詳細(xì)地描述。以上示例僅被提供來示出一個(gè)更簡(jiǎn)單的示例XAD應(yīng)用程序。在操作中,編譯并執(zhí)行表1所示的XAD應(yīng)用程序以創(chuàng)建如一般在圖26中示出的應(yīng)用程序、窗口和文本對(duì)象。即,圖26示出了根據(jù)本發(fā)明的一個(gè)特定實(shí)施例的應(yīng)用程序描述2602,它被執(zhí)行來處理數(shù)據(jù)時(shí)類似于圖25所示的描述2502和/或表1所示的XAD應(yīng)用程序。最初,開發(fā)者創(chuàng)作應(yīng)用程序描述2602。在一個(gè)實(shí)施例中,XAD文件2602的第一個(gè)標(biāo)簽是“<sys:XAD>”。同樣,為了正確地操作,計(jì)算機(jī)系統(tǒng)能夠諸如通過安裝例如XAFSDK來訪問XAF或任何適當(dāng)?shù)牡刃?。在發(fā)出應(yīng)用程序啟動(dòng)命令之后,XAD2602被自動(dòng)驗(yàn)證,且在一個(gè)實(shí)施例中,被編譯成更有效的形態(tài)。編譯器或XAF引擎2604對(duì)XAD2602進(jìn)行語(yǔ)法分析,并執(zhí)行實(shí)例化必要對(duì)象的被編譯了的形態(tài)。并且,引擎2604創(chuàng)建對(duì)象組件(也稱為實(shí)體)圖2612、2614、2616、2618并將它們連接在一起以創(chuàng)建最終處理數(shù)據(jù)的應(yīng)用程度2606。同時(shí),引擎2604將各對(duì)象與必要的數(shù)據(jù)2608連接,即綁定。引擎2604還可被認(rèn)為是配置服務(wù),因?yàn)樗鼘?shí)例化對(duì)象并將對(duì)象連接在一起以創(chuàng)建應(yīng)用程序2606。應(yīng)用程序2606是連接組件2612、2614、2616、2618的圖。例如,應(yīng)用程序2606可具有一個(gè)或多個(gè)數(shù)據(jù)連接器實(shí)體2612。數(shù)據(jù)連接器實(shí)體2612標(biāo)識(shí)將數(shù)據(jù)連接到系統(tǒng)并與可用的各種數(shù)據(jù)存儲(chǔ)通信的對(duì)象。另一類型的實(shí)體涉及UI連接器2614。UI連接器2614表示實(shí)際處理用戶界面特征,且實(shí)際上與用戶界面2620通信的對(duì)象。包括在應(yīng)用程序2606中的還有通常在將信息轉(zhuǎn)播到UI連接器之前提供數(shù)據(jù)的某種變換的變換2616,以及處理數(shù)據(jù)以執(zhí)行諸如修改數(shù)據(jù)等某一類型的動(dòng)作的動(dòng)作2618。以下描述創(chuàng)建必要組件的過程和將對(duì)象綁定到數(shù)據(jù)的過程的更多細(xì)節(jié)。如可從本討論中理解的,XAD2602中使用的標(biāo)簽不用于代表特定對(duì)象,而是XAD標(biāo)簽表示對(duì)象工廠(factory)。對(duì)象工廠是XAD結(jié)合其標(biāo)簽構(gòu)建器類而使用來利用標(biāo)簽中指定的參數(shù)構(gòu)建一個(gè)或多個(gè)實(shí)體的描述。引擎2604提供這些對(duì)象的實(shí)際創(chuàng)建。在一個(gè)實(shí)施例中,引擎具有對(duì)提供現(xiàn)有和/或可重用標(biāo)簽和對(duì)象的某些細(xì)節(jié)的組件庫(kù)2622的訪問。因此,應(yīng)用程序2602使用標(biāo)簽來定義,從而允許應(yīng)用程序的模塊化構(gòu)造。圖27示出了根據(jù)這一概念的組件之間的結(jié)構(gòu)上的相互關(guān)系。實(shí)體標(biāo)簽2702(諸如表1的第8、9和10行所示的實(shí)體標(biāo)簽)與實(shí)體2706相關(guān)聯(lián)。構(gòu)建器2704讀取實(shí)體標(biāo)簽2702并映射它。構(gòu)建器2704實(shí)例化并連接與實(shí)體標(biāo)簽相關(guān)聯(lián)的一個(gè)或多個(gè)對(duì)象(未圖示),并將實(shí)體標(biāo)簽2702與實(shí)體2706相關(guān)聯(lián)。對(duì)開發(fā)者而言,看似為實(shí)體標(biāo)簽2702被隱含地映射到其相關(guān)聯(lián)的實(shí)體2706,因?yàn)橛成洹?shí)例化、編寫或連接以及初始化可在后臺(tái)發(fā)生。有了這些總則之后,將討論XAD的某些細(xì)節(jié)。關(guān)于語(yǔ)言的更多細(xì)節(jié),附加了作為附錄A的說明書,它被明確地結(jié)合在本說明書中。對(duì)象和工廠對(duì)象通過工廠(factory)來實(shí)例化,工廠可以是構(gòu)建器組件,或者是用XAD的片段定制的XAD引擎。工廠允許為諸如惰性求值(lazyevaluation)或虛擬化(節(jié)省無需立即實(shí)例化的對(duì)象的成本)等目的而推遲實(shí)例化。這是通過具有NewScope="True"屬性的參數(shù)來實(shí)現(xiàn)的。和通過sys:Switch構(gòu)造的常規(guī)實(shí)例化一起,工廠使得能夠動(dòng)態(tài)數(shù)據(jù)相關(guān)應(yīng)用程序配置。在XAF平臺(tái)中的依賴性管理和重新確認(rèn)的使用使得XAD引擎能夠在數(shù)據(jù)改變時(shí)按需自動(dòng)重新配置應(yīng)用程序。這消除了常規(guī)上編寫應(yīng)用程序中常見且成本較高并易于出錯(cuò)的用于命令性重新配置代碼的需求。XAD引擎允許以XAD語(yǔ)言來定義工廠,并自動(dòng)構(gòu)造對(duì)應(yīng)的工廠實(shí)現(xiàn)。可使用XAD中的框架標(biāo)簽來實(shí)例化各種對(duì)象,諸如圖25所示的對(duì)象2510、2512和2514。一種這樣的對(duì)象涉及也稱為數(shù)據(jù)連接器的“數(shù)據(jù)提供者”對(duì)象,其中數(shù)據(jù)提供者對(duì)象表示應(yīng)用程序可能使用的數(shù)據(jù)的源和操縱。數(shù)據(jù)提供者對(duì)象連接到數(shù)據(jù)源(通過該數(shù)據(jù)源,應(yīng)用程序可接收外部數(shù)據(jù))和數(shù)據(jù)變換(對(duì)傳入數(shù)據(jù)執(zhí)行的邏輯或算術(shù)運(yùn)算)??墒褂肵AD中的框架標(biāo)簽實(shí)例化的另一種類型的對(duì)象是用戶界面對(duì)象。用戶界面對(duì)象提供了與控制顯示和輸入處理有關(guān)的功能。用戶界面對(duì)象可用于觸發(fā)動(dòng)作(見以下討論的動(dòng)作)。還可使用XAD中的框架標(biāo)簽實(shí)例化的又一種類型的對(duì)象是動(dòng)作。動(dòng)作提供了對(duì)用于用戶事件的句柄的“掛鉤”(附加到用戶界面元素的功能)。例如,點(diǎn)擊用戶界面上的按鈕將激活與該按鈕相關(guān)聯(lián)的動(dòng)作對(duì)象。當(dāng)用戶事件發(fā)生時(shí),可使用對(duì)應(yīng)的動(dòng)作來儲(chǔ)存和傳遞事件細(xì)節(jié)。事件細(xì)節(jié)可被儲(chǔ)存在主存儲(chǔ)器、硬盤驅(qū)動(dòng)器或其它存儲(chǔ)器介質(zhì)上。事件細(xì)節(jié)使用以下討論的“scope(范圍)”變量來傳遞。例如,如果用戶事件是鼠標(biāo)點(diǎn)擊,則可意味著在該事件的時(shí)刻儲(chǔ)存鼠標(biāo)的x和y位置??稍谟脩羰录l(fā)生時(shí)儲(chǔ)存的其它細(xì)節(jié)包括但不限于,按下了哪個(gè)鍵、在該事件的時(shí)刻選擇了數(shù)據(jù)元素列表的哪一索引、在該事件的時(shí)刻選擇了表格的哪一行和/或列、在該事件的時(shí)刻時(shí)表格的哪些行和/或列對(duì)用戶是可見的等等。通過使用這些事件,可實(shí)現(xiàn)應(yīng)用程序功能。實(shí)體標(biāo)簽如可從以上表1中所示的示例中理解的,XAD應(yīng)用包括對(duì)標(biāo)簽的使用。在一個(gè)實(shí)施例中,一種標(biāo)簽是“實(shí)體標(biāo)簽”。諸如分組或選擇器標(biāo)簽等其它標(biāo)簽在以下將更詳細(xì)討論。實(shí)體標(biāo)簽在運(yùn)行時(shí)映射到公共語(yǔ)言運(yùn)行時(shí)間(CLR)對(duì)象。對(duì)CLR對(duì)象的唯一限制是它必須(在一個(gè)實(shí)施例中)是XAF實(shí)體。為成為XAF實(shí)體,CLR對(duì)象從兩個(gè)基類,如“Microsoft.Xaf.Core.BaseTypes.EntityElement”或“Microsoft.Xaf.Core.BaseTypes.EntityComposite”之一中導(dǎo)出,并且粘附到由XAF定義的某些協(xié)議和合約。構(gòu)建器2704(圖27)負(fù)責(zé)實(shí)體的實(shí)際實(shí)例化,并且有時(shí)候被稱為“標(biāo)簽構(gòu)建器”或“實(shí)體構(gòu)建器”。在一個(gè)實(shí)施例中,實(shí)體構(gòu)建器是用于創(chuàng)建實(shí)體和/或?qū)?shí)體彼此連接的用戶定義的.NET類。實(shí)體構(gòu)建器用于實(shí)現(xiàn)原語(yǔ)XAD標(biāo)簽。另外,實(shí)體構(gòu)建器是引擎2604和語(yǔ)言的自定義擴(kuò)展之間的交互點(diǎn),使得在一個(gè)實(shí)施例中,XAD語(yǔ)言特別地定義了對(duì)編寫實(shí)體構(gòu)建器的要求。關(guān)于標(biāo)簽或?qū)嶓w構(gòu)建器的更多細(xì)節(jié)在明確結(jié)合在本說明書中的所附附錄A的節(jié)3.5中提供。示例性實(shí)體標(biāo)簽在以上表1的第8、9和10行示出。例如,在第8行中,示出了應(yīng)用程序?qū)嶓w標(biāo)簽。如上所述,該標(biāo)簽導(dǎo)致協(xié)調(diào)應(yīng)用程序的實(shí)體的實(shí)例化,并控制最高級(jí)別的應(yīng)用程序功能。窗口實(shí)體標(biāo)簽(表1的第9行)導(dǎo)致負(fù)責(zé)顯示應(yīng)用程序框架的用戶界面實(shí)體的創(chuàng)建。最后,文本實(shí)體標(biāo)簽(表1的第10行)導(dǎo)致負(fù)責(zé)顯示文本(在這一情況下,為“HelloWorld”)的用戶界面實(shí)體的創(chuàng)建。如本領(lǐng)域的技術(shù)人員可理解的,可定義和使用許多其它實(shí)體類型。在使用諸如表1所示的應(yīng)用程序?qū)嶓w標(biāo)簽、窗口實(shí)體標(biāo)簽或文本實(shí)體標(biāo)簽等實(shí)體標(biāo)簽之前,在例如XAF平臺(tái)內(nèi)定義每一實(shí)體標(biāo)簽。實(shí)際上,每一實(shí)體標(biāo)簽具有對(duì)應(yīng)的標(biāo)簽定義。每一標(biāo)簽定義包含了足以最終將每一實(shí)體標(biāo)簽映射到實(shí)體的信息。實(shí)體標(biāo)簽通過形式的聲明來定義,例如,“Text(文本)”標(biāo)簽定義如下開始“<sys:TagDefinitaionName="Text"...>”...并如下結(jié)束“</sys:TagDefinition>”。定義中包括的是新標(biāo)簽的“名稱”,如“Text”,以及特定實(shí)體標(biāo)簽的“類型”。實(shí)體標(biāo)簽可被分類成各種類型,并且所有的實(shí)體標(biāo)簽都具有類型。這些類型是可擴(kuò)展集,并且真正對(duì)應(yīng)于與標(biāo)簽相關(guān)聯(lián)的實(shí)體的CLR類型。由XAF框架使用的某些類型包括“sys:Data”、“sys:EventHandler”、“fwk:UIElement”以及“sys:Selector”。標(biāo)簽是否添加到框架或系統(tǒng),通常取決于標(biāo)簽是否以與核心語(yǔ)言相同的速率從內(nèi)部引擎接口和/或版本中提取。如果是,則標(biāo)簽應(yīng)被添加到系統(tǒng),否則應(yīng)被添加到框架。類型在其定義中聲明。繼續(xù)以上提供的Text定義,標(biāo)簽定義可如以下表2所示地?cái)U(kuò)展。表2包括類型的對(duì)Text實(shí)體標(biāo)簽的定義在表2中,標(biāo)簽定義指示名為Text的新實(shí)體標(biāo)簽應(yīng)被創(chuàng)建為類型fwk:UIElement(指示UI元素類型實(shí)體的框架標(biāo)簽)。Text標(biāo)簽隨后可在可調(diào)用fwk:UIElement實(shí)體的任何地方使用。Text實(shí)體標(biāo)簽的一個(gè)示例可以在表1中出現(xiàn)的HelloWorkd.xad示例中看到。參數(shù)化通常,XAD應(yīng)用程序描述中的每一實(shí)體標(biāo)簽具有描述如何創(chuàng)建、連接或配置所得的對(duì)象或?qū)嶓w的某些參數(shù)。參數(shù)可以是對(duì)一個(gè)數(shù)據(jù)的引用,或者對(duì)工廠或?qū)ο蟮囊?。例如,范圍屬性可以與參數(shù)相關(guān)聯(lián)以指示該參數(shù)涉及工廠還是對(duì)象。如果參數(shù)要求某一類型的對(duì)象才適用,則該參數(shù)可用該類型來標(biāo)記以進(jìn)行類型一致性檢驗(yàn)。這一類型檢驗(yàn)確保應(yīng)用程序的執(zhí)行不會(huì)導(dǎo)致類型失配,而類型失配會(huì)導(dǎo)致不正確的計(jì)算。XAD允許為實(shí)體聲明參數(shù)的許多不同的方式。一種常見的形式在以下表3中示出。表3帶有參數(shù)的對(duì)Text實(shí)體的示例標(biāo)簽定義最初,“Param”是XAD實(shí)施例中的保留名稱,并且用于定義參數(shù)。同樣,如表3中的省略號(hào)所指示的,也可將一個(gè)或多個(gè)其它參數(shù)添加到Text標(biāo)簽定義。在本示例中,應(yīng)創(chuàng)建名為Text的類型UI元素的新實(shí)體。此外,應(yīng)創(chuàng)建類型“Data(數(shù)據(jù))”(更具體地,是“StringData(串?dāng)?shù)據(jù))”)的名為“FontFamily(字體家族)”的單個(gè)參數(shù)。所得的Text標(biāo)簽可與靜態(tài)內(nèi)容串,如使得文本為Arial字體的“<sys:TextFontFamily="Arial".../”一起使用。重要的是,標(biāo)簽定義參數(shù)對(duì)應(yīng)于與該參數(shù)具有相同名稱的標(biāo)簽的實(shí)際實(shí)例內(nèi)的屬性?;蛘撸瑯?biāo)簽可被定義為取其它實(shí)體的參數(shù),例如“<TextFontSize="25"><foo:RandomWordGeneratorParam="Text"/></Text>”。在一個(gè)實(shí)施例中,以上定義將使Text標(biāo)簽的Text屬性使用由foo:RandomWordGenerator函數(shù)對(duì)象返回的值,并在屏幕上以25磅的字體呈現(xiàn)所得的值。在另一實(shí)施例中,該定義可被寫為“<TextFontSize="25"><Text.Text><foo:RandomWordGenerator/></Text.Text><Text>”。后一定義將實(shí)例化Text實(shí)體,并將其Text屬性定義為foo:RandomWordGenerator的值。在一個(gè)實(shí)施例中,參數(shù)本身可包含多個(gè)其自己的實(shí)體。表4示出了示例代碼部分設(shè)置參數(shù)。表4示例XAD片斷設(shè)置參數(shù)表4所示的代碼(第1行)定義了名為FlowPanel的UI元素并具有若干參數(shù),由此導(dǎo)致UI元素流的顯示。要顯示的該組UI元素可經(jīng)由表4中定義(第2行)的名為“Children”的單個(gè)參數(shù)來指定。即第2行示出了調(diào)用/描述第1行中定義的流面板的應(yīng)用程序描述。可對(duì)XAD中的每一實(shí)體指定一個(gè)默認(rèn)參數(shù)。表5示出了定義其名稱為“Children”的默認(rèn)參數(shù)的示例代碼行。如果在子標(biāo)簽上沒有指定參數(shù)名,則該子標(biāo)簽將與該參數(shù)相關(guān)聯(lián),其DefaultParam(默認(rèn)參數(shù))屬性被設(shè)為“true”。表5默認(rèn)參數(shù)示例數(shù)據(jù)綁定在一個(gè)實(shí)施例中,XAD支持?jǐn)?shù)據(jù)綁定(將XML數(shù)據(jù)綁定到特別為該數(shù)據(jù)設(shè)計(jì)的對(duì)象)。因此,對(duì)象名稱可用于在指定參數(shù)時(shí)更具體地引用數(shù)據(jù)。不像靜態(tài)值(按照定義,對(duì)應(yīng)用程序的生存期保持恒定),數(shù)據(jù)綁定值可通過對(duì)數(shù)據(jù)綁定值的相關(guān)聯(lián)數(shù)據(jù)的修改來更新。在一個(gè)實(shí)施例中,這一修改可由應(yīng)用程序執(zhí)行。在另一實(shí)施例中,這一修改可由用戶或外部進(jìn)程執(zhí)行。在一個(gè)示例性實(shí)施例中,行“<TextText="$TextValue"FontSize="25"/>”導(dǎo)致Text參數(shù)被分配值“$TextValue”。在這一實(shí)施例中,“$”是保留字符,且以此方式使用該字符在組件的創(chuàng)建和連接期間調(diào)用數(shù)據(jù)綁定。這一數(shù)據(jù)綁定導(dǎo)致對(duì)來自要綁定到這一實(shí)體標(biāo)簽的另一源或?qū)ο蟮臄?shù)據(jù)的指向或關(guān)聯(lián)。數(shù)據(jù)綁定可用于引用文字?jǐn)?shù)據(jù)。即,文字?jǐn)?shù)據(jù)可使用sys:InlineData標(biāo)簽來指定。例如,“<sys:InlineDataName="TextValue">HelloWorkd</sys:InlineData>”定義了一個(gè)內(nèi)聯(lián)數(shù)據(jù),即串“HelloWorld”。這一示例性文字?jǐn)?shù)據(jù)標(biāo)簽被給予名稱TextValue。因此,通過在XAD描述中使用名稱$TextValue,XAD代碼可綁定到文字?jǐn)?shù)據(jù)標(biāo)簽內(nèi)的數(shù)據(jù),并對(duì)類型sys:Data的任何參數(shù)的值使用它。數(shù)據(jù)綁定也可用于引用相對(duì)數(shù)據(jù)位置。例如,<TextText="$SomeLocation/myd:Employees/myd:Employee/myd:Name"/>使用了動(dòng)態(tài)前綴,即“$SomeLocation”,之后是相對(duì)數(shù)據(jù)引用,即“myd:Employees”、“myd:Employee”和“myd:Name”,而不使用“$”字符。結(jié)果是對(duì)從附加有給定相對(duì)位置的$SomeLocation的值形成的絕對(duì)位置的數(shù)據(jù)綁定。另外,數(shù)據(jù)綁定可結(jié)合分組標(biāo)簽來使用。例如,表6中的示例代碼(第1行)將MergeTreesTransform實(shí)體綁定到Resources分組標(biāo)簽下的該組實(shí)體。表6到分組標(biāo)簽或動(dòng)作的數(shù)據(jù)綁定表6(第2行)示出了XAD允許將動(dòng)作綁定到數(shù)據(jù)值。例如,以下定義將動(dòng)作綁定到$ScratchData的值。按照定義,$ScratchData的初始值是“Bye”?!癕ouseLeftButtonDown”是類型“sys:EventHandler”的參數(shù)。對(duì)應(yīng)于“MouseLeftButtonDown”參數(shù)的動(dòng)作在Text實(shí)體遇到左鼠標(biāo)鍵按下事件的任何時(shí)刻被調(diào)用。這一事件使得SetTextValueAction被調(diào)用,這將<Greeting>元素的文本值改為“Caio”。同樣,右鼠標(biāo)鍵按下事件將導(dǎo)致$ScratchData的值改為“AuRevoir”。在又一示例中,數(shù)據(jù)綁定允許應(yīng)用程序接收命令行參數(shù)。例如,表7中的示例代碼允許指定命令行參數(shù)。sys:Main標(biāo)簽是應(yīng)用程序的入口點(diǎn)。表7命令行數(shù)據(jù)綁定表7中定義的應(yīng)用程序接受諸如“xadCommandLine.xad/TextData=Testing”等命令行參數(shù),其中CommandLine.xad是應(yīng)用程序名稱,TextData是參數(shù)名,Testing是值。在一個(gè)實(shí)施例中,可將多個(gè)參數(shù)以“xadApplicationName/參數(shù)名1=值1/參數(shù)名2=值2.../參數(shù)名n=值n”的形式傳入XAD。本領(lǐng)域的技術(shù)人員可以理解,盡管以上的示例性實(shí)施例使用串作為輸入值,但是命令行參數(shù)可以替換地或另外地包括字母數(shù)字值、文件名、圖像或其它資源位置等。同樣,命令行參數(shù)可被給予一默認(rèn)值,以供在沒有為該參數(shù)指定命令行參數(shù)值時(shí)使用。數(shù)據(jù)源標(biāo)簽在一個(gè)實(shí)施例中,外部數(shù)據(jù)通過DataSource標(biāo)簽展示給XAD應(yīng)用程序。此外,可使用XmlFileDataSource標(biāo)簽來建立應(yīng)用程序和XML文件之間的連接,使得后者可被應(yīng)用程序用作數(shù)據(jù)源。外部數(shù)據(jù)源可以按類似于由sys:InlineData標(biāo)簽提供的內(nèi)聯(lián)數(shù)據(jù)的方式來使用。然而,外部數(shù)據(jù)源可使用XAD動(dòng)作保存到盤,且因此其它用戶對(duì)數(shù)據(jù)的改變可在需要時(shí)由該應(yīng)用程序消耗。導(dǎo)出標(biāo)簽定義XAD允許使用導(dǎo)出標(biāo)簽定義來支持定義的抽象和重用。例如,在要求一系列12磅Verdana字體標(biāo)題的應(yīng)用程序中,用戶可將諸如“<TextFontFamily="Verdana"FontSize="12"Text="headingtexthere"/>”等定義放置在要求標(biāo)題的每一位置處。然而,如果要求上百或上千個(gè)標(biāo)題,且每一標(biāo)題可能不同,則導(dǎo)出標(biāo)簽定義允許更大的指定效率。更具體地,可定義導(dǎo)出標(biāo)簽定義且一個(gè)示例在表8中示出。表8導(dǎo)出標(biāo)簽定義示例表8所示的定義將使得XAD創(chuàng)建類型fwk:UIElement的名為TitleText的新標(biāo)簽。該標(biāo)簽內(nèi)的Text參數(shù)被綁定到對(duì)$Text傳入的值,該值可對(duì)標(biāo)題的每一實(shí)例化不同地傳入。作為另一示例,考慮表9所示的以下示例,其中第一行是XAD的樣本片斷,第二行示出了導(dǎo)出標(biāo)簽定義以替換該XAD片斷的示例,而第三行示出了使用該導(dǎo)出標(biāo)簽定義的實(shí)例化調(diào)用。表9示例片斷,導(dǎo)出標(biāo)簽定義,示例實(shí)例化如表9所示,導(dǎo)出標(biāo)簽可提高多次調(diào)用或?qū)嵗嗤?xiàng)時(shí)的功能性和簡(jiǎn)單性。范圍和新范圍參數(shù)范圍參數(shù)為變化生存期的對(duì)象的某些子圖提供了定義的邊界,尤其是為這些實(shí)體的延遲和/或重復(fù)的實(shí)例化提供該定義的邊界。工廠是推遲和延遲調(diào)用實(shí)例化的手段。范圍變量提供了作為由調(diào)用該實(shí)例化的實(shí)體提供的參數(shù)的值。對(duì)范圍變量的使用的一個(gè)示例是允許接收不同的事件特性,諸如鼠標(biāo)鍵按下事件。XAD使用新范圍參數(shù)以在應(yīng)用程序組件之間、對(duì)象之間、和/或其組合之間傳遞數(shù)據(jù)。在一個(gè)實(shí)施例中,可由父組件使用新范圍參數(shù)來將參數(shù)傳遞到新創(chuàng)建的子組件。由此,XAD允許用戶充分利用代碼重用。在一個(gè)實(shí)施例中,構(gòu)造了包括對(duì)每一列表?xiàng)l目中的數(shù)據(jù)的引用的列表實(shí)體。定義要對(duì)單個(gè)列表?xiàng)l目做什么的同一參數(shù)被應(yīng)用于每一新列表?xiàng)l目,從而允許使用單個(gè)參數(shù)或參數(shù)集來創(chuàng)建任意大的條目列表。此外,在父和子對(duì)象之間傳遞的參數(shù)同樣可被優(yōu)化。例如,父對(duì)象可經(jīng)由新范圍參數(shù)將列表索引傳遞給子對(duì)象,所述列表索引對(duì)應(yīng)于被傳遞到子對(duì)象的列表元素。引入新范圍的參數(shù)將“NewScope(新范圍)”屬性設(shè)為真(true)。例如,行“<sys:ParamName="..."NewScope="true".../>”通常用于將新屬性設(shè)為幀。新范圍參數(shù)可用于引入范圍內(nèi)的一個(gè)或多個(gè)變量。變量是隱式聲明的參數(shù)。變量連同新范圍參數(shù)的聲明一起來聲明,如可在表10中(第1行)提供的示例中所見的。如上所述,新范圍對(duì)要被多次實(shí)例化的任何實(shí)體引入。表10(第2行)示出了對(duì)這一工廠的定義表10新范圍參數(shù)在以上示例中(表10,第2行),由RepeatedChild參數(shù)引入的范圍具有名為DataContext的范圍變量。該變量被設(shè)為對(duì)應(yīng)于要實(shí)例化的子視圖的項(xiàng)。以上定義如表11(第1行)所示地應(yīng)用,假定List.xml包含表11(第2行)所示的XML。表11范圍變量的示例使用在表11所示的示例中,對(duì)每一列表項(xiàng),F(xiàn)lowPanel實(shí)體將創(chuàng)建一對(duì)應(yīng)的Text實(shí)體。所得的Flowpanel實(shí)體將在監(jiān)視器上顯示雇員(Employee)A-H的列表。本領(lǐng)域的技術(shù)人員可以理解,每一行對(duì)應(yīng)于Text實(shí)體的一次實(shí)例化。每一實(shí)例化之間變化的是“DataContext”范圍變量的值。所得的模式被稱為重復(fù)器模式(repeaterpattern)。這是XAD中的數(shù)據(jù)集上的迭代的基礎(chǔ)。在一個(gè)實(shí)施例中,重復(fù)器模式可對(duì)多位迭代嵌套。附加參數(shù)附加參數(shù)是由父對(duì)象與子對(duì)象相關(guān)聯(lián)的參數(shù),該子對(duì)象可能不知道如何處理該參數(shù)。例如,作為父“drawing(繪圖)”對(duì)象的子對(duì)象的“triangle(三角形)”對(duì)象可能不具體知道如何處理“position(位置)”坐標(biāo),因?yàn)槲恢米鴺?biāo)涉及繪圖內(nèi)的一般位置且不具體涉及諸如三角形等形狀。附加參數(shù)允許父對(duì)象訪問與子對(duì)象相關(guān)聯(lián)的數(shù)據(jù)和/或功能。XAD基于父對(duì)象中所述參數(shù)的定義來檢驗(yàn)附加參數(shù)以進(jìn)行正確使用。表12(第1行)示出了一個(gè)示例性標(biāo)簽定義。表12附加參數(shù)示例表12(第1行)中的XAD代碼定義定義了稱為DockPanel的實(shí)體,它包括稱為“Dock”的附加參數(shù),該參數(shù)可被稱為“DockPanel.Dock”。表12(第2行)示出了使用DockPanel實(shí)體的示例性XAD代碼。如表12所示,DockPanel.Dock被指定為每一Text實(shí)體的屬性,即使DockPanel.Dock不一定是Text實(shí)體的標(biāo)簽定義中指定的參數(shù)之一。由于DockPanel.Dock是附加參數(shù),它結(jié)合Text實(shí)體來使用,但是實(shí)際上在表12(第1行)所示的DockPanel實(shí)體的聲明中定義。資源參數(shù)另一種類型的參數(shù)是資源參數(shù)。資源參數(shù)提供了儲(chǔ)存在對(duì)象分層結(jié)構(gòu)中沒有邏輯位置的對(duì)象的地方。資源參數(shù)可用于將任意實(shí)體的集合錨定在一給定實(shí)體之下。與資源參數(shù)相關(guān)聯(lián)的動(dòng)作和狀態(tài)可貫穿整個(gè)應(yīng)用程序來使用。資源參數(shù)的一個(gè)示例性定義在表13中示出。表13示例資源參數(shù)UI元素可經(jīng)由上述XAD的數(shù)據(jù)綁定能力綁定到狀態(tài)和/或動(dòng)作。結(jié)構(gòu)在XAD中,“結(jié)構(gòu)”是可作為一個(gè)名稱傳遞的一組實(shí)體。XAD中的結(jié)構(gòu)也可以是嵌套的。結(jié)構(gòu)和嵌套結(jié)構(gòu)的示例在表14中示出。表14嵌套結(jié)構(gòu)在本示例中,$ActionsAndData.Actions.Print和$ActionsAndData.Actions.Save綁定對(duì)類型sys:EventHandler的所有參數(shù)都是有效的。類似地,$ActionsAndData.RecentDocuments、$ActionsAndData.Preference.User和$ActionsAndData.Preferences.Enterprise對(duì)類型sys:Data的所有參數(shù)都是有效的。$ActionsAndData對(duì)簽名(Signature)app:ActionsAndDataSignature的所有參數(shù)都是有效的。$ActionsAndData.Actions對(duì)簽名app:ActionsSignature的所有參數(shù)都是有效的。最后,$ActionsAndData.Preferences對(duì)簽名app:PreferencesSignatures的所有參數(shù)都是有效的。部件清單(manifest)在一個(gè)實(shí)施例中,XAD使用“部件清單”來將應(yīng)用程序的各部分,如應(yīng)用程序描述集合在一起。部件清單是能夠由計(jì)算機(jī)處理的描述應(yīng)用程序的各方面的指定,例如應(yīng)用程序需要哪些文件、對(duì)象之間存在什么依賴性、以及什么用戶環(huán)境專用數(shù)據(jù)是應(yīng)用程序的一部分(諸如用戶本機(jī)語(yǔ)言的用戶界面元素文本、圖標(biāo)等,與應(yīng)用程序操作的數(shù)據(jù)不同)。內(nèi)置標(biāo)簽內(nèi)置標(biāo)簽是預(yù)定義且向XAD開發(fā)者提供了重要能力的標(biāo)簽。常規(guī)上,內(nèi)置標(biāo)簽用“sys:”作為前綴。例如,這些內(nèi)置標(biāo)簽可允許條件操作、重復(fù)操作以及對(duì)象的創(chuàng)建。一種這一類型的內(nèi)置標(biāo)簽被稱為“動(dòng)態(tài)實(shí)體”標(biāo)簽,它可用于在數(shù)據(jù)描述內(nèi)改變要使用什么類型的對(duì)象。這允許在屏幕上對(duì)對(duì)象的配置進(jìn)行實(shí)時(shí)修改。例如,響應(yīng)于用戶選擇一給定用戶界面元素,該元素的功能和/或用途可被實(shí)時(shí)更改。例如,一個(gè)輸出窗口可用于基于對(duì)“循環(huán)到下一應(yīng)用程序視圖”用戶命令的選擇來顯示來自任意多的不同應(yīng)用程序視圖的輸出。在一個(gè)實(shí)施例中,動(dòng)態(tài)實(shí)體標(biāo)簽允許如以下表15所示地按標(biāo)簽名稱來進(jìn)行動(dòng)態(tài)實(shí)體實(shí)例化表15示例動(dòng)態(tài)實(shí)體使用在表15所示的示例中,內(nèi)置實(shí)體“DynamicEntity(動(dòng)態(tài)實(shí)體)”向開發(fā)者提供了動(dòng)態(tài)定義實(shí)體的能力。在這一情況下,$DateTag解析到本地名稱。稱為“切換實(shí)體”的另一種類型的內(nèi)置標(biāo)簽允許通過對(duì)一個(gè)對(duì)象或多個(gè)相關(guān)對(duì)象的條件構(gòu)造來動(dòng)態(tài)地重新配置應(yīng)用程序。盡管XAD是聲明性語(yǔ)言,但是它仍具有足夠的表達(dá)力以允許對(duì)實(shí)體的條件構(gòu)造。提供了單個(gè)構(gòu)造以允許條件構(gòu)造Switch(切換)。切換實(shí)體標(biāo)簽可由“cases(情況)”或“conditions(條件)”標(biāo)簽來參數(shù)化。Cases可以被認(rèn)為是類似于C#的switch,而Conditions類似于一組C#的if-else子句。在一個(gè)實(shí)施例中,對(duì)Cases和Conditions的使用是互斥的,這意味著Switch不能在其主體中混合Cases和Conditions。另外,在本實(shí)施例中,Cases可能僅在Switch為其Data(數(shù)據(jù))參數(shù)指定了值時(shí)使用,否則必須使用Conditions。使用Switch允許作者作為對(duì)切換求值的結(jié)果而有條件地返回1個(gè)或多個(gè)實(shí)體。表16示出了某些示例XAD數(shù)據(jù)(第1行),以及對(duì)切換的示例使用(第2和3行)。表16示例資源參數(shù)如可以理解的,表16的第2行示出了一個(gè)實(shí)施例中基于大于50.00美元的值來創(chuàng)建實(shí)體的句法。表16的第3行通過示出用于其它條件測(cè)試的測(cè)試塊實(shí)體進(jìn)一步說明了這一示例。所得的視圖將顯示第1行中的所有元素項(xiàng),即“Toaster”、“VCR”、“DVDPlayer”、“Receiver”和“Sub-woofer”。然而,“Toaster”將是Georgia粗體字體且是綠色,而“Receiver”將是Arial粗體字體且是紅色。切換連同依賴性跟蹤和重新確認(rèn)一起允許動(dòng)態(tài)重新配置的自動(dòng)實(shí)現(xiàn)。動(dòng)態(tài)重新配置將在以下更詳細(xì)討論??蚣軜?biāo)簽XAD和XAF允許稱為框架標(biāo)簽(縮寫為“fwk”)的另一種類型的標(biāo)簽??蚣軜?biāo)簽可用于創(chuàng)建作為應(yīng)用程序的一部分的對(duì)象??蚣軜?biāo)簽可用于引用動(dòng)作、數(shù)據(jù)源、變換和關(guān)聯(lián)管理器(各自在以下討論)。在一個(gè)實(shí)施例中,應(yīng)用程序調(diào)試也可經(jīng)由框架標(biāo)簽來執(zhí)行。在最簡(jiǎn)單的級(jí)別上,UI連接器提供了可視化XAF數(shù)據(jù)并響應(yīng)于修改該數(shù)據(jù)的事件的能力。任一特定UI連接器實(shí)際上擁有一UI連接器正在呈現(xiàn)的“元素樹”,即可被顯示的一組可視元素。與每一UI連接器相關(guān)聯(lián)的是將數(shù)據(jù)轉(zhuǎn)換成可視元素的代碼以及將事件轉(zhuǎn)換成編輯操作的代碼。在一個(gè)實(shí)施例中,UI連接器簡(jiǎn)單地展示了客戶機(jī)平臺(tái)(諸如PresentationFoundation(WPF)元素)的特性和事件。此外,UI連接器提供了特定形式的數(shù)據(jù)綁定,從而將來自XAF數(shù)據(jù)層的數(shù)據(jù)綁定到WPF元素。不同的元素被設(shè)計(jì)成可視化不同類型的數(shù)據(jù)。例如,Image(圖像)元素可視化被位圖化的顯示數(shù)據(jù),Text(文本)元素可視化字串?dāng)?shù)據(jù),而ListBox(列表框)可視化可能是不同類數(shù)據(jù)的有序列表。某些元素,如ListBox和TextBox(文本框)也能可視化對(duì)該數(shù)據(jù)的“選擇”。選擇的概念基本上是另一數(shù)據(jù)輸入。一般而言,特定UI連接器被設(shè)計(jì)成對(duì)要可視化的特定類型數(shù)據(jù)起作用。如果兩個(gè)元素使用了完全相同的機(jī)制來接受被它們來可視化的內(nèi)容的輸入(或參數(shù)),則開發(fā)者可編寫單個(gè)UI連接器來處理這兩者。參數(shù)用于向UI連接器給予工廠對(duì)象,后者用于按需創(chuàng)建子對(duì)象。UI連接器通常向工廠提供了數(shù)據(jù)上下文。工廠通常是XAD的片段,它由XAD引擎包裝在對(duì)象中。表17示出了可被提供的一組UI連接器。表17示例內(nèi)置UI連接器一種類型的框架標(biāo)簽(即關(guān)聯(lián)管理器)可用于將一對(duì)象與一數(shù)據(jù)結(jié)構(gòu)或數(shù)據(jù)結(jié)構(gòu)的元素相關(guān)聯(lián)。例如,列表關(guān)聯(lián)管理器可用于將一對(duì)象與一列表中的項(xiàng)相關(guān)聯(lián)。所得的列表項(xiàng)將是動(dòng)態(tài)的,這表現(xiàn)在它將包含對(duì)象及其相關(guān)聯(lián)數(shù)據(jù)與靜態(tài)值相對(duì)的引用。操作中圖28示出了根據(jù)本發(fā)明的一個(gè)實(shí)施例由構(gòu)建器執(zhí)行的操作的操作流程,其中創(chuàng)建并設(shè)置對(duì)象以供使用。實(shí)例化過程2800使用以創(chuàng)建操作2802開始并以初始化操作2806結(jié)束的操作流程來執(zhí)行。一般而言,流程2800可由單個(gè)配置服務(wù)或由多個(gè)服務(wù)來執(zhí)行。創(chuàng)建操作2802創(chuàng)建對(duì)象。在一個(gè)實(shí)施例中,創(chuàng)建操作2802創(chuàng)建對(duì)象所需的數(shù)據(jù)結(jié)構(gòu)。在另一實(shí)施例中,創(chuàng)建操作2802還按需為該數(shù)據(jù)結(jié)構(gòu)分配存儲(chǔ)器。一旦創(chuàng)建操作2802創(chuàng)建了對(duì)象,連接操作2804即根據(jù)該對(duì)象與其它對(duì)象的關(guān)系將該對(duì)象連接到其它對(duì)象。在一個(gè)實(shí)施例中,構(gòu)建所創(chuàng)建的對(duì)象與一個(gè)或多個(gè)預(yù)先存在的對(duì)象之間的連接圖。創(chuàng)建-連接-初始化序列允許XAD引擎支持一組對(duì)象之間的循環(huán)連接。在數(shù)據(jù)和變換的情況下,這種循環(huán)是被禁止的,且XAD編譯器執(zhí)行某種檢驗(yàn)來防止這種循環(huán)。由連接操作2804產(chǎn)生的連線或連接圖定義了對(duì)象之間的互連和相互關(guān)系。在一個(gè)實(shí)施例中,這些連接將保持,直到通過動(dòng)態(tài)重新配置(以下討論)來更改,或直到對(duì)象被刪除。哪些連接是必須的是由引擎在執(zhí)行應(yīng)用程序標(biāo)記代碼時(shí)確定的。在一個(gè)實(shí)施例中,連接操作2804將數(shù)據(jù)提供者對(duì)象連接到應(yīng)用程序。初始化操作2806初始化所創(chuàng)建的對(duì)象。在一個(gè)實(shí)施例中,初始化涉及將一個(gè)或多個(gè)非確定性值設(shè)為0或其它預(yù)定義值。在另一實(shí)施例中,初始化操作2806調(diào)用與對(duì)象相關(guān)聯(lián)的構(gòu)造器。在又一實(shí)施例中,初始化操作2806指示所創(chuàng)建的對(duì)象初始化其自身。本領(lǐng)域的技術(shù)人員可以理解,初始化操作2806也可執(zhí)行通常與對(duì)象初始化相關(guān)聯(lián)的其它操作而不脫離本發(fā)明的范圍。在一個(gè)實(shí)施例中,初始化操作2806基于給定對(duì)象是否包含要初始化的數(shù)據(jù)而有條件地發(fā)生。在一個(gè)實(shí)施例中,對(duì)象可基于條件用不同值來初始化。例如,以下表16中所示的定義將使得XAD在物品的價(jià)格超過$500時(shí)以紅色顯示在列表中,并且如果價(jià)格低于$100則以綠色顯示物品。表16示例XAD代碼在一個(gè)實(shí)施例中,引擎使用即時(shí)(just-in-time)編譯來執(zhí)行操作2802、2804和2806。在另一實(shí)施例中,預(yù)編譯應(yīng)用程序。在又一實(shí)施例中,使用預(yù)編譯和即時(shí)編譯的組合來實(shí)現(xiàn)性能和靈活性的平衡。XAD允許應(yīng)用程序被動(dòng)態(tài)地重新配置。動(dòng)態(tài)重新配置可由流入應(yīng)用程序的數(shù)據(jù)的改變或?qū)?yīng)用程序現(xiàn)有的數(shù)據(jù)的修改來觸發(fā)。圖29示出了在XAD的一個(gè)實(shí)施例中如何動(dòng)態(tài)地重新配置應(yīng)用程序。監(jiān)聽者(listener)是計(jì)算機(jī)代理,它監(jiān)視應(yīng)用程序或應(yīng)用程序組的某些事件。XAD監(jiān)聽者監(jiān)視XAD應(yīng)用程序內(nèi)某些已注冊(cè)對(duì)象的數(shù)據(jù)的值的改變。注冊(cè)操作2902向這一監(jiān)聽者注冊(cè)對(duì)象及其數(shù)據(jù)。當(dāng)數(shù)據(jù)值的改變?cè)谝炎?cè)對(duì)象中發(fā)生時(shí),由接收操作2904接收來自監(jiān)聽者的改變通知。標(biāo)記操作2906然后標(biāo)識(shí)依賴于改變的值的一個(gè)或多個(gè)數(shù)據(jù)值,并將它們標(biāo)記為已受改變影響。分析操作2908分析改變的值對(duì)每一所標(biāo)記的數(shù)據(jù)值的影響?;谶@一分析的結(jié)果,確定操作2910確定是否有任何對(duì)象被改變的值變?yōu)闊o效。如果一個(gè)或多個(gè)對(duì)象被改變?yōu)闊o效,則流程通過“是”分支到移除操作2912,該操作移除一個(gè)或多個(gè)現(xiàn)在無效的對(duì)象。流程然后分支到確定操作2914。如果確定操作2910確定沒有對(duì)象被改變?yōu)闊o效,則流程通過“否”分支到確定操作2914。確定操作2914確定作為改變的值的結(jié)果是否要求任何新對(duì)象。如果要求一個(gè)或多個(gè)新對(duì)象,則流程通過“是”分支到創(chuàng)建操作2802(圖28),并且對(duì)象創(chuàng)建、連接和初始化將如上結(jié)合圖28所述地進(jìn)行。如果確定操作2914確定不要求新對(duì)象,則流程通過“否”分支到示例性流程的結(jié)束。為簡(jiǎn)化新對(duì)象的創(chuàng)建和無效對(duì)象的刪除,XAD能夠?qū)?duì)象進(jìn)行生存期管理。生存期域是XAD應(yīng)用程序中的重新配置單元。其生命跨度被彼此捆綁在一起(例如,第一對(duì)象在沒有第二對(duì)象存在的情況下可能沒有任何用途,而第二對(duì)象在沒有第一對(duì)象存在的情況下可能沒有任何用途)的對(duì)象被放置到同一生存期域中。在給定生存期域中可以有許多對(duì)象。當(dāng)不再要求對(duì)象時(shí),生存期域中的所有對(duì)象可通過引用要?jiǎng)h除的生存期域(與為了刪除可能引用生存期域中的成千上萬的單個(gè)對(duì)象形成對(duì)比)來容易地刪除。本領(lǐng)域的技術(shù)人員可以理解,給定生存期域中的對(duì)象無須在功能上相關(guān);相反,它們只需共享創(chuàng)建時(shí)間和相互依賴性,使得它們可被同時(shí)廢棄。在一個(gè)實(shí)施例中,XAD可結(jié)合應(yīng)用程序的動(dòng)態(tài)重新配置來支持有條件地創(chuàng)建的對(duì)象。變化類型的對(duì)象因此可取決于數(shù)據(jù)值改變的特性來創(chuàng)建。圖30示出了根據(jù)本發(fā)明的一個(gè)實(shí)施例由創(chuàng)建操作2802(圖28)執(zhí)行的操作的操作流程。首先,確定操作3002確定是否有任何標(biāo)簽要實(shí)例化。如果有標(biāo)簽要實(shí)例化,則流程通過“是”分支到確定操作3004。如果沒有標(biāo)簽要實(shí)例化,或者所有標(biāo)簽都已被實(shí)例化,則流程通過“否”分支到連接操作2804(圖28)。確定操作3004確定標(biāo)簽是否包含必須實(shí)例化的任何參數(shù)。如果不存在參數(shù)標(biāo)簽,則流程通過“否”分支到操作3008。如果存在參數(shù)標(biāo)簽,則流程通過“是”分支到實(shí)例化操作3006。實(shí)例化操作3006實(shí)例化由確定操作3004找到的參數(shù)。如上所述,參數(shù)用于描述如何創(chuàng)建、連接或配置工廠或?qū)ο蟆H缦惹八枋龅?,參?shù)可包括工廠或?qū)ο蟮囊粋€(gè)或多個(gè)特性、對(duì)一個(gè)數(shù)據(jù)的引用、或?qū)α硪还S或?qū)ο蟮囊?。特性可以是靜態(tài)或動(dòng)態(tài)的。處理操作3010根據(jù)其數(shù)據(jù)類型來處理標(biāo)簽。存在若干不同種類的標(biāo)簽,且由此由處理操作3010實(shí)現(xiàn)若干種可能的方法。原語(yǔ)標(biāo)簽(實(shí)際對(duì)應(yīng)于一對(duì)象的標(biāo)簽)是通過創(chuàng)建新對(duì)象來處理。在一個(gè)實(shí)施例中,所創(chuàng)建的所有對(duì)象都對(duì)應(yīng)于實(shí)體。某些標(biāo)簽定義范圍邊界。這些標(biāo)簽使得處理操作3010創(chuàng)建“工廠”,工廠可在稍后為實(shí)體的按需實(shí)例化而調(diào)用。當(dāng)處理工廠時(shí),創(chuàng)建一新的范圍域。通常可由實(shí)體檢查其依賴性信息,該信息在動(dòng)態(tài)重新配置期間可以是有用的。處理操作3010通過創(chuàng)建切換工廠來處理切換標(biāo)簽。這是一個(gè)工廠,它支持基于各種用戶指定條件的應(yīng)用程序控制的分支。該工廠可用于監(jiān)視各種條件,當(dāng)滿足這些條件時(shí)將觸發(fā)應(yīng)用程序流中的分支。在一個(gè)實(shí)施例中,當(dāng)由于作為動(dòng)態(tài)重新配置的一部分來重新處理標(biāo)簽而變得必須時(shí),即時(shí)編譯被使用來修改對(duì)象。處理操作3010也可處理其它類型的標(biāo)簽。例如,綁定標(biāo)簽觸發(fā)處理操作3010創(chuàng)建工廠以指示某一參數(shù)值實(shí)際上是對(duì)某一其它實(shí)體的引用。這大致類似于過程語(yǔ)言中的指針。動(dòng)態(tài)實(shí)體標(biāo)簽允許要?jiǎng)?chuàng)建的實(shí)體的延遲的綁定。在一個(gè)實(shí)施例中,該延遲綁定被推遲到應(yīng)用程序運(yùn)行時(shí)。在處理操作3010處理了標(biāo)簽之后,流程返回到確定操作3002。在一個(gè)實(shí)施例中,可向XAD應(yīng)用程序添加插件(add_ins)。插件是可擴(kuò)展給定應(yīng)用程序的基本特征集而無需升級(jí)應(yīng)用程序的自含式軟件包。插件允許在新特征或第三方擴(kuò)展變得可用時(shí)遞增地添加它們,而無需經(jīng)歷可能昂貴的升級(jí)循環(huán)。XAD插件被打包在組合件(assembly)中。在一個(gè)實(shí)施例中,組合件通過部件清單(上文討論)中指定的靜態(tài)依賴項(xiàng)來加載。在一個(gè)實(shí)施例中,XAD應(yīng)用程序經(jīng)由可擴(kuò)展性協(xié)議來與插件通信??蓴U(kuò)展性協(xié)議可以在單獨(dú)的組合件中定義,使得該協(xié)議可由應(yīng)用程序和可開發(fā)該擴(kuò)展的第三方兩者同時(shí)發(fā)布和引用??蓴U(kuò)展性協(xié)議具有兩個(gè)部分。第一部分是元數(shù)據(jù)(Metadata)方案。元數(shù)據(jù)是描述數(shù)據(jù)的數(shù)據(jù)。在XAD的上下文中,元數(shù)據(jù)可用于描述由插件實(shí)現(xiàn)的特征。元數(shù)據(jù)可包括標(biāo)簽名稱、要傳遞的參數(shù)、UI的人類-可讀文本等??蓴U(kuò)展應(yīng)用程序定義了元數(shù)據(jù)方案(從插件所預(yù)期的),而插件提供了內(nèi)容。可擴(kuò)展性協(xié)議的第二部分是標(biāo)簽簽名(以上討論)。插件通過定義標(biāo)簽來實(shí)現(xiàn)其特征。應(yīng)用程序使用這些標(biāo)簽來訪問插件特征。應(yīng)用程序定義標(biāo)簽簽名(標(biāo)簽應(yīng)當(dāng)導(dǎo)致什么類型的實(shí)體、標(biāo)簽應(yīng)當(dāng)取什么參數(shù)等等),而插件提供了標(biāo)簽定義(標(biāo)簽名稱和實(shí)際實(shí)現(xiàn))。標(biāo)簽簽名因此大致類似于接口,而標(biāo)簽定義大致類似于接口實(shí)現(xiàn)。在一個(gè)實(shí)施例中,XAD支持可經(jīng)由元數(shù)據(jù)標(biāo)簽訪問的全局元數(shù)據(jù)樹。元數(shù)據(jù)樹是來自所有動(dòng)態(tài)加載的組合件的所有元數(shù)據(jù)成份文件的聯(lián)合。在運(yùn)行時(shí),元數(shù)據(jù)樹在加載或卸載具有元數(shù)據(jù)成份文件的組合件的任何時(shí)刻被自動(dòng)更新。發(fā)送適當(dāng)?shù)母淖兺ㄖ沟脩?yīng)用程序可動(dòng)態(tài)地更新其自身(如先前結(jié)合圖29所討論的)。元數(shù)據(jù)樹允許應(yīng)用程序發(fā)現(xiàn)要加載什么插件,并利用插件所提供的特征。在一個(gè)實(shí)施例中,插件定義了用于訪問插件所實(shí)現(xiàn)的特征的標(biāo)簽。由于插件在編寫應(yīng)用程序時(shí)可能是不可用的,因此應(yīng)用程序作者可能無法知道并使用由插件定義的標(biāo)簽。作者可能僅知道,且因此可能僅靜態(tài)地定義標(biāo)簽簽名。實(shí)際標(biāo)簽名稱和最終的參數(shù)值可由插件使用元數(shù)據(jù)來提供。由于元數(shù)據(jù)方案是應(yīng)用程序定義的可擴(kuò)展性協(xié)議的一部分,因此元數(shù)據(jù)方案信息可由應(yīng)用程序訪問。應(yīng)用程序因此能夠讀取元數(shù)據(jù),并按照標(biāo)簽名稱來動(dòng)態(tài)地實(shí)例化實(shí)體。XAD支持用于此目的的DynamicEntity標(biāo)簽。盡管已在語(yǔ)言中明確地對(duì)結(jié)構(gòu)特征、方法動(dòng)作和包含這些動(dòng)作的計(jì)算機(jī)可讀介質(zhì)描述了本發(fā)明,但是可以理解,所附權(quán)利要求書中定義的本發(fā)明不必限于所描述的具體結(jié)構(gòu)、動(dòng)作或介質(zhì)。本領(lǐng)域的技術(shù)人員將理解落入本發(fā)明的范圍和精神之內(nèi)的其它實(shí)施例或改進(jìn)。因此,公開了這些具體結(jié)構(gòu)、動(dòng)作或介質(zhì)作為實(shí)現(xiàn)所要求保護(hù)的本發(fā)明的示例性實(shí)施例。本發(fā)明由所附權(quán)利要求書來定義。附錄A內(nèi)容1.緒論............................................................................711.1XAF原則.................................................................711.2XAF目標(biāo).................................................................711.3XAF應(yīng)用程序結(jié)構(gòu)和XAD的角色..............................................721.4規(guī)范結(jié)構(gòu)................................................................731.5規(guī)范約定................................................................742.語(yǔ)言概念........................................................................742.1HelloWorld例子.........................................................742.2大小寫敏感性............................................................752.3實(shí)體標(biāo)簽................................................................762.4實(shí)體的基本參數(shù)化........................................................782.4.1用靜態(tài)串的參數(shù)化...................................................782.4.2用單數(shù)實(shí)體的參數(shù)化.................................................792.4.3用實(shí)體組的參數(shù)化...................................................812.4.4資源...............................................................832.4.5默認(rèn)參數(shù)...........................................................832.4.6附加參數(shù)............................................................852.4.7內(nèi)聯(lián)數(shù)據(jù)............................................................872.5通過綁定參數(shù)化..........................................................882.5.1標(biāo)簽的命名.........................................................882.5.2綁定到實(shí)體.........................................................892.5.3綁定到分組標(biāo)簽.....................................................942.5.4綁定到標(biāo)簽定義的形式參數(shù)...........................................952.5.5使用綁定來允許編輯.................................................972.6主標(biāo)簽..................................................................992.6.1自動(dòng)填充參數(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用于默認(rèn)目的的樣式.....................................................1122.11.2Avalon的視覺樹的樣式化.................................................1152.11.3樣式化和視覺觸發(fā)器.....................................................1162.12設(shè)定范圍的參數(shù)...............................................................1162.12.1范圍變量...............................................................1162.12.2重復(fù)器模式.............................................................1192.12.3范圍相關(guān)的綁定限制.....................................................1222.12.4嵌套的重復(fù)器模式.......................................................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選擇器和標(biāo)簽定義.......................................................1362.15關(guān)聯(lián).........................................................................1382.16標(biāo)簽文檔編制.................................................................1403.形式語(yǔ)言規(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)置實(shí)體........................................................................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實(shí)體構(gòu)建器......................................................................1573.6動(dòng)作............................................................................1604.公共框架實(shí)體.......................................................................1625.部署模型...........................................................................1625.1XAD應(yīng)用程序................................................................1625.2XAD組合件..................................................................1635.3組合件部件清單.............................................................1655.3.1部件清單標(biāo)簽.........................................................1665.3.2示例部件清單.........................................................1675.4組合件依賴性...............................................................1695.5組合件綁定、加載和卸載.....................................................1705.6打包情形...................................................................1715.6.1單文件應(yīng)用程序.......................................................1715.6.2導(dǎo)出標(biāo)簽的庫(kù).........................................................1725.6.3原語(yǔ)標(biāo)簽的庫(kù).........................................................1766.插件模型...........................................................................1796.1插件是什么?...............................................................1796.2XAD插件模型................................................................1796.2.1組合件的動(dòng)態(tài)加載.....................................................1806.2.2元數(shù)據(jù)-驅(qū)動(dòng)的可擴(kuò)展性協(xié)議............................................1806.2.3動(dòng)態(tài)實(shí)體實(shí)例化.......................................................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”實(shí)體標(biāo)簽的名字必須不以“s”結(jié)束................................1887.6選擇器標(biāo)簽的名字必須以“Selector”結(jié)束.....................................1887.7Param(如果指定)必須是實(shí)體的第一個(gè)屬性......................................1887.8Name(如果指定)必須是實(shí)體的Param(如果指定)之后的第一個(gè)屬性...................................................................1881.緒論XAD(XAF應(yīng)用程序定義)是一種用來制作XAF應(yīng)用程序的聲明性語(yǔ)言。XAD的UI組合方面盡可能地與XAML相同。XAD所支持的其它特征大多數(shù)面向XAF平臺(tái)的數(shù)據(jù)綁定特征。盡管XAD可使用多種格式來表示,但其主要表示是用Xml的。這允許與XAML的強(qiáng)嚙合。使用Xml的另一個(gè)優(yōu)點(diǎn)是XAD解析器以及XAD開發(fā)工具可直接處理XAF的固有數(shù)據(jù)表示(Xml)。XAD就XAD開發(fā)人員無需執(zhí)行任何顯式編譯步驟而言是“經(jīng)翻譯的”。這沒有排除出于性能原因在“JIT編譯”幕后進(jìn)行的一些編譯。1.1XAF原則XAF是用于建立以大大縮減的時(shí)間上市的“辦公室類”應(yīng)用程序的平臺(tái)。XAF的核心原則是·將Xml用作統(tǒng)一數(shù)據(jù)表示·是建立應(yīng)用程序的一種高度組件化的方法·強(qiáng)大的數(shù)據(jù)轉(zhuǎn)換能力·將Avalon用作基礎(chǔ)表示層的豐富組合視圖1.2XAF目標(biāo)因?yàn)閄AD被用來制作XAF應(yīng)用程序,所以XAD的目標(biāo)基于核心XAF原則建立·將Xml用作外部數(shù)據(jù)和應(yīng)用程序狀態(tài)的統(tǒng)一數(shù)據(jù)表示·與Xml和非Xml數(shù)據(jù)源的無縫和動(dòng)態(tài)數(shù)據(jù)綁定(通過非Xml數(shù)據(jù)源的Xml表示)·復(fù)雜數(shù)據(jù)流的聲明性定義·使用1)帶附加數(shù)據(jù)綁定結(jié)構(gòu)的類XAML語(yǔ)法、或2)XAML本身對(duì)UI的聲明性定義·數(shù)據(jù)如何進(jìn)行變換、顯示和交互的基于規(guī)則的聲明性定義·強(qiáng)類型化和高級(jí)靜態(tài)檢查·具有最小“內(nèi)置”關(guān)鍵字集的高級(jí)擴(kuò)展·漸進(jìn)的抽象級(jí)別·就以下方面而言足夠豐富以指定“辦公室類”應(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è)計(jì)對(duì)話框和UI圖元,但開發(fā)人員最終負(fù)責(zé)執(zhí)行流的可視設(shè)計(jì)程序。開發(fā)人員必需編寫處理應(yīng)用程序狀態(tài)的事件處理程序和數(shù)據(jù)結(jié)構(gòu)。開發(fā)人員還負(fù)責(zé)管理數(shù)據(jù)結(jié)構(gòu)與表示它們的可視元素之間的映射。所有這些都包括大量的各個(gè)應(yīng)用程序彼此不同(盡管有相似的底層模式)的命令性應(yīng)用程序代碼。XAF采用了一種不同的創(chuàng)作應(yīng)用程序的方法。XAF聲明性地對(duì)應(yīng)用程序的數(shù)據(jù)、用戶界面、以及UI與數(shù)據(jù)交互的方法建模。核心設(shè)計(jì)原則是視圖-數(shù)據(jù)分離。可將XAF應(yīng)用程序視為主要是聲明性的,但按需插入了命令性代碼小段。XAF應(yīng)用程序被認(rèn)為是以數(shù)據(jù)為中心的;除了應(yīng)用程序以數(shù)據(jù)為中心之外,所有應(yīng)用程序狀態(tài)也被視為數(shù)據(jù)。開發(fā)人員主要關(guān)心的是數(shù)據(jù)流過應(yīng)用程序的方法、以及管理應(yīng)用程序如何對(duì)數(shù)據(jù)作出響應(yīng)的規(guī)則。用于動(dòng)態(tài)數(shù)據(jù)綁定的實(shí)際基礎(chǔ)結(jié)構(gòu)不是開發(fā)人員所關(guān)心的,并由XAF在外面提供。1.4規(guī)范結(jié)構(gòu)盡管本規(guī)范中的一部分后面章節(jié)可用作熟練的XAD作者的獨(dú)立的參考,但一般而言這些章節(jié)是相互依賴而建立的。2.語(yǔ)言概念通過普通代碼樣本說明核心語(yǔ)言概念和結(jié)構(gòu)。盡管語(yǔ)言關(guān)鍵字和通用框架標(biāo)簽在樣本中大量使用,但它們僅在后面章節(jié)中形式地定義。3.形式語(yǔ)言規(guī)范所有語(yǔ)言關(guān)鍵字的形式定義(語(yǔ)言關(guān)鍵字可被視為是“內(nèi)置”于語(yǔ)言內(nèi)的標(biāo)簽)。本節(jié)還包括XAD可擴(kuò)展機(jī)制(即第三方可定義其自己的標(biāo)簽)的形式定義。4.公共框架實(shí)體討論由標(biāo)準(zhǔn)XAD框架提供的最常用標(biāo)簽。這些是可由第三方使用XAD的可擴(kuò)展機(jī)制構(gòu)建的標(biāo)簽??蚣軜?biāo)簽有助于使用推薦設(shè)計(jì)模式和最佳實(shí)踐來構(gòu)造應(yīng)用程序。5.部署模型XAD的基于組合件-部署模型的形式定義和示例性討論。6.插件模型XAD部署模型可如何被用作指定插件的聲明性模型的說明性討論。附錄A代碼編寫約定建議的XAD代碼編寫約定的列表。標(biāo)準(zhǔn)的XAD框架符合這些約定。第三方可選擇采用這些約定的部分或全部。1.5規(guī)范約定在XAD內(nèi)使用名字空間完全與W3C的Xml名字空間規(guī)范(http://www.w3.org/TR/REC-xml-names/)兼容。本規(guī)范在所有代碼樣本中使用特定統(tǒng)一的名字空間約定。所有帶“sys”前綴的標(biāo)簽都是居于“XAD系統(tǒng)”名字空間內(nèi)的標(biāo)簽。系統(tǒng)名字空間中的標(biāo)簽被嵌入語(yǔ)言中并可被視為語(yǔ)言保留關(guān)鍵字。所有代碼樣本的默認(rèn)名字空間是“XAD標(biāo)準(zhǔn)框架”。在本規(guī)范中,所有沒有名字空間前綴的標(biāo)簽都可被標(biāo)識(shí)為屬于標(biāo)準(zhǔn)框架。在其它情形中提供了fwk名字空間,且fwk名字空間應(yīng)當(dāng)與屬于XAD標(biāo)準(zhǔn)框架的標(biāo)簽相關(guān)聯(lián)。所有代碼樣本都順從于附錄A中的編碼約定。2.語(yǔ)言概念本節(jié)通過普通代碼樣本來說明核心XAD語(yǔ)言概念和結(jié)構(gòu)。在后面章節(jié)中將提供具有更綜合情形的更大代碼樣本。盡管語(yǔ)言關(guān)鍵字和通用框架標(biāo)簽已在樣本中大量使用,但它們僅在后面章節(jié)中形式定義。2.1HelloWorld例子XAD代碼必須總是形式良好的Xml。XAD文件的第一個(gè)標(biāo)簽被要求為<sys.Xad>。該文件通常(但并非必需)具有.xad擴(kuò)展名。HelloWorld.xad在安裝了XAFSDK之后,“xad.exeHelloWorld.xad”將導(dǎo)致該簡(jiǎn)單應(yīng)用程序的執(zhí)行。對(duì)XAD代碼沒有顯式編譯步驟。XAD在XAD代碼第一次執(zhí)行時(shí)自動(dòng)驗(yàn)證(并可能編譯,盡管這并不會(huì)在當(dāng)前進(jìn)行)。驗(yàn)證步驟失敗的XAD不能運(yùn)行,直到必要的編碼錯(cuò)誤被修復(fù)。以下是HelloWorld.xad應(yīng)用程序的屏幕截圖。將使用迎合在問題中該概念的XAD小樣本來討論各個(gè)語(yǔ)言概念。列示HelloWorld例子的主要目的是提供與XAD外觀相關(guān)的某類基本上下文。2.2大小寫敏感性寫成以下與寫成以下<text>是不同的。2.3實(shí)體標(biāo)簽并非XAD中的所有標(biāo)簽都是實(shí)體標(biāo)簽(有兩類稱為“分組標(biāo)簽”和“選擇器標(biāo)簽”的其它標(biāo)簽——它們是將在后面討論中定義的實(shí)體標(biāo)簽的微小變型)。然而,實(shí)體標(biāo)簽是最常見和最重要種類的XAD標(biāo)簽。為了成為一個(gè)XAF標(biāo)簽,CLR對(duì)象必須·從以下兩個(gè)基類之一導(dǎo)出оMicrosoft.Xaf.Core.BaseTypes.EntityElementоMicrosoft.Xaf.Core.BaseTypes.EntityComposite·附著于http://xafteam/xafenv/doc/Platform/CoreComponents/Dev/DevIntroToEntityDomains.doc中定義的特定協(xié)議和契約。標(biāo)簽構(gòu)建器類是負(fù)責(zé)實(shí)體(工廠模式)的實(shí)際實(shí)例化以及實(shí)體的參數(shù)化的類。該標(biāo)簽構(gòu)建器實(shí)際上是僅對(duì)框架擴(kuò)展器感興趣的實(shí)現(xiàn)細(xì)節(jié)。在HelloWorld樣本中有3個(gè)實(shí)體標(biāo)簽(Application、Window和Text)這三個(gè)實(shí)體標(biāo)簽的每一個(gè)都導(dǎo)致在執(zhí)行應(yīng)用程序時(shí)創(chuàng)建一實(shí)體。·Application實(shí)體是“協(xié)調(diào)”應(yīng)用程序并控制最頂層視圖的根級(jí)實(shí)體?!indow是負(fù)責(zé)顯示應(yīng)用程序框架的UI實(shí)體。·Text是負(fù)責(zé)顯示文本(在該情形中是“HelloWorld”)的UI實(shí)體。實(shí)體標(biāo)簽通過聲明形式來定義,例如Text標(biāo)簽定義如下所示地開始實(shí)體標(biāo)簽可被分成各種類型。這些類型是一可擴(kuò)展集并實(shí)際上對(duì)應(yīng)于與標(biāo)簽相關(guān)聯(lián)的實(shí)體的CLR類型。大量由標(biāo)準(zhǔn)框架使用的類型的一些示例是sys:DataSys:EventHandler、fwk:UIElement和Sys:Selector。一般而言,將標(biāo)簽添加到Framework或System名字控件之間的區(qū)分基于以下準(zhǔn)則1.如果a.標(biāo)簽由內(nèi)部引擎接口簽發(fā),b.版本具有與核心語(yǔ)言相同的進(jìn)度則添加到System2.如果a.不由內(nèi)部引擎接口簽發(fā),b.版本不具有與核心語(yǔ)言相同的進(jìn)度則添加到Framework實(shí)體的類型在其定義中聲明,接著是Text標(biāo)簽,其類型在其標(biāo)簽定義中指定如下2.4實(shí)體的基本參數(shù)化在前面章節(jié)中,我們確定實(shí)體標(biāo)簽導(dǎo)致對(duì)象(更具體地是XAF實(shí)體)在運(yùn)行時(shí)創(chuàng)建。然而,對(duì)于有用的對(duì)象,它需要某種有意義的參數(shù)化。本節(jié)覆蓋XAD實(shí)體的最基本形式的參數(shù)化。2.4.1用靜態(tài)串的參數(shù)化XAD允許聲明實(shí)體參數(shù)的許多不同方法。一種常見的形式是該聲明指示Text實(shí)體具有類型為“Data”、更具體地為“StringData”的名為“Text”的參數(shù)。Text實(shí)體的實(shí)際實(shí)例看起來類似于在后一節(jié)中,將介紹<sys:InlineData>標(biāo)簽并將討論可如何表達(dá)以“./”、“$”開始的或完全是“.”的靜態(tài)串。2.4.2用單數(shù)實(shí)體的參數(shù)化在前面的示例中,選擇使用硬編碼串或靜態(tài)串來指定TextUI元素的文本。有可能改為用產(chǎn)生串的實(shí)體來參數(shù)化Text元素??紤]產(chǎn)生隨機(jī)串的隨機(jī)字連接器實(shí)體(列出隨機(jī)字體族(RandomFontFamily)的聲明主要是為了強(qiáng)調(diào)Type屬性與Text的FontFamily參數(shù)的相應(yīng)Type屬性相匹配。)用另一個(gè)實(shí)體參數(shù)化的FontFamily看起來類似于這可被讀作“將隨機(jī)字體族實(shí)體用作Text實(shí)體的有效的FontFamily參數(shù)”。這僅僅暗示了用戶定義參數(shù)不能被命名為“Param”。寫成以下是非法的為了更好地理解用其它實(shí)體對(duì)實(shí)體的參數(shù)化,考慮在實(shí)體分層結(jié)構(gòu)中具有一額外層的以下示例XmlFileDataSource實(shí)體用包含一數(shù)字列表的Xml文件的名稱來參數(shù)化。FileConnector實(shí)體可被視為產(chǎn)生了一數(shù)字列表。HighestValueTransform用一列表(在本情形中由XmlFileDataSource提供)來參數(shù)化。HighestValueTransform產(chǎn)生具有最高值的列表-項(xiàng)。然后,Text元素用由HighestValueTransform產(chǎn)生的列表-項(xiàng)來參數(shù)化(只要該列表項(xiàng)的類型為sys:Data且目標(biāo)類型為fwk:String,它就可由Text耗用)。以下示圖有助于說明在此發(fā)生的嵌套數(shù)據(jù)流另一種編寫的方法是不使用Param屬性;這通常更易于理解如從以上Xad中可看到的,使用Param句法使Xad應(yīng)用程序能更為簡(jiǎn)明。然而,使用該語(yǔ)法是樣式而非功能的問題。2.4.3用實(shí)體組的參數(shù)化迄今為止所關(guān)注的都是單數(shù)參數(shù)化。單數(shù)參數(shù)是最多取一個(gè)實(shí)體的參數(shù)。然而,聲明取一個(gè)以上實(shí)體的參數(shù)是可能的??紤]如其名稱所暗示的,F(xiàn)lowPanel(流式面板)元素顯示UI元素的流。要“流動(dòng)”的顯式UI元素組可通過名為“Children”(孩子)的參數(shù)來指定。FlowPanel實(shí)例可被指定為在FlowPanel.Childen分組標(biāo)簽下指定的實(shí)體組對(duì)應(yīng)于FlowPanel的“Children”參數(shù)。所得示圖看起來類似于ChrisHackmannVladoHristovWilliamAitken如果對(duì)于一FlowPanel只指定了一個(gè)子UI元素,則寫成如下仍然有效注意,將“Param”用于取組的參數(shù)是有效的(只要僅指定一個(gè)實(shí)體即可)以下也是有效的寫成如下也是可能的…………使用XQuery是有效的,因?yàn)樗挥米鱂lowPanel的FlowOrientation參數(shù)的值(由Param=“FlowOrientation”表示)。如果Param=“...”被省去,則這會(huì)變成無效的Xad。2.4.4資源存在在所有實(shí)體上得到隱式支持的名為“Resources”的特定參數(shù)。唯一例外是不支持Resources的sys:InlineData。Resources參數(shù)被用來將任意實(shí)體組錨定在給定實(shí)體之下。Resources參數(shù)常常在應(yīng)用程序的最高級(jí)中用作動(dòng)作和狀態(tài)的“摸彩袋”。這些動(dòng)作和狀態(tài)然后在整個(gè)應(yīng)用程序中使用,例如UI元素綁定到狀態(tài)和/或動(dòng)作的方法將在討論XAD綁定結(jié)構(gòu)時(shí)變得顯而易見。有關(guān)數(shù)據(jù)連接器的“Name”屬性和動(dòng)作也將在綁定的上下文中說明。2.4.5默認(rèn)參數(shù)迄今為止已論及XAD中兩種指定參數(shù)的方法;使用“Param”屬性和使用分組標(biāo)簽。然而,HelloWorld樣本兩者都不使用原因是HelloWorld樣本依賴于“默認(rèn)參數(shù)”。它可被重寫如下應(yīng)用程序的標(biāo)簽定義包含類似以下的一行回想以上的FlowPanel示例這無需分組標(biāo)簽(即FlowPanel.Children)就可重寫,因?yàn)閷?duì)于FlowPanel實(shí)體“Children”被指定為默認(rèn)參數(shù)2.4.6附加參數(shù)迄今為止我們確定實(shí)體可如何聲明一閉合參數(shù)組?,F(xiàn)在考慮以下XAD片段所得視圖看起來有些類似于如下Text實(shí)體被指定為DockPanel(停靠面板)實(shí)體的“Children”參數(shù)?;叵氩恍枰纸M標(biāo)簽,因?yàn)镃hildren是DockPanel實(shí)體的默認(rèn)參數(shù)。注意,有趣的是“DockPanel.Dock”被指定為每個(gè)Text實(shí)體的屬性。然而,“DockPanel.Dock”不是在標(biāo)簽定義中對(duì)Text實(shí)體指定的參數(shù)之一。回想直到現(xiàn)在,標(biāo)簽的實(shí)例僅可使用在其相應(yīng)標(biāo)簽定義中被定義為參數(shù)的屬性?!癉ockPanel.Dock”是附加參數(shù)的一個(gè)示例。實(shí)際上,它在聲明DockPanel實(shí)體時(shí)定義這就是說,對(duì)于被指定為Children參數(shù)一部分的每個(gè)UI元素,有可能指定名為DockPanel.Dock的附加參數(shù)。附加參數(shù)的(通過Xad引擎)的技術(shù)限制(不違反任何已知Vl情形)是不能指定非單數(shù)附加參數(shù)。例如,寫成如下是非法的(TargetType定義底層的ManagedAvalon類型,即定義用于“Dock”附加param的Avalon類型。)術(shù)語(yǔ)附加參數(shù)源自參數(shù)由實(shí)體的父親(而非實(shí)體本身)“提供”或“附加”的事實(shí)。此外,DockPanel.Dock句法用來將參數(shù)的性質(zhì)標(biāo)注為一附加參數(shù)。第一方面,DockPanel定義提供該參數(shù)的實(shí)體。同時(shí)第二方面,Dock定義在DockPanel的標(biāo)簽定義內(nèi)定義的附加參數(shù)的名稱。2.4.7內(nèi)聯(lián)數(shù)據(jù)在迄今為止的示例中,已經(jīng)由屬性指定了簡(jiǎn)單的靜態(tài)串,或依賴于數(shù)據(jù)源將更復(fù)雜的數(shù)據(jù)引入XAD。InlineData(內(nèi)聯(lián)數(shù)據(jù))實(shí)體是可用于將簡(jiǎn)單和復(fù)雜的數(shù)據(jù)直接嵌入XAD中的類型為“sys:Data”的System實(shí)體。代替寫成以下XAD有可能將來自Data.xml的數(shù)據(jù)直接嵌入XAD也有可能使用InlineData實(shí)體來指定簡(jiǎn)單的文本值(盡管屬性句法會(huì)簡(jiǎn)明得多)。對(duì)于諸如以“$”或“.”開頭的字符串的某些邊緣條件,InlineData實(shí)體是直接在XAD內(nèi)指定串的唯一方法。所得視圖顯示$5001)(據(jù)TonyW所言)要求探究容易地避開簡(jiǎn)單字符‘$’和‘.’的思路。在‘$’情形中,看起來可使用‘$$’。看來沒有任何容易的避開‘.’的方法。2.5通過綁定參數(shù)化2.5.1標(biāo)簽的命名這僅僅暗示用戶定義的參數(shù)不能被命名為Name。寫成如下是非法的我們尚未討論選擇器標(biāo)簽,但現(xiàn)在該語(yǔ)句暗示所有實(shí)體和分組標(biāo)簽可被命名。該命名純粹是用于允許綁定(又名實(shí)體共享)的目的。例如我們尚未引入范圍的概念,但為便于討論,將某些參數(shù)視為引入一新范圍就足夠了。該語(yǔ)句表示,如果在標(biāo)簽定義的主體內(nèi)沒有這樣的“范圍引入”參數(shù),則名字在標(biāo)簽定義的主體內(nèi)必須唯一。如果在一標(biāo)簽定義內(nèi)有多個(gè)范圍,則放松名字唯一性限制。名字僅在給定范圍中必須唯一。這在討論范圍參數(shù)時(shí)應(yīng)當(dāng)變得更為清晰。2.5.2綁定到實(shí)體對(duì)一公共數(shù)據(jù)源,考慮兩個(gè)視圖。在XAD方面,這將涉及3個(gè)實(shí)體2個(gè)UI元素實(shí)體和一共享的數(shù)據(jù)源實(shí)體。在迄今為止的討論中,在實(shí)體與它們用之參數(shù)化的實(shí)體之間總是有一對(duì)一的映射。然而,實(shí)體的共享是可以理解的常見情形。XAD具有實(shí)現(xiàn)該情況的必要構(gòu)造這表示以下將是非法的BeepCommand實(shí)體的類型是“sys:EventHandler”,但Text參數(shù)的類型是“sys:Data”。在具有表(Table)和樹(Tree)的以上示例中,MyTable.xml具有以下形式Tree可耗用任何樹,但Table要求表形的數(shù)據(jù)(即以上要求數(shù)據(jù)的情形)?,F(xiàn)在考慮如果Table.xml改為包含以下內(nèi)容將會(huì)發(fā)生什么該Table將以綁定到非表數(shù)據(jù)(<SearchResult>標(biāo)簽)結(jié)束。為了解決該失配,Table對(duì)其Table參數(shù)的綁定將必須重新寫為該綁定解釋為“將Table的Table參數(shù)綁定到由名為SharedDataSource的實(shí)體返回的Xml樹內(nèi)的myd:TableData元素”。重要的是注意$SharedDataSource綁定到Xml文件的根,即$SharedDataSource別名<SearchResults...>。因此,位置$SharedDataSource/myd:TableData近似于指定myd:SearchResults/myd:TableData。還要注意該位置上名字空間前綴的使用——這是非常重要的。因?yàn)閄ml文件指定了xmlns=“MyData”的默認(rèn)名字空間,所以Xad內(nèi)的綁定位置必須使用與嘗試訪問數(shù)據(jù)時(shí)相同的名字空間。在大多數(shù)情形中,Xad應(yīng)用程序?qū)adFramework名字空間用作默認(rèn)名字空間。因此,如果綁定被指定為并且Framework名字空間是Xad應(yīng)用程序中的默認(rèn)名字空間,則該綁定將被解釋為顯然,這將不提供所需的來自Xml文件的數(shù)據(jù)。因此,聲明xmlns:myd=“MyData”名字空間是極為重要的。沒有這么做常常是許多破壞性應(yīng)用程序bug的起因。實(shí)際上可綁定到給定標(biāo)簽定義的主體內(nèi)的實(shí)體由范圍的概念所限制。這在以下介紹范圍參數(shù)的概念時(shí)將更深入地論及。有效相對(duì)位置以下Xml文件(RelLocData.xml)在下面的相對(duì)位置示例中使用指定文本元素產(chǎn)生值StephenDanton要知道的一些細(xì)節(jié)要注意的一個(gè)關(guān)鍵方面是相對(duì)位置如何被映射到底層數(shù)據(jù)源。注意,$RelLocData一般不映射到Xml文檔。相反,它映射到該文檔的根<TableData...>。另一種思路是$SomeBinding作為它所綁定數(shù)據(jù)的Xml根的別名。為此可寫成......因?yàn)閷?shí)質(zhì)上它與寫成myd:TableData/myd:Employees相同...要知道的一些其它方面是何時(shí)使用綁定。當(dāng)數(shù)據(jù)源沒有根時(shí),$SomeBinding直接綁定到數(shù)據(jù)的文本元素并將之展示為其值,例如在指定Text=“$UnrootedData”的情形中,可看到$UnrootedData直接映射到字符串“Whereismyroot?”應(yīng)得到理解但容易顯式調(diào)出的最終情形是只有根(rootonly)的數(shù)據(jù)源,例如在該情形中,$RootOnlyData映射到標(biāo)簽<Root>并默認(rèn)地返回到該標(biāo)簽下的第一文本元素,即串“IRootthereforeIam”。指定屬性的值產(chǎn)生值1。指定特定孩子產(chǎn)生值A(chǔ)ndyWassyng(即Employees的第二子)。2.5.3綁定到分組標(biāo)簽除了能綁定到實(shí)體標(biāo)簽之外,有可能綁定到分組標(biāo)簽。例如MergeTreeTransform(合并樹變換)實(shí)體具有稱為“Trees”的取類型為“sys:Data”的一組實(shí)體的參數(shù)。通過綁定到Resources(資源)分組標(biāo)簽,MergeTreeTransform被“綁定”到Resources分組標(biāo)簽下的該組實(shí)體。2.5.4綁定到標(biāo)簽定義的形式參數(shù)即使該主題是在綁定的上下文中討論的,它實(shí)際上不僅僅有關(guān)參數(shù)綁定。它顯示可如何使用XAD來容易地創(chuàng)建具有抽象的漸進(jìn)級(jí)別(很像傳統(tǒng)語(yǔ)言中的函數(shù))的標(biāo)簽??紤]以下XAD片段較為實(shí)際的是假定想要將該XAD片段變成名為“TableWithCaption”的抽象。很像使用函數(shù),該抽象的使用者會(huì)想要使某行為重新參數(shù)化。這可通過創(chuàng)建名為“TableWithCaption”的新實(shí)體標(biāo)簽來實(shí)現(xiàn)。該標(biāo)簽將取2個(gè)參數(shù)“Caption”和“TableFile”。XAD作者可通過純聲明性定義來實(shí)現(xiàn)它注意形式參數(shù)用與引用標(biāo)簽定義主體內(nèi)的實(shí)體完全一樣的方式來引用。這等效于不允許形式參數(shù)通過局部變量遮蔽。寫成如下是非法的創(chuàng)建諸如TableWithCaption的抽象的一常見情形將是提供部分參數(shù)的默認(rèn)值。標(biāo)簽定義供指定這樣的默認(rèn)值之用。在該情形中,Caption參數(shù)被指定為可任選,并默認(rèn)為串“Results”。“TableWithCaption”的實(shí)例化將不再需要Caption(標(biāo)題)如果默認(rèn)不是串,則該默認(rèn)的聲明將包括內(nèi)聯(lián)實(shí)體標(biāo)簽。例如2.5.5使用綁定來允許編輯設(shè)置<sys:InLineData>上的Writable(可寫)屬性使得InlineData(內(nèi)嵌數(shù)據(jù))實(shí)體可寫。以下示例示出將可寫InlineData實(shí)體作為XAD內(nèi)的“scratchpad(便簽簿)”的通常使用。當(dāng)首先顯示Text時(shí),所顯示的文本是InlineData實(shí)體的初始值Bye“MouseLeftButtonDown”是類型為“sys:EventHandler”的參數(shù)。與“MouseLeftButtonDown”參數(shù)(由Param=“MouseLeftButtonDown”表示)相對(duì)應(yīng)的動(dòng)作在Text實(shí)體遇到左鼠標(biāo)鍵按下事件時(shí)調(diào)用。在該情形中,SetTextValueAction將被調(diào)用,并將改變InlineData實(shí)體中的<Greeting>元素的文本值。這是因?yàn)镾etTextValueAction經(jīng)由Data(由Data=“$ScratchPad”表示)參數(shù)綁定到InlineData實(shí)體??傊?,Text所接收到的左鼠標(biāo)鍵按下事件將導(dǎo)致Text顯示Ciao類似地,右鼠標(biāo)鍵按下事件將導(dǎo)致Text顯示AuRevoir動(dòng)作與可寫數(shù)據(jù)的綁定是實(shí)現(xiàn)XAD中的可編輯性的一種常見方法??紤]涉及在表格中插入新行的一種略有不同的情形如果CDs.xml包含以下則最初顯示的表格看起來將類似于AchtungBabyU219.99FirestarterProdigy21.99當(dāng)表格接收右鼠標(biāo)鍵按下事件時(shí),AppendSiblingTreeAction將被調(diào)用并將對(duì)其Tree屬性指定的值添加到由其Sibling(兄弟)param提供的節(jié)點(diǎn)上。此后該樹將類似于由于對(duì)該樹的更新,該表格顯示將自動(dòng)更新使之看起來如下AchtungBabyU219.99FirestarterProdigy21.99??0.002.6主標(biāo)簽在以上規(guī)范的HelloWorld示例中可看到,Xad應(yīng)用程序的入口點(diǎn)與C或C#應(yīng)用程序中的主函數(shù)相似。當(dāng)Xad設(shè)計(jì)時(shí)間外殼時(shí),即Xad.exe運(yùn)行時(shí),它查找“Main”標(biāo)簽定義,即Name=“sys:Main”的標(biāo)簽并將其用作為應(yīng)用程序的入口點(diǎn)。繼續(xù)關(guān)于與通用命令性語(yǔ)言的相似性,sys:Main標(biāo)簽定義可用命令行值來參數(shù)化。此外,它在執(zhí)行應(yīng)用程序之后展現(xiàn)自動(dòng)提供值的三個(gè)預(yù)定義值。2.6.1自動(dòng)填充參數(shù)對(duì)sys:Main參數(shù)標(biāo)簽保留3個(gè)名字,它們是XadBaseDirectory、InitialWorkingDirectory、以及MetaData。它們的每個(gè)以相同的方式展示和綁定。此外,它們都是只讀的。以下將呈現(xiàn)使用XadBaseDirectory參數(shù)的一個(gè)示例。XadBaseDirectory通常與XmlFileDataSource相關(guān)聯(lián)地用作其BaseUri參數(shù)的值,考慮以下Xad......將$XadBaseDirectory用作BaseUri的值表示與DataSource相關(guān)聯(lián)的文件將在傳遞給Xad.exe(即Xad應(yīng)用程序的設(shè)計(jì)時(shí)間外殼)的文件的位置上查找。所以,如果foo.xad是應(yīng)用程序且它位于C:\xaf\demos\personal\,則XadBaseDirectory將等于C:\xaf\demos\personal,且由File定義的文件將在該目錄路徑內(nèi)搜索。以下定義3個(gè)保留參數(shù)的自動(dòng)填充值·XadBaseDirectory-表示該應(yīng)用程序的Xad基本目錄、即啟動(dòng)該應(yīng)用程序的目錄而非啟動(dòng)Xad.exe的位置的串·InitialWorkingDirectory-表示該應(yīng)用程序的初始工作目錄、即啟動(dòng)該應(yīng)用程序的目錄而非啟動(dòng)Xad.exe的位置的串·MetaData-當(dāng)前關(guān)聯(lián)于該應(yīng)用程序的所有載入組件的合并元數(shù)據(jù)的樹。以下Xad應(yīng)用程序示出所有三個(gè)參數(shù)的使用...2.6.2命令行參數(shù)化除了保留的自動(dòng)填充的sys:Main參數(shù)之外,應(yīng)用程序可用如sys:Main的參數(shù)等其它名字來指定任何數(shù)量的參數(shù)。這些參數(shù)可在命令行上被參數(shù)化,并可用于所有方式的應(yīng)用程序配置。以下Xad提供指定的sys:Main參數(shù)、然后是提供其值的該命令行的一個(gè)示例......命令行...xadCommandLine.xad/TextData=Testing...更一般地...xad<應(yīng)用程序文件>[/<參數(shù)名1>=<值1>[/<參數(shù)名2>=<值2>[...]]][Switches]...得到以下應(yīng)用程序...(傳遞到命令行參數(shù)的值不必是簡(jiǎn)單文本,它可以是文件名、圖像位置等。)2.7忽略的塊回想Xad是一種基于Xml的語(yǔ)言。更具體地,任何Xad代碼必須是有效的Xml。這在嘗試用“注釋出和代碼”方法開發(fā)Xad應(yīng)用程序時(shí)產(chǎn)生了有趣的限制。為清晰起見,Xml不支持注釋的嵌套,例如以下Xml是非法的因此,與諸如C++或C#等命令性語(yǔ)言不同,對(duì)注釋的注解在沒有支持這種操作的任何特定句法的Xad中是不可能的,該特征變成名為sys:IgnoredBlock的標(biāo)簽的形式并定義如下。IgnoredBlock(忽略的塊)標(biāo)簽可位于<sys:Xad>范圍之下的任一處,只要其余的Xad是有效的即可。考慮以下......Xad注釋標(biāo)簽不能包圍這些元素中的任一個(gè),因?yàn)樗鼈儗?duì)于一有效的Xad應(yīng)用程序而言都是必需的。IgnoredBlock標(biāo)簽的第一次出現(xiàn)使得它和其孩子被Xad檢驗(yàn)器忽略,考慮以下有效的Xad......添加以下IgnoredBlock標(biāo)簽.......使其變成無效Xml且在該情形中無效Xad。因此,Xad檢驗(yàn)器將報(bào)告無效Xml的差錯(cuò),因?yàn)樵诳蓤?zhí)行進(jìn)一步的檢查之前Xad必須是有效的Xml。只要嵌套保持Xml的有效性,就允許嵌套<sys:IgnoredBlock>...考慮以下顯示<sys:IgnoredBlock>外部的Xml注釋的Xad...被視為一個(gè)大的Xml注釋,即IgnoredBlock不具有特殊功能,在此它僅僅是Xml注釋內(nèi)的一個(gè)字符串??紤]包圍一Xml注釋的<sys:IgnoredBlock>外部的Xml注釋...這是非法的。如上所述,Xad必須一直是有效的Xml。回想按照定義不能用注釋包圍Xml注釋。與Xml注釋不同,<sys:IgnoredBlock>不能用來避開無效Xml......以上Xad將返回一無效Xml的檢查差錯(cuò)<FP>、<A>和<B>沒有結(jié)束標(biāo)簽。然而,如果添加Xml注釋則是可以的...IgnoredBlock標(biāo)簽不能用來注釋出sys:InLineData的內(nèi)部,考慮以下Xad......以上代碼被解釋為“內(nèi)聯(lián)數(shù)據(jù)”,<EFG></EFG>不被忽略,實(shí)際上<sys:IgnoredBlock>變成<EFG>的父親。因此,內(nèi)聯(lián)數(shù)據(jù)實(shí)際上將更易于看到的數(shù)據(jù)定義為...2.8傳出參數(shù)2.9白空格所有進(jìn)入Xad應(yīng)用程序的數(shù)據(jù)都被視為“按現(xiàn)狀”——無論通過數(shù)據(jù)綁定指定或由Xad作者靜態(tài)地定義。因此,Xad將不展示任何用于控制白空格的UI組件專用控件。這表示,與Xaml不同,不在UI元素級(jí)展示xml:space=“Preserve|Default”—這是Xad與Xaml未對(duì)齊的區(qū)域。選擇不在每個(gè)UI元素、數(shù)據(jù)源、變換等上支持“保留白空格”參數(shù)將允許我們對(duì)Office類應(yīng)用程序發(fā)生興趣——即這一類型的白空格管理對(duì)Office類應(yīng)用程序是不實(shí)際的。相反,我們展示W(wǎng)hitespaceTransform(白空格變換)(臨時(shí)名稱—MM3特征),將允許Xad作者定義如何以更為全局/數(shù)據(jù)驅(qū)動(dòng)的方式處理白空格??紤]以下情形...將所有白空格視為按現(xiàn)狀(asis)。意思是如果具有以下Xad......則顯現(xiàn)為“Steve”類似地,對(duì)于......它顯現(xiàn)為“Steve”類似地,對(duì)于......它顯現(xiàn)為“Steve”同樣...<TextText=“$foo”/>其中$foo=“Steve”(對(duì)$foo的值的所有導(dǎo)出重復(fù)。)2.10結(jié)構(gòu)缺少XAD內(nèi)的結(jié)構(gòu)并不排除任何應(yīng)用程序功能。然而,對(duì)于大XAD應(yīng)用程序結(jié)構(gòu)確實(shí)簡(jiǎn)化數(shù)個(gè)創(chuàng)作工作流??紤]具有在頂層定義的一個(gè)動(dòng)作(保存)和三個(gè)狀態(tài)(最近文檔、用戶偏好和企業(yè)偏好)的應(yīng)用程序。如果該應(yīng)用程序具有數(shù)個(gè)窗格(建模成類型為“fwk:UIElement”的導(dǎo)出標(biāo)簽),則問題是1.每個(gè)參數(shù)必須被顯式地傳遞給每個(gè)窗格(數(shù)據(jù)參數(shù)經(jīng)由Xquery的聚集可被用來減少數(shù)據(jù)參數(shù)的數(shù)量,但不會(huì)有助于非數(shù)據(jù)參數(shù))2.添加一額外動(dòng)作(例如打印)要求向每個(gè)窗格添加一新參數(shù)(注意,如果窗格被設(shè)計(jì)成共享參數(shù)組則可避免每個(gè)窗格的標(biāo)簽定義的更改;然而所有窗格實(shí)例仍需被更新)3.沒有根據(jù)嵌套類別將參數(shù)分組的機(jī)制(通過其屬性是其它類的類以典型OO實(shí)現(xiàn);經(jīng)由連接器接口以XAF實(shí)現(xiàn))該情形通過以下示圖說明以進(jìn)一步闡明為便于說明,首先將討論“單層結(jié)構(gòu)”(以解決前兩個(gè)問題),然后一般化為“嵌套結(jié)構(gòu)”(以解決第三個(gè)問題)。實(shí)際上僅有一個(gè)作為“結(jié)構(gòu)”的集體特征。2.10.1單層結(jié)構(gòu)以下XAD將被寫成為指定該結(jié)構(gòu)的簽名使用“app:ActionsAndDataSignature”簽名的樣本結(jié)構(gòu)將是結(jié)構(gòu)可在標(biāo)簽定義內(nèi)使用,其一個(gè)示例如下所示窗格的一個(gè)實(shí)例將是在主體內(nèi),以下綁定將對(duì)類型為“sys:EventHandler”的所有參數(shù)有效·“$ActionAndData.PrintAction”·“$ActionAndData.SaveAction”在主體內(nèi),以下綁定將對(duì)類型為“sys:Data”的所有參數(shù)有效·“$ActionAndData.RecentDocuments”·“$ActionAndData.UserPreferences”·“$ActionAndData.EnterprisePreferences”注意,如果作為例子,用戶偏好由以下形式的數(shù)據(jù)樹建模則有可能經(jīng)由“$ActionsAndData.UserPreferences/AutoSaveFrequency”綁定到自動(dòng)保存頻率設(shè)置。在主體內(nèi),以下綁定對(duì)簽名“app:ActionsAndDataSignature”的所有參數(shù)(通常是要求訪問應(yīng)用程序的動(dòng)作和喜好的其它導(dǎo)出標(biāo)簽的參數(shù))有效·“$ActionAndData”2.10.2嵌套結(jié)構(gòu)同樣的情形可使用嵌套結(jié)構(gòu)(僅僅是單層結(jié)構(gòu)的推廣)來解決在主體內(nèi),以下綁定將對(duì)類型為“sys:EventHandler”的所有參數(shù)有效·“$ActionAndData.Actions.Print”·“$ActionAndData.Actions.Save”在主體內(nèi),以下綁定將對(duì)類型為“sys:Data”的所有參數(shù)有效·“$ActionAndData.RecentDocuments”·“$ActionAndData.Preferences.User”·“$ActionAndData.Preferences.Enterprise”在主體內(nèi),以下綁定對(duì)簽名“app:ActionsAndDataSignature”的所有參數(shù)(通常是要求訪問應(yīng)用程序的動(dòng)作和偏好的其它導(dǎo)出標(biāo)簽的參數(shù))有效·“$ActionAndData”在主體內(nèi),以下綁定對(duì)簽名“app:ActionsSignature”的所有參數(shù)(通常是僅要求訪問應(yīng)用程序的動(dòng)作的其它導(dǎo)出標(biāo)簽的參數(shù))有效·“$ActionAndData.Actions”在主體內(nèi),以下綁定對(duì)簽名“app:PreferencesSignature”的所有參數(shù)(通常是僅要求訪問應(yīng)用程序的喜好的其它導(dǎo)出標(biāo)簽的參數(shù))有效·“$ActionAndData.Preferences”2.11樣式Avalon樣式的主要應(yīng)用為·默認(rèn)特定元素的屬性值·默認(rèn)特定元素下的視覺樹的外觀·默認(rèn)對(duì)特定元素的輸入響應(yīng)(視覺觸發(fā)器)·指定如何顯示一控件的重復(fù)的孩子這些被分成三類1.包含在SDK1中的樣式的各方面;通過將XAML模型一般化并使其可應(yīng)用于XAD特定概念(例如導(dǎo)出標(biāo)簽)來另外添加值;該語(yǔ)法并非必須是相同的,而僅需足夠接近以限定為對(duì)準(zhǔn)區(qū)域。例如,默認(rèn)屬性值。2.在無實(shí)質(zhì)性設(shè)計(jì)的一般化程度上有前途而包含的樣式的各方面;這些是有價(jià)值的方面且要求以某種方式包含后-SDK1例如視覺樹和視覺觸發(fā)器。3.像當(dāng)前設(shè)計(jì)一樣易損壞的、且不像對(duì)于制作“辦公室級(jí)應(yīng)用程序”能按比例縮放的樣式的各方面;它們通過優(yōu)選XAD方法解決。例如顯示重復(fù)孩子。此外,可為了兼容性支持XAML方法,但這些決定將制成后-SDK。本文檔著眼于于SDK1中包含的領(lǐng)域,即默認(rèn)屬性值。2.11.1用于默認(rèn)目的的樣式XAD引擎將處理被指定為資源的名為<sys:Style>的特定標(biāo)簽。將允許指定默認(rèn)參數(shù)值,并將不限于UI實(shí)體。以下是默認(rèn)指定的一個(gè)示例這表示在對(duì)TextBox指定另一默認(rèn)樣式以前,XAD引擎將在創(chuàng)建TextBox時(shí)進(jìn)行以下動(dòng)作·僅當(dāng)未指定明確的Width(寬度)時(shí),將其Width設(shè)定為100%·僅當(dāng)未指定明確的Height(高度)時(shí),將其Height設(shè)定為100%·僅當(dāng)未指定明確的Background(背景)時(shí),將其Background設(shè)定為實(shí)心紅色畫刷“樣式信息”將簡(jiǎn)單地與XAD引擎已保留的分層環(huán)境一起存儲(chǔ)以便鏈接。樣式的查找是散列查找并且無需向上走查樹。在此會(huì)與Avalon不同,因?yàn)槔昧舜嬖赬AD運(yùn)行時(shí)人工制品的事實(shí)(延遲處理范圍)。此外,涉及遍歷視覺樹的方法將嚴(yán)格限制對(duì)UI實(shí)體的默認(rèn)。關(guān)閉一樣式可通過不對(duì)要設(shè)計(jì)樣式的實(shí)體指定參數(shù)來實(shí)現(xiàn)。以下將禁用TextBox的任何先前的樣式默認(rèn)值將可等同地應(yīng)用于導(dǎo)出標(biāo)簽應(yīng)用于非UI實(shí)體的默認(rèn)值的一個(gè)示例是這表示如果未明確指定XmlFileDataSource的AccessMode(存取模式)參數(shù),則它被設(shè)定為ReadOnly。注意,必要參數(shù)必須在XAD內(nèi)指定。依賴于通過樣式(例如XmlFileDataSource的Path(路徑)參數(shù))設(shè)定必要參數(shù)是不可能的。該限制存在以容許編寫。依賴于樣式的存在是脆弱的。此外,將可能在類型層次上指定默認(rèn)這表示在對(duì)UIElement指定另一默認(rèn)樣式以前,XAD引擎將在創(chuàng)建任一UI連接器時(shí)進(jìn)行以下動(dòng)作·如果1.支持Width參數(shù)2.并且未明確指定Width參數(shù)3.并且未指定所討論UI元素的專用樣式(例如TextBox專用樣式),則Width被設(shè)定為100%·對(duì)于Height同上·對(duì)于Background同上2)要求嚴(yán)格的類型匹配?或者應(yīng)當(dāng)另外檢查“最接近IsAssignableForm”匹配?樣式的類型檢查比常規(guī)的XAD更不嚴(yán)格。具體地·因?yàn)槊總€(gè)UIElement都可引入它自己的參數(shù),所以將不檢查“類型樣式”(例如,以上的“UIElement”示例)上的參數(shù)。如果類型為簽名且因此指定了某些參數(shù),那些參數(shù)將是經(jīng)類型檢查的(因?yàn)樵赬AD中不允許覆蓋參數(shù),所以這是可能的)?!邮絻?nèi)所附加參數(shù)的值將被檢查,即將禁止DockPanel.Dock=“Garbage”。然而,將有可能將任何經(jīng)聲明的附加參數(shù)寫入到樣式上。例如,即使樣式可應(yīng)用于不是DockPanel的孩子的TextBox,也可能寫成如下3)將標(biāo)注全局的附加參數(shù)。這在任何情形中都將要求用于冒泡事件的后-SDK1。與XAML相似,將支持通過所有實(shí)體上稱為“Style”(樣式)的隱式系統(tǒng)級(jí)參數(shù)綁定到一特定樣式。然而該樣式仍然需要在范圍中。注意。范圍限制并不真正專用于樣式,而是劃定范圍的綁定模型的結(jié)果。如果需要,可支持與諸如Styles的特定類型的全局綁定,但目前將查看劃定范圍的模型可使用到什么程度。即使它沒有實(shí)際應(yīng)用,但注意為了一致性起見,將可能寫成如下綁定到樣式是類型-安全的。因此以下將導(dǎo)致差錯(cuò)總之,將支持Avalon的模型以在幾個(gè)區(qū)域內(nèi)默認(rèn)使用樣式并添加值·默認(rèn)值應(yīng)用于所有實(shí)體(并非僅僅UI實(shí)體)·默認(rèn)值應(yīng)用于導(dǎo)出標(biāo)簽(而非僅原語(yǔ)標(biāo)簽)·默認(rèn)可在例如所有UIElement的類型層上完成(Avalon最終極有可能支持這個(gè))對(duì)于SDK1將不實(shí)現(xiàn)類型級(jí)上的默認(rèn)。2.11.2Avalon的視覺樹的樣式化對(duì)該區(qū)域的XAD設(shè)計(jì)連同相應(yīng)的UI連接器設(shè)計(jì)一起將通過后-SDK1來完成。2.11.3樣式化和視覺觸發(fā)器對(duì)該區(qū)域的XAD設(shè)計(jì)連同相應(yīng)的UI連接器設(shè)計(jì)一起將通過后-SDK1來完成。2.12設(shè)定范圍的參數(shù)一些參數(shù)引入一新的范圍。引入新范圍的參數(shù)具有設(shè)為真的“NewScope”屬性出于不同原因參數(shù)可選擇引入范圍·要引入范圍變量·要引入一個(gè)單位的延遲和/或重復(fù)工作·以上全部將在本節(jié)中定義設(shè)定范圍的變量和延遲/重復(fù)工作的概念。與設(shè)定范圍的參數(shù)相關(guān)聯(lián)的實(shí)體存在于范圍邊界上。依靠它們所關(guān)聯(lián)的參數(shù)的優(yōu)點(diǎn),它們引入一范圍邊界。以下示圖說明嵌套的范圍引入實(shí)體和分組標(biāo)簽如何產(chǎn)生一范圍樹2.12.1范圍變量參數(shù)引入新范圍的一個(gè)原因是在范圍內(nèi)引入一組變量。這些變量相當(dāng)像形式參數(shù),其不同之處在于它們是隱式聲明的。綁定到設(shè)定范圍的變量以綁定到形式參數(shù)相同的方法實(shí)現(xiàn)。設(shè)定范圍的變量與聲明范圍引入?yún)?shù)一起聲明。例如,考慮Text的標(biāo)簽定義sys:ParamGroupRef定義對(duì)sys:ParamGroup標(biāo)簽的引用,這看起來如下注意名為MouseLeftButtonDown的sys:Param的定義。它指定NewScope和名為Position_X的sys:ScopeVariable。這表示不管什么時(shí)候使用MouseLeftButtonDown參數(shù),它都將1.引入一新范圍2.展示名為Position_X的sys:ScopeVariable設(shè)定范圍的變量的要點(diǎn)是允許諸如以下的情形用于該應(yīng)用程序的Xad如下對(duì)于所有示例,將鼓勵(lì)你運(yùn)行該Xad以感知該應(yīng)用程序的功能。通過使用與MouseLeftButtonDown相關(guān)聯(lián)的范圍變量,將能在每次作鼠標(biāo)鍵按下事件發(fā)生時(shí)更新橙色矩形的位置。進(jìn)一步檢查事件代碼......看到MouseLeftButtonDown參數(shù)展示兩個(gè)范圍變量Position_X和Position_Y。對(duì)那些范圍參數(shù)的值的綁定用與所有Xad綁定相同的參數(shù)來完成。例如,以下將是非法的......因?yàn)镻osition_X由MouseLeftButtonDown展示。2.12.2重復(fù)器模式盡管重復(fù)器模式由各種各樣的實(shí)體類型使用,但其用途由XAD標(biāo)準(zhǔn)框架中的Compound(復(fù)合物)實(shí)體來最佳地說明。數(shù)據(jù)-驅(qū)動(dòng)的復(fù)合物實(shí)體被綁定于數(shù)據(jù)-集,并且對(duì)于該數(shù)據(jù)-集中的每個(gè)數(shù)據(jù)項(xiàng),它顯示一子-元素。迄今為止已在許多樣本中使用了FlowPanel實(shí)體。該FlowPanel實(shí)體真正具有兩種模式·規(guī)定的(要顯示的子-實(shí)體被顯式指定為Children參數(shù))·以及數(shù)據(jù)-驅(qū)動(dòng)的(使用將在本節(jié)內(nèi)定義的重復(fù)器模式)FlowPanel實(shí)體的定義并不僅僅圍繞Children參數(shù)(如迄今為止已在各示例中所提出的)。其標(biāo)簽定義看起來更類似于以下與按規(guī)定指定子-實(shí)體相反,有可能指定Data參數(shù)以及RepeatedChild參數(shù)。這將FlowPanel實(shí)體置入“數(shù)據(jù)-驅(qū)動(dòng)”模式中。注意,F(xiàn)lowPanel標(biāo)簽定義使用<sys:Choice>標(biāo)簽,這些標(biāo)簽需要該標(biāo)簽的任何實(shí)現(xiàn),以在使用Children參數(shù)(從而定義規(guī)定布局)或Data和RepeatedChild的<sys:ParamGroup>之間選擇。RepeatedChild參數(shù)是對(duì)于Data中的各個(gè)項(xiàng)實(shí)例化多次的實(shí)體。由RepeatedChild參數(shù)引入的范圍具有一名為DataContext的范圍變量。該變量被設(shè)定為與要實(shí)例化的子視圖相對(duì)應(yīng)的項(xiàng)。以下片段說明以數(shù)據(jù)-驅(qū)動(dòng)方式對(duì)FlowPanel實(shí)體的使用假定List.xml包含以下Xml對(duì)于每個(gè)列表項(xiàng),F(xiàn)lowPanel實(shí)體都將創(chuàng)建一Text實(shí)體。對(duì)于第一個(gè)Text實(shí)體,DataContext范圍變量的值將是$DataContext/@Name綁定將產(chǎn)生Name(名字)屬性。當(dāng)Text被綁定于一屬性時(shí),在該情形中它顯示為“ChrisHackmann”的屬性值。這同樣適用于每個(gè)列表-項(xiàng)。如果視口(view-port)足夠大,則FlowPanel實(shí)體將在屏幕上顯示如下每一行都對(duì)應(yīng)于Text實(shí)體的一次實(shí)例化。從一個(gè)實(shí)例化到另一個(gè)實(shí)例化所變化的是“DataContext”范圍變量的值。該模式被稱為“重復(fù)器模式”。它是XAD中在數(shù)據(jù)集上迭代的基礎(chǔ)。由于特定縮寫表示法‘.’(單點(diǎn)或句號(hào)),$DataContext/@Name綁定可被重寫為./@Name,該‘.’被保留以唯一用于DataContext范圍變量。2.12.3范圍相關(guān)的綁定限制范圍引入某些綁定限制。從外范圍到內(nèi)范圍的綁定被禁止。然而如下圖所示的從內(nèi)范圍到外范圍的綁定是被允許的。綁定到內(nèi)范圍中的標(biāo)簽被禁止。2.12.4嵌套的重復(fù)器模式在有關(guān)“重復(fù)器模式”的一節(jié)中,說明了如何在數(shù)據(jù)集上實(shí)現(xiàn)簡(jiǎn)單迭代。在本節(jié)中將考慮一種更為復(fù)雜的情形。開始考慮以下簡(jiǎn)單數(shù)據(jù)集考慮該簡(jiǎn)單數(shù)據(jù)集的以下視圖CustomerDescriptionPriceLuisFigoToaster49.99LuisFigoVCR199.99該視圖可用Table(表格)實(shí)體來容易地實(shí)現(xiàn),但為了說明起見將限于FlowPanel和Text實(shí)體對(duì)于熟悉命令性語(yǔ)言的人,僅迭代方面可被大致地建模如下現(xiàn)在考慮以下略復(fù)雜一些的數(shù)據(jù)集考慮該更復(fù)雜數(shù)據(jù)集的以下視圖CustomerDescriptionPriceLuisFigoToaster49.99LuisFigoVCR199.99LilianThuramDVDPlayer279.79LilianThuramReceiver549.99LilianThuramSub-woofer350.00該情形中的唯一實(shí)際區(qū)別是存在額外一級(jí)迭代。與在單個(gè)購(gòu)買訂單(PurchaseOrder)上迭代不同,將首先在一組購(gòu)買訂單上迭代。對(duì)于每個(gè)購(gòu)買訂單,仍然將大致地做相同的事。主要差異是customer(客戶)欄現(xiàn)在將是“外部”迭代的函數(shù)。再一次,對(duì)于熟悉命令性代碼的人,迭代模型大致地為以命令性代碼簡(jiǎn)單添加一級(jí)額外的迭代的相同方法,XAD將同樣做出除了該一級(jí)額外的迭代之外,本示例中另一有趣說明是使用<sys:BindingName=“OrderDataContext”>實(shí)體來從外范圍引用一范圍變量。實(shí)際上,這樣一種機(jī)制僅在相對(duì)稀少的引用以下范圍變量情形中有用·在外范圍中,以及·具有與現(xiàn)有范圍或所包含范圍中的范圍變量相同的名字2.13參數(shù)繼承在創(chuàng)建導(dǎo)出標(biāo)簽定義時(shí),現(xiàn)有實(shí)體的參數(shù)可通過BaseTag屬性成為可用。例如......允許Xad作者能指定如下注意,Text和FontFamily通常不被調(diào)出為標(biāo)簽定義內(nèi)的Param值。這是因?yàn)檫@些參數(shù)在fwk:Text標(biāo)簽定義中指定,并且作為指定BaseName=“fwk:Text”的結(jié)果而被自動(dòng)往下傳遞至SimpleText標(biāo)簽定義。此外,在基本標(biāo)簽的標(biāo)簽定義內(nèi)定義的值被自動(dòng)地分配給SimpleText標(biāo)簽定義。例如,如果FontFamily被賦予Arial的默認(rèn)值,則該值被往下傳遞給SimpleText標(biāo)簽定義。實(shí)例對(duì)比定義——參數(shù)值優(yōu)先。當(dāng)定義一標(biāo)簽時(shí),對(duì)定義內(nèi)的屬性可靜態(tài)地提供值...如果這些未在標(biāo)簽實(shí)例中指定,則它們保持“現(xiàn)有狀態(tài)”,但是如果它們得到了指定,則實(shí)例值優(yōu)先。考慮以下......以具有字號(hào)為25的綠色字體的SimpleText為例。該標(biāo)簽實(shí)例中的FontSize值置換(優(yōu)先于)標(biāo)簽定義內(nèi)的FontSize=“50”的聲明。特定參數(shù)可被定義為“禁用”或不“可覆蓋”;考慮以下...對(duì)于實(shí)例......因?yàn)槎x將該參數(shù)定義為最小值為0且最大值也為0,所以定義標(biāo)簽實(shí)例中的FontFamlily將產(chǎn)生一檢查差錯(cuò)(不是警告)。注意,F(xiàn)ontFamlily參數(shù)仍然可在標(biāo)簽定義內(nèi)靜態(tài)地設(shè)置,如上所示。指定與最上層標(biāo)簽的類型不匹配的BaseTag值是非法的,例如......以上指定了用于其BaseTag參數(shù)的fwk:Border值,但將Text(類型為fwk:Text)定義為其最頂層標(biāo)簽。2.13.1限制參數(shù)僅可通過最頂層標(biāo)簽繼承,例如,如果寫出......對(duì)于實(shí)例......最頂層標(biāo)簽是Border(邊界),所以其全部參數(shù)都由新的BorderText標(biāo)簽自動(dòng)展示,并屬于該標(biāo)簽定義內(nèi)的Border標(biāo)簽。共享參數(shù)由最頂層標(biāo)簽耗用,例如......盡管Border和Text都具有Margin參數(shù),但在以上實(shí)例中設(shè)置Margin僅設(shè)置了Border的頁(yè)邊距而非Text的頁(yè)邊距。為了設(shè)置Text標(biāo)簽上的值,它們需要經(jīng)由Sys:Param語(yǔ)法展示并綁定于Text標(biāo)簽內(nèi),以下闡明了這一點(diǎn)......且標(biāo)簽的實(shí)例看起來如下最后,不支持多重繼承。例如,不能定義標(biāo)簽定義,然后將該標(biāo)簽定義用作另一標(biāo)簽定義的BaseTag。例如,以下是非法的2.14條件參數(shù)化盡管XAD是聲明性語(yǔ)言,但是它仍然足夠富有表現(xiàn)力以允許實(shí)體的條件構(gòu)造。兩種條件構(gòu)造方式是可能的SwitchEntity或SwitchEntities。這些方式的每一種都可通過Case(情形)或Condition(條件)標(biāo)簽(但不是兩者)來參數(shù)化。Case可被視為C#switch(切換)的當(dāng)然等效,而Condition與C#的一組if-else子句相似。Case和Condition的使用是互斥的,即Switch不能在其主體內(nèi)混合Case和Condition。此外,Case僅可在Switch指定其Data參數(shù)的值時(shí)使用,否則必須使用Condition。SwitchEntity、SwitchEntities、Case和Condition都存在于系統(tǒng)名字空間內(nèi)。根據(jù)規(guī)范,它們帶有前綴sys:名字空間,即sys:Case、sys:SwitchEntity等??紤]以下數(shù)據(jù)集作為示例...2.14.1CaseCase是兩個(gè)選項(xiàng)中較簡(jiǎn)單的一個(gè)。它們具有單個(gè)參數(shù)Value。Value的值必須求值成IString。在不用Data的值指定Switch的情況下使用Case導(dǎo)致設(shè)計(jì)時(shí)檢查差錯(cuò),考慮以下非法Xad......以下Xad示出Case的正確使用...2.14.2ConditionCondition向Xad作者提供對(duì)Switch結(jié)果的高級(jí)控制。Condition展示單個(gè)參數(shù)Test。Test的值是位置模板,表示它可以是任何有效的xQuery。Condition僅可在Switch不對(duì)其Data參數(shù)指定值時(shí)使用。將Condition與已指定Data值的Switch一起使用導(dǎo)致設(shè)計(jì)時(shí)檢查差錯(cuò),考慮以下非法Xad......以下Xad說明Condition的正確使用...2.14.3SwitchEntity使用SwitchEntity使得作者能有條件地返回作為對(duì)切換求值的結(jié)果的單個(gè)項(xiàng)??紤]允許顯示數(shù)據(jù)集中的每一項(xiàng)的以下Xad...所得到的視圖看起來會(huì)像現(xiàn)在考慮想要用紅色Georgia字體顯示500以上的價(jià)格并用綠色Arial字體顯示100以下的價(jià)格的情形。XAD現(xiàn)在看起來像...所得到的視圖將與以下的相似(“Toaster”被顯示為綠色粗體Arial,而“Receiver”被顯示為紅色粗體Georgia)2.14.4SwitchEntitiesSwitchEntities可被用來返回多個(gè)值。這可表示匹配多個(gè)Case或Condition,或使單個(gè)Condition返回多個(gè)值。除了由SwitchEntity展示的參數(shù)外,SwitchEntities展示一MatchFirst參數(shù)。默認(rèn)地MatchFirst為假,表示SwitchEntities匹配(即返回)所有匹配Case或Condition的值。在MatchFirst被設(shè)定為真的情形中,SwitchEntities僅返回首先匹配的Case或Condition的值??紤]以下指定MatchFirst等于假的Xad......取決于輸入文本框內(nèi)的值,該Xad將匹配一個(gè)或多個(gè)的Condition并適當(dāng)?shù)仫@示UI。然而,如果MatchFirst被設(shè)定為真,則僅求值為真的第一Condition將使其值返回。2.14.5概要在未設(shè)定范圍的上下文中使用‘Switch’當(dāng)在沒有代理的未設(shè)定范圍的上下文中(例如在Resources下)使用時(shí),sys:SwitchEntity必須對(duì)其Type(類型)參數(shù)指定一值,考慮以下......必須定義sys:Data的Type。無法在處于為設(shè)定范圍的上下文中的SwitchEntity標(biāo)簽上定義Type導(dǎo)致設(shè)計(jì)時(shí)檢查差錯(cuò)。嵌套‘Switch’SwitchEntity/ies可用以下方式嵌套......這應(yīng)當(dāng)被讀作,“如果$AppState=‘Blork’,則測(cè)試如果它顯示了值為$AppState/Foo的Text元素,注意是否有$AppState/Foo=‘Bar’”。沖突的嵌套附加參數(shù)考慮以下Xad......附加參數(shù)(用黃色高亮)沖突。最外部的參數(shù)(在sys:SwitchEntities標(biāo)簽上指定的)表明該切換的返回值應(yīng)當(dāng)停放于父DockPanel的頂部。相反,匹配內(nèi)部Case標(biāo)簽(用青色高亮)返回一Text元素,它指定該Text應(yīng)當(dāng)停放于父DockPanel的底部。這種沖突的結(jié)果如下·設(shè)計(jì)時(shí)檢查差錯(cuò),表明該Switch定義了一附加參數(shù),它遮蔽在可能返回值上指定的的附加參數(shù)·在運(yùn)行時(shí)最里面的定義“獲勝”。意思是,如果內(nèi)部Case匹配,則該Text將停放于DockPanel的底部·最后,為確保清晰起見,匹配如上可見的默認(rèn)情形將產(chǎn)生停放于父DockPanel頂部的Text元素,如Switch上的附加參數(shù)所指定的。2.14.6選擇器和標(biāo)簽定義在一些情形中,要求將選擇器或選擇器的集合抽象成一標(biāo)簽定義,從而使該選擇器能在各個(gè)區(qū)域中重復(fù)使用??紤]以下Xad......產(chǎn)生了以下應(yīng)用程序然而,以下模式是非法的...2.15關(guān)聯(lián)XAD允許任意實(shí)體與數(shù)據(jù)的關(guān)聯(lián)??紤]以下對(duì)一應(yīng)用程序的工作空間設(shè)置的建模的Xml語(yǔ)句注意,在此處的示例中不使用“LayoutScheme”和“ActiveDocumentIndex”——它們?cè)谀莾簝H僅是使該語(yǔ)句的結(jié)構(gòu)與通常在應(yīng)用程序中使用的模式相似。MDI應(yīng)用程序?qū)堰@樣的一個(gè)狀態(tài)傳遞給該應(yīng)用程序內(nèi)的各個(gè)子系統(tǒng)。這些子系統(tǒng)的示例將是·在單獨(dú)的MDI子窗口中顯示每一打開文檔的內(nèi)容的實(shí)際MDI工作空間·帶有所有打開文檔的縮略圖的側(cè)欄·帶有諸如“保存所有文檔”等命令的菜單這些“子系統(tǒng)”各自都將要求不僅對(duì)文檔列表操作,而且對(duì)與這些文檔相關(guān)聯(lián)的DataSources(數(shù)據(jù)源)操作。理想地,各個(gè)子系統(tǒng)將共享該同樣的DataSources(數(shù)據(jù)源)實(shí)例。實(shí)際上共享對(duì)于諸如相關(guān)視圖等情形是必需的。該共享可通過稱為關(guān)聯(lián)管理器(AssociationManager)的實(shí)體類來實(shí)現(xiàn)。關(guān)聯(lián)管理器是創(chuàng)建并管理與數(shù)據(jù)相關(guān)聯(lián)的多個(gè)實(shí)體的實(shí)體。例如,列表關(guān)聯(lián)管理器(ListAssociationManager)創(chuàng)建并管理列表中每一列表項(xiàng)的關(guān)聯(lián)該XAD表示以下含義·該列表關(guān)聯(lián)管理器正在管理<OpenDocument>列表的關(guān)聯(lián)?!?duì)于列表中的每個(gè)項(xiàng)(即每個(gè)<Document>),將創(chuàng)建文件數(shù)據(jù)源(FileDataSource)作為“相關(guān)聯(lián)實(shí)體”?!っ總€(gè)FileDataSources將使其File(文件)參數(shù)設(shè)定為相應(yīng)<Document>的Filename(文件名)。數(shù)據(jù)上下文(“.”)總是相應(yīng)的列表項(xiàng)(即<Document>)。·當(dāng)列表項(xiàng)(即每個(gè)<Document>)被添加到列表中或從中移除時(shí),相應(yīng)的關(guān)聯(lián)實(shí)體(即FileDataSources)被添加和移除。注意,實(shí)體的實(shí)際創(chuàng)建是按需完成的??蛻舳私?jīng)由<sys:AssociatedEntity>引用關(guān)聯(lián)該XAD表示以下含義·對(duì)于<OpenDocument>列表中的每個(gè)<Document>,??棵姘宥硷@示一輪廓視圖。(輪廓視圖是以輪廓格式顯示其Tree(樹)參數(shù)的假定的UI元素。)·每個(gè)輪廓視圖的Tree參數(shù)都是一關(guān)聯(lián)實(shí)體?!りP(guān)聯(lián)實(shí)體是與列表項(xiàng)(即每個(gè)<Document>)相關(guān)聯(lián)的FileDataSources。關(guān)聯(lián)管理器可被建模為動(dòng)態(tài)字典<sys:AssociatedEntity>可被視為代理關(guān)聯(lián)管理器中的值的實(shí)體;要代理的值由<sys:AssociatedEntity>的Data參數(shù)驅(qū)動(dòng)。注意,盡管在本示例中的關(guān)聯(lián)實(shí)體是DataSources(數(shù)據(jù)源),但關(guān)聯(lián)實(shí)體的類型可以是任意的,例如EventHandler(事件處理程序)。2.16標(biāo)簽文檔編制以縱覽形式,用以XAD標(biāo)簽文檔編制的XAF的方法是模仿C#用于受管API的引用文檔編制的方法引用注釋可被結(jié)合到XAD標(biāo)簽的.xad代碼中,且該注釋可由在概念和設(shè)計(jì)上與用于受管API參考文獻(xiàn)的MS內(nèi)部生成的工具相似的工具來提取和后處理。三個(gè)附加規(guī)范涵蓋XAD引用文檔編制·XAD標(biāo)簽文檔內(nèi)容和后處理情形·XAD標(biāo)簽文檔標(biāo)記和演示·XAD標(biāo)簽文檔生成工具這些規(guī)范的內(nèi)容基于其名稱應(yīng)當(dāng)容易區(qū)分。以下形式語(yǔ)言規(guī)范章節(jié)包括對(duì)控制引用文檔編制的結(jié)構(gòu)的引用文檔編制標(biāo)記標(biāo)簽的論述。對(duì)于所有文檔編制相關(guān)標(biāo)簽的完整細(xì)節(jié),參看前述的文檔標(biāo)記和演示規(guī)范。3.形式語(yǔ)言規(guī)范本節(jié)提供了用于前一節(jié)中較不形式地介紹的許多語(yǔ)言構(gòu)造的形式聲明?!罢Z(yǔ)言構(gòu)造”意味著在System名字空間中生存的標(biāo)簽(http://schemas.microsoft.com/2005/xad/system)。如上所述,XAD代碼被寫為形式良好的Xml。XAD文件的第一個(gè)標(biāo)簽要求是<sys:Xad>。文件通常(但不一定)具有.xad擴(kuò)展名。對(duì)該語(yǔ)言而言基礎(chǔ)的打包和部署構(gòu)造while僅在第5節(jié)中形式定義。XAD語(yǔ)言的局部XSD規(guī)范可在http://xafteam/xafenv/doc/Platform/Application%20Components/xad.xds獲得。該規(guī)范被認(rèn)為是“局部的”主要是因?yàn)閄SD沒有足夠的表達(dá)力來捕捉許多結(jié)構(gòu)上的約束。3.1布爾屬性XADSystem標(biāo)簽上的所有布爾屬性都是可選的。默認(rèn)值總是為假。這實(shí)際上意味著無需指定布爾屬性,除非其值必須為真。換言之,缺少屬性總是意味著其值為假,而存在則應(yīng)意味著其值為真。出于一致性和可讀性的原因,建議框架擴(kuò)展者在定義其自己的布爾參數(shù)時(shí)遵循這一約定。3.2限定名XAD是一種基于Xml的語(yǔ)言,且大量使用Xml限定名。限定名屬于特定名字空間以確保唯一性并避免沖突(參見http://www.w3.org/TR/REC-xml-names/以獲得更多細(xì)節(jié))。使用限定名的XAD語(yǔ)言構(gòu)造是·類型·標(biāo)簽定義·簽名·公有參數(shù)組對(duì)于給定的XAD應(yīng)用程序,以上列出的每一構(gòu)造存儲(chǔ)桶(bucket)內(nèi)的每一實(shí)例必須具有跨整個(gè)存儲(chǔ)桶唯一的限定名。例如,不能有具有相同名字的兩種類型或者具有相同名字的兩個(gè)簽名。然而,來自不同存儲(chǔ)桶的項(xiàng)可具有相同的名字。例如,標(biāo)簽和簽名可具有相同的名字,或者參數(shù)組和類型可具有相同的名字。3.3關(guān)鍵字3.3.1<Xad>3.3.2<Doc>示例3.3.3<Description>參見前一示例以了解對(duì)<description>標(biāo)簽的簡(jiǎn)單使用。參見XADTagsDocmarkupandpresentationspec以獲得對(duì)<description>標(biāo)簽的使用的更全面處理。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)置實(shí)體3.4.1<InlineData>3.4.2<Binding>3.4.3<XPath>3.4.4<Mapping>3.4.5<DynamicEntity>注意,當(dāng)指定Namespace時(shí),Tag的值必須是局部名,即,Tag的值不能是“scal:DatePicker”,相反,它必須是“DatePicker”。考慮以下Xad差錯(cuò)情況差錯(cuò)1檢查與DyanmicEntity相關(guān)聯(lián)的差錯(cuò)情形當(dāng)試圖加載動(dòng)態(tài)實(shí)體時(shí),發(fā)生一系列的檢查差錯(cuò),這些檢查差錯(cuò)被置入與該DynamicEntity相關(guān)聯(lián)的狀態(tài)板。3.4.6<AssociatedEntity>差錯(cuò)情況差錯(cuò)1無效關(guān)聯(lián)情形使用列表關(guān)聯(lián)管理器,作者傳入不解析到對(duì)該管理器關(guān)聯(lián)的數(shù)據(jù)節(jié)點(diǎn)。3.4.7<AssociatedDataEntities>3.4.8<SwitchEntity>3.4.9<SwitchEntities>3.4.10<Case>3.4.11<Condition>3.5實(shí)體構(gòu)建器實(shí)體構(gòu)建器是用于創(chuàng)建實(shí)體和/或?qū)ζ溥B線(wiring)的用戶定義的.NET類。實(shí)體構(gòu)建器用于實(shí)現(xiàn)原語(yǔ)XAD標(biāo)簽。XAD語(yǔ)言定義了用于對(duì)實(shí)體構(gòu)建器連線的要求,因?yàn)樗鼈兪荴AD運(yùn)行時(shí)間和該語(yǔ)言的自定義擴(kuò)展之間的交互點(diǎn)。取決于實(shí)體構(gòu)造和連線,有以下四種方法來實(shí)現(xiàn)定義新實(shí)體的原語(yǔ)標(biāo)簽N構(gòu)造連線要?jiǎng)?chuàng)建的類構(gòu)建器類描述1簡(jiǎn)單否是否創(chuàng)建實(shí)體如創(chuàng)建類的一個(gè)新實(shí)例那樣簡(jiǎn)單。構(gòu)造器不取XAD運(yùn)行時(shí)間不了解的任何參數(shù)。標(biāo)簽簽名不定義任何參數(shù),因此實(shí)體不要求對(duì)參數(shù)的任何連線。2簡(jiǎn)單是是是創(chuàng)建實(shí)體如創(chuàng)建類的一個(gè)新實(shí)例那樣簡(jiǎn)單。標(biāo)簽簽名指定傳入?yún)?shù),且因此實(shí)體要求被連線到它們。必須指定實(shí)體構(gòu)建器來實(shí)現(xiàn)連線。3復(fù)雜否否是實(shí)體構(gòu)造在某種程度上(使用工廠、傳遞構(gòu)造器參數(shù)等)是復(fù)雜的。必須指定實(shí)體構(gòu)建器來實(shí)現(xiàn)構(gòu)造。標(biāo)簽簽名不指定參數(shù),因此無需由構(gòu)建器實(shí)現(xiàn)任何連線。4復(fù)雜是否是實(shí)體構(gòu)造在某種程度上(使用工廠、傳遞構(gòu)造器參數(shù)等)是復(fù)雜的。標(biāo)簽簽名指定傳入?yún)?shù)。必須指定實(shí)體構(gòu)建器來實(shí)現(xiàn)實(shí)體的構(gòu)造和連線。注意在4種情況中的3種中,必須指定實(shí)體構(gòu)建器類。XAD定義了用于實(shí)體構(gòu)建器的兩個(gè)接口取決于實(shí)體構(gòu)造和連線,實(shí)體構(gòu)建器可實(shí)現(xiàn)這接口之一或兩者N構(gòu)造連線ICreateEntityIWireEntity1簡(jiǎn)單是否是2復(fù)雜否是否3復(fù)雜是是是對(duì)實(shí)體構(gòu)建器的要求·無狀態(tài)。不允許實(shí)體構(gòu)建器在對(duì)Create和/或Wire方法的兩次調(diào)用之間保持局部狀態(tài)。XAD運(yùn)行時(shí)間可出于效率原因創(chuàng)建實(shí)體構(gòu)建器的對(duì)象池。因此,對(duì)構(gòu)建器方法的調(diào)用的次序和數(shù)目沒有保證。·無播放時(shí)行為。實(shí)體構(gòu)建器可完成兩件事——?jiǎng)?chuàng)建實(shí)體和對(duì)實(shí)體連線。不允許其它任何事情。不允許實(shí)體構(gòu)建器使用它們創(chuàng)建或連線的實(shí)體的任何其它接口。以下示例示出了原語(yǔ)標(biāo)簽的標(biāo)簽定義以及相應(yīng)實(shí)體構(gòu)建器的實(shí)現(xiàn)此處是同一標(biāo)簽的簡(jiǎn)化版本的一個(gè)示例。由于實(shí)體無需訪問常量參數(shù)且沒有任何特殊的構(gòu)造器參數(shù),因此實(shí)體構(gòu)建器無需實(shí)現(xiàn)實(shí)體構(gòu)造,僅實(shí)現(xiàn)連線3.6動(dòng)作一般而言,動(dòng)作是實(shí)體,它實(shí)現(xiàn)實(shí)體類型“fwk:EventHandler”。命令可如任何其它實(shí)體一樣來實(shí)現(xiàn)——通過實(shí)現(xiàn)實(shí)體類并對(duì)標(biāo)簽定義連線。然而,動(dòng)作被識(shí)別為最常見的實(shí)體之一,且XAD支持實(shí)現(xiàn)替換它們的更簡(jiǎn)單方式。XAD允許將動(dòng)作實(shí)現(xiàn)為函數(shù)而不是實(shí)體。在后臺(tái),XAD運(yùn)行時(shí)間將XAD參數(shù)映射到C#參數(shù)并調(diào)用函數(shù)。用作命令實(shí)現(xiàn)的函數(shù)必須滿足以下要求·定義為實(shí)體類的方法。實(shí)體類提供對(duì)實(shí)體域服務(wù)的訪問。可在同一實(shí)體類上實(shí)現(xiàn)一個(gè)以上命令函數(shù)。然而,這僅僅是打包方便,且并不意味著動(dòng)作之間的任何交互?!o狀態(tài)。XAD運(yùn)行時(shí)間在運(yùn)行時(shí)決定如何管理命令實(shí)體的實(shí)例。例如,可能為每一次命令調(diào)用創(chuàng)建實(shí)體類的新實(shí)例。不允許動(dòng)作在一次調(diào)用到另一次之間保持狀態(tài)。它們需要了解的關(guān)于應(yīng)用程序的所有信息必須作為參數(shù)來傳遞?!o引用和傳出參數(shù)。作為函數(shù)實(shí)現(xiàn)的動(dòng)作不能具有輸出參數(shù)。XAD一般不支持引用參數(shù),因此命令函數(shù)也不能使用它們。動(dòng)作通過對(duì)作為傳入?yún)?shù)傳遞的可寫數(shù)據(jù)進(jìn)行連線來對(duì)應(yīng)用程序狀態(tài)做出改變。命令函數(shù)取實(shí)體作為參數(shù)。通常,參數(shù)是數(shù)據(jù)實(shí)體。XAD通過允許強(qiáng)類型化的訪問來便于對(duì)數(shù)據(jù)實(shí)體的訪問。除了使用類屬數(shù)據(jù)實(shí)體類型ICRange之外,命令作者具有使用強(qiáng)類型化的存取器作為參數(shù)類型的選項(xiàng)。注意,代替對(duì)文件名使用傳出或引用參數(shù),使用更新存取器。指定數(shù)據(jù)實(shí)體不支持的存取器是錯(cuò)誤的。除了命令函數(shù)之外,必須編寫對(duì)應(yīng)的標(biāo)簽定義。標(biāo)簽定義中的參數(shù)名必須完全匹配命令函數(shù)中的標(biāo)簽名。XAD運(yùn)行時(shí)間按照名字來匹配參數(shù),因此具有不匹配參數(shù)名是錯(cuò)誤的。參數(shù)次序無關(guān)緊要。允許可任選參數(shù)(Min="0")??扇芜x參數(shù)的默認(rèn)值可在標(biāo)簽定義中指定。如果沒有指定默認(rèn)值,則XAD運(yùn)行時(shí)間將傳遞空,且客戶端代碼必須準(zhǔn)備好處理它。定義沒有默認(rèn)值的值類型可任選參數(shù)是錯(cuò)誤的。允許設(shè)定參數(shù)(Max="unbounded")。設(shè)定參數(shù)必須在函數(shù)中被類型化為ICollection??稍趯硎褂妙悓伲瑏碛迷擁?xiàng)的類型專門研究該集合。4)自定義檢查器應(yīng)實(shí)現(xiàn)什么接口?5)如何處理參數(shù)名和附加參數(shù)名之間的沖突?6)是否希望支持動(dòng)態(tài)實(shí)例化實(shí)體上的傳出參數(shù)?7)是否要以某種方式使用類屬使得傳給Wire的實(shí)體是強(qiáng)類型化的?關(guān)于參數(shù)的值又如何?4.公共框架實(shí)體5.部署模型5.1XAD應(yīng)用程序XAD應(yīng)用程序由各種相關(guān)片斷構(gòu)成。XAD打包和部署模型定義了用于出于以下目的將這些片斷組合在一起并定義它們之間的關(guān)系的規(guī)則·標(biāo)識(shí)應(yīng)用程序的所有部分(應(yīng)用程序的成份)·驗(yàn)證應(yīng)用程序的完整性·在解釋和編譯兩種模式中運(yùn)行應(yīng)用程序·部署應(yīng)用程序·版本化XAD使用基于組合件的打包和部署模型,它遵循Microsoft部署策略(見Fusion,http://fusion以獲得其細(xì)節(jié))。Fusion處理如版本化、并排安裝、“DLLhell”、管理、策略等問題,因此它對(duì)于充分利用其部署模型和服務(wù)是有益的。各種應(yīng)用程序片斷被組合成更大的包,稱為組合件。組合件被組合以形成應(yīng)用程序每一XAD應(yīng)用程序具有一入口點(diǎn)—應(yīng)用程序處理從其開始的標(biāo)簽。對(duì)應(yīng)用程序入口點(diǎn)的要求為·標(biāo)簽必須在根組合件中定義?!?biāo)簽的局部名必須是Main。名字空間必須是http://schemas.microsoft.com/2005/xad/system·如果標(biāo)簽取參數(shù),則它們必須是簡(jiǎn)單數(shù)據(jù)類型(string、Integer、Boolean等),因此它們可從命令行被傳遞。5.2XAD組合件XAD組合件是最小部署單元。它是具有XAD語(yǔ)義的融合(fusion)組合件。XAD組合件由以下兩個(gè)部分構(gòu)成·部件清單(見5.3)·成份文件組合件成份文件(部件清單中列出)包含實(shí)際XAD代碼(標(biāo)簽定義、實(shí)體類型、簽名等)以及作為應(yīng)用程序的部分(數(shù)據(jù)方案、元數(shù)據(jù)、資源等)的任何其它信息。一旦將XAD或方案文件作為成份在部件清單中列出,其內(nèi)容變得對(duì)以下各項(xiàng)可用·組合件中的所有XAD文件·依賴XAD組合件中的所有XAD文件類型、簽名、參數(shù)組和標(biāo)簽定義可被定義為“內(nèi)部”,在這一情況下它們?cè)谄浣M合件外部是不可見的。XAD文件不引用其它XAD或方案文件。依賴性(使用來自其它文件的標(biāo)簽、類型等)在組合件級(jí)上而非文件級(jí)上處理。然而,XAD應(yīng)用程序中使用的其它語(yǔ)言可支持文件引用。例如,XSD支持包括和導(dǎo)出偽指令(directive)。包括或?qū)С龅奈募蛔詣?dòng)成為組合件的部分。它們必須明確地作為成份文件列出。8)關(guān)于知識(shí)產(chǎn)權(quán)(IP)保護(hù)應(yīng)做什么?編譯的組合件可能是答案。所有成份文件必須位于部件清單所處的同一文件夾或子文件夾中(支持子文件夾的任意深的嵌套級(jí)別)。對(duì)XAD組合件有以下兩種格式·非PE多文件組合件。PE代表“可移植可執(zhí)行”。這一格式在開發(fā)期間是方便的。沒有包含整個(gè)組合件的單個(gè)文件。成份文件在它們由XAD作者創(chuàng)建并保存在盤上時(shí)被使用。XAD運(yùn)行時(shí)間通過讀取部件清單來發(fā)現(xiàn)它們。對(duì)成份文件的任何改變?cè)诒4嫖募r(shí)立即反映在組合件上。不需要編譯步驟來使用XAD應(yīng)用程序中的組合件?!?NET組合件這是XAD組合件的編譯形式,對(duì)部署是方便的。編譯提供了更好的性能。XAD組合件以二進(jìn)制格式儲(chǔ)存,并且可以用強(qiáng)名來簽署,因此它可如其它.NET組合件一樣在GAC(全局組合件高速緩存)中部署。它是必需的,于是編譯的XAD組合件,出于差錯(cuò)處理和生成有意義Watson轉(zhuǎn)儲(chǔ)的原因,將允許將差錯(cuò)糾正回原始的XAD源。5.3組合件部件清單XAD組合件部件清單是Fusion部件清單,并且可由Fusion來耗用。它完整地描述了XAD組合件。部件清單是具有“.manifest”擴(kuò)展名的Xml文件。最新的Fusion部件清單方案可在http://teamweb/manifest/Shared%20Documents/Latest%20Man上找到。部件清單可使用文本編輯器來手動(dòng)創(chuàng)建,或通過開發(fā)工具來創(chuàng)建。在開發(fā)時(shí),部件清單扮演了配置文件的角色——它記錄了組合件的所有部分及其依賴性。在運(yùn)行時(shí),部件清單扮演了XAD運(yùn)行時(shí)間用于找出并加載應(yīng)用程序的所有部分的目錄的角色。XAD運(yùn)行時(shí)間不理解整個(gè)Fusion部件清單方案——它識(shí)別其某些部分并忽略其余部分。XAD識(shí)別的部件清單部分有·組合件身份·描述·對(duì)其它組合件的依賴性·成份文件列表Fusion部件清單方案目標(biāo)名字空間是“urn:schemas-microsoft-com:asm.v2”。該方案是可擴(kuò)展的——可添加來自其它名字空間的元素和屬性。XAD僅添加幾個(gè)屬性作為http://schemas.microsoft.com/2005/xad/assembly名字空間中定義的擴(kuò)展。XAD不用元素來擴(kuò)展部件清單方案。以下參考描述了XAD識(shí)別的Fusion部件清單Xml元素和屬性以及XAD添加的屬性。5.3.1部件清單標(biāo)簽9)“culture”屬性的用途是什么?在.NET中它僅供衛(wèi)星組合件使用。如何處理局部化資源?10)類型屬性的當(dāng)前用途的問題-被歸檔為“用于后向兼容性”并且可在將來移除-沒有方法來全局地保留值“xad”-類型僅在依賴項(xiàng)上指定時(shí)才有意義是否應(yīng)改為在dependentAssembly元素上定義自己的擴(kuò)展屬性?11)行為映射文件的將來是什么?5.3.2示例部件清單該示例部件清單描述了帶有名字“Demo”和版本“1.0.0.0”的組合件。“Demo”組合件依賴于以下兩個(gè)其它組合件·“Microsoft.XAF.XAD.Framework”——XAD組合件(type="xad")·“DemoEntityBuilders"——.NET組合件(未指定類型)“Demo”組合件具有以下兩個(gè)成份文件·DemoTags.xad—XAD文件,最終可包含標(biāo)簽定義、簽名、實(shí)體類型和公有參數(shù)組。·DemoDataSchema.xsd—方案文件5.4組合件依賴性通過建立對(duì)另一組合件的依賴性,XAD組合件可使用其非內(nèi)部的·實(shí)體類型·簽名·標(biāo)簽定義·參數(shù)組·方案對(duì)另一XAD組合件的依賴性是通過在部件清單中包括其在依賴性組合件列表中的身份并指定屬性type="xad"來建立的。無需指定文件或路徑信息。組合件身份在運(yùn)行時(shí)解析且將加載對(duì)應(yīng)的組合件(見“組合件綁定、加載和卸載”)。XAD組合件也可依賴于.NET組合件。對(duì).NET組合件的依賴性以與對(duì)XAD組合件的依賴性完全相同的方式來建立,除了不指定type屬性或該屬性具有不同值之外。對(duì).NET組合件的依賴性必須在每次在以下各項(xiàng)中由XAD組合件引用.NET類型時(shí)建立·實(shí)體類型定義·原語(yǔ)標(biāo)簽定義中的實(shí)體引用·原語(yǔ)標(biāo)簽定義中的實(shí)體構(gòu)建器引用·原語(yǔ)標(biāo)簽定義中的命令類引用·元數(shù)據(jù)此處是應(yīng)用于XAD組合件依賴性的規(guī)則·一個(gè)組合件可以依賴于多個(gè)組合件(A可依賴于B、C、D等)·多個(gè)組合件可以依賴于同一組合件(B、C、D等可依賴于A)·組合件依賴性是非傳遞的(如果A依賴于B且B依賴于C,則A不依賴于C。如有必要,A必須明確地引用C。)·不支持循環(huán)依賴性(如果A依賴于B且B依賴于C,則C不能依賴于A)5.5組合件綁定、加載和卸載綁定是將組合件身份解析到其物理位置的過程。組合件身份不包含如路徑和文件的位置信息。Fusion定義了.NET運(yùn)行時(shí)間使用的組合件綁定算法。XAD長(zhǎng)期將使用該綁定算法作為由Fusion提供的服務(wù)。在短期它實(shí)現(xiàn)其子算法(Childrenet)。要求所有的非強(qiáng)命名組合件(沒有公鑰標(biāo)記)必須在應(yīng)用程序文件夾下存在。應(yīng)用程序文件夾是包含根/主組合件的部件清單的文件夾。給定組合件身份,XAD運(yùn)行時(shí)間使用以下算法找出組合件1.如果組合件類型不是“XAD”,則假定它是.NET組合件并將加載委托給.NET框架。2.對(duì)XAD組合件,檢查應(yīng)用程序文件夾中具有組合件名稱的部件清單文件并加載它。3.如果未找到,則檢查應(yīng)用程序文件夾中具有組合件名稱的子文件夾。如果找到,則檢查具有組合件名稱的部件清單文件并加載它。4.如果未找到且這是調(diào)試構(gòu)建,則對(duì)環(huán)境變量XADPATH中指定的每一文件夾重復(fù)步驟2和3。這僅是開發(fā)時(shí)的工具。XADPATH中的路徑用分號(hào)隔開。一旦找到,由XAD運(yùn)行時(shí)間加載組合件及其所有依賴項(xiàng)。該過程是遞歸的——它對(duì)依賴項(xiàng)重復(fù)。使每一依賴項(xiàng)的內(nèi)容對(duì)依賴組合件可用。重要的是注意,不使組合件的內(nèi)容對(duì)所有組合件全局可用,僅對(duì)其直接依賴項(xiàng)可用。方案是這一規(guī)則的例外。在加載具有方案成份文件的組合件時(shí),加載方案并將其添加到全局方案集合,從而使得它們對(duì)所有組合件可用。然而,這是對(duì)當(dāng)前實(shí)現(xiàn)的限制且不應(yīng)被認(rèn)為是要求。它最可能在將來改變。有兩種方法來加載組合件通過另一組合件部件清單中的靜態(tài)依賴性。在程序設(shè)計(jì)上。通過LoadAssemblyCommand。通過低級(jí)公有API。從根組合件(應(yīng)用程序組合件)開始并到達(dá)其依賴項(xiàng)、其依賴項(xiàng)的依賴項(xiàng)等等,形成靜態(tài)依賴組合件的任意深的圖。XAD運(yùn)行時(shí)間在應(yīng)用程序啟動(dòng)時(shí)加載所有這些組合件。開發(fā)者也可加載不被指定為靜態(tài)依賴項(xiàng)的組合件。編程上加載的組合件的特征作為目標(biāo)的主情形是對(duì)插件(見插件模型以獲得更多細(xì)節(jié))的支持。應(yīng)用程序組合件(根)以及所有編程上加載的組合件形成了一組頂層組合件。僅頂層組合件對(duì)應(yīng)用程序元數(shù)據(jù)有貢獻(xiàn)。僅具有根組合件的例外的頂層組合件可在編程上卸載。如果組合件沒有作為靜態(tài)依賴項(xiàng)來加載,則即使它稍后也作為頂層組合件在編程上加載,它也不能被卸載。卸載這一組合件僅導(dǎo)致將其從頂層組合件中移除但不從靜態(tài)加載的組合件中移除。5.6打包情形5.6.1單文件應(yīng)用程序“Helloworld”是簡(jiǎn)單的單文件應(yīng)用程序的一個(gè)示例。單文件應(yīng)用程序具有單個(gè)XAD文件,它包含運(yùn)行該應(yīng)用程序所需的所有信息。最起碼該文件必須包含主標(biāo)簽的標(biāo)簽定義——應(yīng)用程序入口點(diǎn)。無需創(chuàng)建組合件或組合件部件清單。對(duì)單文件應(yīng)用程序的要求是·僅依賴于標(biāo)準(zhǔn)框架。標(biāo)準(zhǔn)框架默認(rèn)可用,且無需在組合件部件清單中指定為依賴項(xiàng)。如果應(yīng)用程序僅使用來自標(biāo)準(zhǔn)框架的標(biāo)簽、類型和簽名,則它無需在其部件清單中指定任何依賴性(部件清單中沒有依賴性部分)?!ぴ趩蝹€(gè)文件中具有所有標(biāo)簽。如果僅有一個(gè)文件,則應(yīng)用程序不要求部件清單文件的成份文件部分。一旦有多于一個(gè)文件,則無論其類型如何,應(yīng)用程序都要求部件清單來描述成份文件。如果滿足這些要求,則應(yīng)用程序完全不要求組合件部件清單,因?yàn)樗兄匾糠侄紴榭?。它是單文件?yīng)用程序。5.6.2導(dǎo)出標(biāo)簽的庫(kù)XAD允許XAD作者通過定義其自己的標(biāo)簽來擴(kuò)展語(yǔ)言。最簡(jiǎn)單的方式是定義導(dǎo)出標(biāo)簽,因?yàn)樗鼈兪怯蒟AD實(shí)現(xiàn)的且不需要低級(jí)編程技術(shù)。XAD作者最終將提出一組可重復(fù)使用的自定義標(biāo)簽并且希望跨多個(gè)組合件和應(yīng)用程序來共享它們。這可通過在分開的組合件中打包標(biāo)簽來完成,該分開的組合件然后可由其它組合件引用。在以下示例中,有兩個(gè)可重復(fù)使用的導(dǎo)出標(biāo)簽,它們?cè)贛yTags.xad文件中定義并在MyLibrary組合件中打包。MyLibrary組合件由MyApplication組合件引用,后者使用由該庫(kù)提供的標(biāo)簽。以下是它如何工作的·MyTags.xad文件定義兩個(gè)標(biāo)簽—TextWithLabel和Hyperlink?!yTags.xad文件作為成份文件在MyLibrary部件清單中列出。這使得文件中的所有標(biāo)簽對(duì)MyLibrary組合件客戶端可用?!yApplication組合件引用MyLibrary組合件,并且因此能夠訪問MyLibrary中定義的所有標(biāo)簽。·MyApplication文件使用MyLibrary組合件中定義的Hyperlink標(biāo)簽。5.6.3原語(yǔ)標(biāo)簽的庫(kù)XAD可通過定義自定義原語(yǔ)或?qū)С鰳?biāo)簽來擴(kuò)展。盡管導(dǎo)出標(biāo)簽更易于定義,因?yàn)樗鼈兪鞘褂肵AD來實(shí)現(xiàn)的,但原語(yǔ)標(biāo)簽可提供更豐富的功能,因?yàn)樗鼈兪鞘褂萌鏥B和C#的低級(jí)編程語(yǔ)言來實(shí)現(xiàn)的。這些語(yǔ)言提供了對(duì)OS和機(jī)器資源的完全訪問。組件、工具和平臺(tái)開發(fā)者可定義原語(yǔ)標(biāo)簽,該標(biāo)簽可由XAD作者在多個(gè)XAD應(yīng)用程序中重復(fù)使用。打包原語(yǔ)標(biāo)簽幾乎與打包導(dǎo)出標(biāo)簽(見以上示例)相同。有以下兩個(gè)主要的不同·標(biāo)簽定義包含對(duì)實(shí)體構(gòu)建器類而非XAD主體的引用·包含原語(yǔ)標(biāo)簽的組合件的部件清單必須指定對(duì)包含實(shí)體構(gòu)建器的.NET組合件的附加依賴性實(shí)體構(gòu)建器是.NET組件,該組件知道如何創(chuàng)建對(duì)應(yīng)于原語(yǔ)標(biāo)簽的實(shí)體并對(duì)其連線(參見語(yǔ)言概念以獲得關(guān)于實(shí)體構(gòu)建器的更多細(xì)節(jié))。以下示例將Hyperlink實(shí)現(xiàn)為原語(yǔ)標(biāo)簽客戶端代碼與使用Hyperlink作為導(dǎo)出標(biāo)簽的代碼相同??蛻舳私M合件既不展現(xiàn)給來自其它組合件來的標(biāo)簽的實(shí)現(xiàn)細(xì)節(jié)也不展現(xiàn)給其依賴項(xiàng)。6.插件模型6.1插件是什么?插件(也稱為內(nèi)插附件或插入件)是自含式軟件包,它擴(kuò)展了給定軟件應(yīng)用程序的基本特征集而無需升級(jí)應(yīng)用程序。插件允許在新特征或第三方擴(kuò)展變得可用時(shí)遞增地添加它們而無需等待并經(jīng)歷昂貴的升級(jí)循環(huán)。為使插件體系結(jié)構(gòu)工作有四個(gè)重要的要求·必須定義并公布可擴(kuò)展性協(xié)議·擴(kuò)展的應(yīng)用程序必須正確地實(shí)現(xiàn)可擴(kuò)展性協(xié)議·插件必須正確地實(shí)現(xiàn)可擴(kuò)展性協(xié)議·應(yīng)用程序必須支持插件的發(fā)現(xiàn)和加載6.2XAD插件模型XAD插件模型基于以下關(guān)鍵概念·組合件的動(dòng)態(tài)加載·元數(shù)據(jù)驅(qū)動(dòng)的可擴(kuò)展性協(xié)議·動(dòng)態(tài)實(shí)體實(shí)例化6.2.1組合件的動(dòng)態(tài)加載插件在組合件中打包。這并不是令人驚奇的,因?yàn)閄AD應(yīng)用程序的所有部分都在組合件中打包。通常組合件通過組合件部件清單中指定的靜態(tài)依賴項(xiàng)來加載(參見組合件依賴性)。XAD運(yùn)行時(shí)間自動(dòng)加載所有的靜態(tài)依賴項(xiàng)。在這一情況下,組合件不作為靜態(tài)依賴項(xiàng)在任何部件清單中列出。相反,應(yīng)用程序可使用系統(tǒng)定義的命令<loadAssembly>,通過指定其部件清單路徑來加載組合件。路徑僅是數(shù)據(jù)片斷,并且可從用戶輸入、應(yīng)用程序狀態(tài)、配置文件等中獲得。一旦加載了組合件,更新元數(shù)據(jù)且其實(shí)體變得可用于動(dòng)態(tài)實(shí)例化。6.2.2元數(shù)據(jù)驅(qū)動(dòng)的可擴(kuò)展性協(xié)議可擴(kuò)展XAD應(yīng)用程序在單獨(dú)的組合件中定義其可擴(kuò)展性協(xié)議,因此它可由應(yīng)用程序和編寫擴(kuò)展的第三方兩者來公布和引用。可擴(kuò)展性協(xié)議具有以下兩個(gè)部分·元數(shù)據(jù)方案術(shù)語(yǔ)“元數(shù)據(jù)”一般指的是“關(guān)于數(shù)據(jù)的數(shù)據(jù)”。在本說明書的上下文中,元數(shù)據(jù)用作由插件實(shí)現(xiàn)的對(duì)特征的描述。元數(shù)據(jù)可包括標(biāo)簽名、要傳遞的參數(shù)、用于UI的人們可讀文本等??蓴U(kuò)展應(yīng)用程序定義了元數(shù)據(jù)方案(從插件中所期望的)。插件提供內(nèi)容?!?biāo)簽簽名插件通過定義XAD標(biāo)簽實(shí)現(xiàn)其特征。應(yīng)用程序使用這些標(biāo)簽來訪問插件特征。應(yīng)用程序定義標(biāo)簽簽名(插件應(yīng)導(dǎo)致什么實(shí)體類型以及它們?nèi)∈裁磪?shù)),而插件提供標(biāo)簽定義(標(biāo)簽名和實(shí)際實(shí)現(xiàn))。簽名可與接口相比,而標(biāo)簽定義可與接口實(shí)現(xiàn)相比。XAD支持可通過系統(tǒng)定義的標(biāo)簽<Matadata>來訪問的全局元數(shù)據(jù)樹。元數(shù)據(jù)樹是來自所有動(dòng)態(tài)加載的組合件的所有元數(shù)據(jù)成份文件的并集(參見文件類型以獲得關(guān)于成份的細(xì)節(jié))。在運(yùn)行時(shí),每次當(dāng)加載或卸載具有元數(shù)據(jù)成份文件的組合件時(shí)自動(dòng)更新元數(shù)據(jù)樹。發(fā)送適當(dāng)?shù)母淖兺ㄖ虼藨?yīng)用程序可動(dòng)態(tài)地更新其自身。使用元數(shù)據(jù)樹,應(yīng)用程序可發(fā)現(xiàn)加載了什么插件并使用它們提供的特征。6.2.3動(dòng)態(tài)實(shí)體實(shí)例化通常,XAD作者直接用XAD代碼編寫XAD標(biāo)簽。通過使用XAD標(biāo)簽,作者靜態(tài)地聲明了要由XAD運(yùn)行時(shí)間創(chuàng)建什么實(shí)體。插件定義了用于訪問它們實(shí)現(xiàn)的特征的標(biāo)簽。由于插件在編寫應(yīng)用程序時(shí)是不可用的,因此XAD作者不可能知道并使用由插件定義的標(biāo)簽。作者僅知道并靜態(tài)地定義標(biāo)簽簽名。實(shí)際標(biāo)簽名和最終的參數(shù)值由插件通過元數(shù)據(jù)來提供。應(yīng)用程序完全知道元數(shù)據(jù)方案是什么,因?yàn)樗菓?yīng)用程序定義的可擴(kuò)展性協(xié)議的部分。它讀取元數(shù)據(jù)并按照標(biāo)簽名動(dòng)態(tài)地實(shí)例化實(shí)體。XAD支持用于按標(biāo)簽名來進(jìn)行動(dòng)態(tài)實(shí)體實(shí)例化的系統(tǒng)定義的標(biāo)簽<DynamicEntity>。僅具有代理的類型的實(shí)體可被動(dòng)態(tài)實(shí)例化。實(shí)體僅在它們?cè)谝韵赂黜?xiàng)中定義時(shí)才能被動(dòng)態(tài)實(shí)例化·動(dòng)態(tài)加載的組合件·組合件的靜態(tài)依賴性組合件,使用DynamicEntity標(biāo)簽6.3插件情形以下情形描述了可通過插件擴(kuò)展以支持新文件類型的文件應(yīng)用程序。該應(yīng)用程序的思路是它可打開和顯示任何類型的文件,只要它具有支持該文件類型的插件。該示例具有3個(gè)部分·FileExtensionProtocol組合件定義文件應(yīng)用程序的擴(kuò)展協(xié)議。該擴(kuò)展協(xié)議由用于各個(gè)文件標(biāo)簽的元數(shù)據(jù)方案和簽名構(gòu)成。它在單獨(dú)的組合件中定義,因此應(yīng)用程序和各種插件都可引用它?!ile組合件用于文件應(yīng)用程序代碼的組合件。·SmartFilesAddIn組合件。由設(shè)想的公司Smarts.com提供的插件組合件。6.3.1FileExtensionProtocol組合件6.3.2File組合件6.3.3SmartFilesAddIn組合件7.附錄A代碼編寫約定以下是建議的XAD代碼編寫約定的列表。標(biāo)準(zhǔn)XAD框架遵循所有這些約定。第三方可以選擇采用這些約定中的部分或全部。這些約定由XADCop來強(qiáng)制。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”實(shí)體標(biāo)簽的名字必須不以“s”結(jié)束17)$待完成7.6選擇器標(biāo)簽的名字必須以“Selector”結(jié)束18)$待完成7.7Param(如果指定)必須是實(shí)體的第一個(gè)屬性19)$待完成7.8Name(如果指定)必須是實(shí)體的Param(如果指定)之后的第一個(gè)屬性20)$待完成權(quán)利要求1.一種其上儲(chǔ)存有計(jì)算機(jī)可執(zhí)行指令的計(jì)算機(jī)可讀介質(zhì),所述指令在由計(jì)算機(jī)執(zhí)行時(shí)實(shí)現(xiàn)一種配置軟件應(yīng)用程序以實(shí)現(xiàn)所述軟件應(yīng)用程序的一個(gè)或多個(gè)功能的方法,包括提供多個(gè)應(yīng)用程序組件;基于由所述應(yīng)用程序接收的一個(gè)或多個(gè)數(shù)據(jù)事件確定連接組件圖的結(jié)構(gòu)以及所述多個(gè)組件中的哪些連接到所述多個(gè)組件中的其它組件以形成所述連接組件將所述多個(gè)應(yīng)用程序組件的一部分配置為所述連接組件圖以提供所述應(yīng)用程序的第一功能;響應(yīng)于由所述多個(gè)組件之一接收數(shù)據(jù)事件,由所述多個(gè)組件中的一個(gè)或多個(gè)其它組件調(diào)用一處理;以及響應(yīng)于由所述多個(gè)組件中的一個(gè)或多個(gè)其它組件調(diào)用一處理,重新配置所述連接組件圖以執(zhí)行所述應(yīng)用程序的第二功能。2.如權(quán)利要求1所述的計(jì)算機(jī)可讀介質(zhì),其特征在于,將所述多個(gè)應(yīng)用程序組件的所述部分配置為所述連接組件圖還包括由應(yīng)用程序描述引擎將所述多個(gè)組件中的每一個(gè)經(jīng)由一公共接口連接到所述多個(gè)組件中的一個(gè)或多個(gè)其它組件,以允許經(jīng)由所述公共接口在不同類型的組件之間傳遞數(shù)據(jù);以及由所述應(yīng)用程序描述引擎實(shí)例化所述連接組件圖,包括所述連接組件圖中的連接組件之間的任何連接,使得所述連接組件圖在被執(zhí)行時(shí)實(shí)現(xiàn)所述應(yīng)用程序的第一功能。3.如權(quán)利要求1所述的計(jì)算機(jī)可讀介質(zhì),其特征在于基于由所述應(yīng)用程序接收到的一個(gè)或多個(gè)數(shù)據(jù)事件確定連接組件圖的結(jié)構(gòu)以及所述多個(gè)組件中的哪些連接到所述多個(gè)組件中的其它組件以形成所述連接組件圖包括確定所述多個(gè)組件中的哪些應(yīng)被組合在一起作為所述連接組件圖中的連接組件單元,其中所述連接組件單元是響應(yīng)于由所述應(yīng)用程序接收的一個(gè)或多個(gè)數(shù)據(jù)事件實(shí)現(xiàn)所述應(yīng)用程序的功能所需的;以及將所述多個(gè)應(yīng)用程序組件的所述部分配置為所述連接組件圖以提供所述應(yīng)用程序的第一功能包括將應(yīng)被組合在一起的所述多個(gè)組件配置為連接組件單元,作為用于響應(yīng)于由所述應(yīng)用程序接收的一個(gè)或多個(gè)數(shù)據(jù)事件實(shí)現(xiàn)所述應(yīng)用程序的功能的組件域。4.如權(quán)利要求1所述的計(jì)算機(jī)可讀介質(zhì),其特征在于由所述多個(gè)組件中的一個(gè)或多個(gè)其它組件調(diào)用一處理包括在第一處理階段中讀取與負(fù)責(zé)調(diào)用所述處理的數(shù)據(jù)事件相關(guān)聯(lián)的數(shù)據(jù),并請(qǐng)求表示所述連接組件圖的任何所要求的重新配置的任何數(shù)據(jù);以及在第二處理階段中重新配置所述連接組件圖以實(shí)現(xiàn)所述應(yīng)用程序的第二功能。5.如權(quán)利要求3所述的計(jì)算機(jī)可讀介質(zhì),其特征在于,還包括由所述多個(gè)組件中的一個(gè)或多個(gè)其它組件調(diào)用一處理包括由與所述數(shù)據(jù)事件相關(guān)聯(lián)的組件域調(diào)用一處理;在所述組件域中的第一處理階段中,讀取與負(fù)責(zé)調(diào)用所述處理的數(shù)據(jù)事件相關(guān)聯(lián)的數(shù)據(jù),并請(qǐng)求表示所述組件域的任何要求的重新配置的任何數(shù)據(jù);以及在所述組件域中的第二處理階段中,重新配置所述組件域以實(shí)現(xiàn)所述應(yīng)用程序的第二功能。6.如權(quán)利要求3所述的計(jì)算機(jī)可讀介質(zhì),其特征在于,被配置在一起作為用于響應(yīng)于由所述應(yīng)用程序接收的一個(gè)或多個(gè)數(shù)據(jù)事件而實(shí)現(xiàn)所述應(yīng)用程序的功能的組件域的所述組件,用作為應(yīng)用程序執(zhí)行的一個(gè)單元,該單元用于從配置所述組件域的時(shí)刻橫跨到響應(yīng)于要求所述組件域重新配置的數(shù)據(jù)事件而重新配置所述組件域的時(shí)刻的生存期。7.如權(quán)利要求2所述的計(jì)算機(jī)可讀介質(zhì),其特征在于由所述應(yīng)用程序描述引擎實(shí)例化所述連接組件圖包括由可用于從所述應(yīng)用程序接收描述所述第一功能的一個(gè)或多個(gè)應(yīng)用程序描述的應(yīng)用程序描述引擎來實(shí)例化所述連接組件圖,并且還包括由所述應(yīng)用程序描述引擎解釋所述一個(gè)或多個(gè)應(yīng)用程序描述,以確定所述多個(gè)組件中的哪些應(yīng)被連接以形成所述連接組件圖。8.如權(quán)利要求7所述的計(jì)算機(jī)可讀介質(zhì),其特征在于,還包括經(jīng)由所述應(yīng)用程序描述接收用于組合并結(jié)構(gòu)化所述連接組件圖的一個(gè)或多個(gè)聲明性規(guī)則,其中所述應(yīng)用程序描述引擎還用于根據(jù)經(jīng)由所述應(yīng)用程序描述接收到的所述聲明性規(guī)則來實(shí)例化所述連接組件圖。9.如權(quán)利要求7所述的計(jì)算機(jī)可讀介質(zhì),其特征在于,由可用于從所述應(yīng)用程序接收描述所述第一功能的一個(gè)或多個(gè)應(yīng)用程序描述的應(yīng)用程序描述引擎實(shí)例化所述連接組件圖包括由可用于從所述應(yīng)用程序接收根據(jù)描述所述第一功能的可擴(kuò)展標(biāo)記語(yǔ)言結(jié)構(gòu)化的一個(gè)或多個(gè)應(yīng)用程序描述的應(yīng)用程序描述引擎來實(shí)例化所述連接組件圖;并且其中所述應(yīng)用程序描述引擎還用于根據(jù)所述可擴(kuò)展標(biāo)記語(yǔ)言結(jié)構(gòu)化數(shù)據(jù)以傳遞給所述多個(gè)組件中的一個(gè)或多個(gè)。10.如權(quán)利要求2所述的計(jì)算機(jī)可讀介質(zhì),其特征在于在由所述應(yīng)用程序描述引擎實(shí)例化所述連接組件圖之前,從包含所述多個(gè)組件的組件庫(kù)中檢索所述多個(gè)組件中構(gòu)成所述連接組件圖的部分。11.如權(quán)利要求10所述的計(jì)算機(jī)可讀介質(zhì),其特征在于,從包含所述多個(gè)組件的組件庫(kù)中檢索所述多個(gè)組件中構(gòu)成所述連接組件圖的部分包括從由用戶界面連接器、動(dòng)作組件、數(shù)據(jù)連接器、存取器組件、變換器組件以及接口組件構(gòu)成的組件庫(kù)中檢索所述多個(gè)組件的部分。12.如權(quán)利要求10所述的計(jì)算機(jī)可讀介質(zhì),其特征在于,從包含所述多個(gè)組件的組件庫(kù)中檢索所述多個(gè)組件中構(gòu)成所述連接組件圖的部分包括檢索至少一個(gè)用戶界面(UI)連接器,所述用戶界面連接器接收一個(gè)或多個(gè)UI事件并將所述一個(gè)或多個(gè)UI事件轉(zhuǎn)換成所述數(shù)據(jù)事件,并且接收對(duì)應(yīng)于任何改變的數(shù)據(jù)的標(biāo)準(zhǔn)格式數(shù)據(jù)表示并與UI連接以將所述任何改變的數(shù)據(jù)提供給所述UI。13.如權(quán)利要求12所述的計(jì)算機(jī)可讀介質(zhì),其特征在于,從包含所述多個(gè)組件的組件庫(kù)中檢索所述多個(gè)組件中構(gòu)成所述連接組件圖的部分包括檢索連接到UI連接器的至少一個(gè)動(dòng)作組件,所述動(dòng)作組件接收所述數(shù)據(jù)事件并將其變換成標(biāo)準(zhǔn)格式動(dòng)作。14.如權(quán)利要求13所述的計(jì)算機(jī)可讀介質(zhì),其特征在于,從包含所述多個(gè)組件的組件庫(kù)中檢索所述多個(gè)組件中構(gòu)成所述連接組件圖的部分包括檢索同時(shí)連接到所述動(dòng)作組件和所述UI組件的至少一個(gè)數(shù)據(jù)連接器,所述數(shù)據(jù)連接器接收標(biāo)準(zhǔn)格式動(dòng)作并連接到數(shù)據(jù)存儲(chǔ)以完成在所述數(shù)據(jù)上的標(biāo)準(zhǔn)格式動(dòng)作,并將所述標(biāo)準(zhǔn)格式數(shù)據(jù)表示發(fā)送給所述UI連接器。15.如權(quán)利要求14所述的計(jì)算機(jī)可讀介質(zhì),其特征在于,從包含所述多個(gè)組件的組件庫(kù)中檢索所述多個(gè)組件中構(gòu)成所述連接組件圖的部分包括檢索將所述標(biāo)準(zhǔn)格式數(shù)據(jù)表示處理成UI定制格式的至少一個(gè)變換器。16.如權(quán)利要求15所述的計(jì)算機(jī)可讀介質(zhì),其特征在于,從包含所述多個(gè)組件的組件庫(kù)中檢索所述多個(gè)組件中構(gòu)成所述連接組件圖的部分包括檢索將所述標(biāo)準(zhǔn)格式動(dòng)作處理成標(biāo)準(zhǔn)格式數(shù)據(jù)定制動(dòng)作的至少一個(gè)存取器組件。17.如權(quán)利要求10所述的計(jì)算機(jī)可讀介質(zhì),其特征在于,從包含所述多個(gè)組件的組件庫(kù)中檢索所述多個(gè)組件中構(gòu)成所述連接組件圖的部分包括檢索實(shí)現(xiàn)兩個(gè)或多個(gè)其它組件之間的接口以允許所述兩個(gè)或多個(gè)其它組件之間的通信的第三方組件。18.如權(quán)利要求17所述的計(jì)算機(jī)可讀介質(zhì),其特征在于,還包括實(shí)現(xiàn)兩個(gè)或多個(gè)其它組件之間的接口以允許所述兩個(gè)或多個(gè)其它組件之間的通信,包括根據(jù)用于實(shí)現(xiàn)由所述第三方組件提供給所述應(yīng)用程序描述引擎的接口的一個(gè)或多個(gè)聲明性規(guī)則來實(shí)現(xiàn)所述接口。19.一種配置軟件應(yīng)用程序以實(shí)現(xiàn)所述軟件應(yīng)用程序的一個(gè)或多個(gè)功能的方法,包括提供多個(gè)應(yīng)用程序組件;由應(yīng)用程序描述引擎將所述多個(gè)組件中的每一個(gè)經(jīng)由一公共接口連接到所述多個(gè)組件中的一個(gè)或多個(gè)其它組件,以允許經(jīng)由所述公共接口在不同類型的組件之間傳遞數(shù)據(jù);以及由所述應(yīng)用程序描述引擎實(shí)例化由所述多個(gè)組件構(gòu)成的連接組件圖,包括所述連接組件圖中的連接組件之間的任何連接,使得所述連接組件圖在被執(zhí)行時(shí)實(shí)現(xiàn)所述應(yīng)用程序的第一功能。20.一種配置軟件應(yīng)用程序以實(shí)現(xiàn)所述軟件應(yīng)用程序的一個(gè)或多個(gè)功能的方法,包括提供多個(gè)應(yīng)用程序組件;由應(yīng)用程序描述引擎將所述多個(gè)組件中的每一個(gè)經(jīng)由一公共接口連接到所述多個(gè)組件中的一個(gè)或多個(gè)其它組件,以允許經(jīng)由所述公共接口在不同類型的組件之間傳遞數(shù)據(jù);由所述應(yīng)用程序描述引擎實(shí)例化由所述多個(gè)組件構(gòu)成的連接組件圖,包括所述連接組件圖中的連接組件之間的任何連接,使得所述連接組件圖在被執(zhí)行時(shí)實(shí)現(xiàn)所述應(yīng)用程序的第一功能;響應(yīng)于由所述多個(gè)組件之一接收一數(shù)據(jù)事件,由所述多個(gè)組件中的一個(gè)或多個(gè)其它組件調(diào)用一處理;以及響應(yīng)于由所述多個(gè)組件中的一個(gè)或多個(gè)其它組件調(diào)用一處理,重新配置所述連接組件圖以實(shí)現(xiàn)所述應(yīng)用程序的第二功能。全文摘要本發(fā)明涉及XML應(yīng)用程序框架(XAF)。XAF應(yīng)用程序是數(shù)據(jù)驅(qū)動(dòng)的,使得對(duì)計(jì)算機(jī)系統(tǒng)的所有操作都是以數(shù)據(jù)為焦點(diǎn)的。另外,XAF應(yīng)用程序中使用的組件根據(jù)如何顯示數(shù)據(jù)以及使用什么數(shù)據(jù)類型來實(shí)例化和連接。XAF內(nèi)的應(yīng)用程序包括用戶界面(UI)連接器、動(dòng)作模塊以及數(shù)據(jù)連接器。UI連接器接收UI事件并將UI事件連接到動(dòng)作模塊。動(dòng)作模塊從UI事件生成標(biāo)準(zhǔn)格式動(dòng)作并將其發(fā)送到數(shù)據(jù)連接器。數(shù)據(jù)連接器將標(biāo)準(zhǔn)格式動(dòng)作轉(zhuǎn)換成改變數(shù)據(jù)存儲(chǔ)中的數(shù)據(jù)的數(shù)據(jù)專用動(dòng)作。數(shù)據(jù)連接器然后將對(duì)應(yīng)于改變的數(shù)據(jù)的標(biāo)準(zhǔn)格式數(shù)據(jù)表示發(fā)送回UI連接器以將改變的數(shù)據(jù)提供給UI。文檔編號(hào)G06F15/00GK101512503SQ200680014594公開日2009年8月19日申請(qǐng)日期2006年4月20日優(yōu)先權(quán)日2005年4月29日發(fā)明者A·S·威廉姆斯,C·A·西澤伯斯基,C·威滕伯格申請(qǐng)人:微軟公司