專利名稱:多個運行時容器共享的值解析的制作方法
多個運行時容器共享的值解析
背景技術(shù):
軟件應(yīng)用程序的功能可由開發(fā)者通過代碼擴(kuò)展,該代碼在軟件運行前被定義為軟件的一部分。例如,軟件開發(fā)經(jīng)常包括編寫源代碼,將源代碼編譯成可執(zhí)行機(jī)器代碼或虛擬機(jī)代碼,以及將編譯結(jié)果鏈接或者以其它方式綁定至先前創(chuàng)建的代碼。這種擴(kuò)展在編譯時發(fā)生。一些體系結(jié)構(gòu)允許應(yīng)用程序的功能在終端用戶運行該應(yīng)用程序時擴(kuò)展。例如,一些應(yīng)用程序支持插件,這些插件是可由應(yīng)用程序(或以其名義)在運行時加載的相對較小的應(yīng)用程序?qū)S密浖?。插件增強了?yīng)用程序,而不是獨立運行。插件是可選的,因為即使沒有插件應(yīng)用程序也提供基本功能。插件是應(yīng)用程序?qū)S玫?,被設(shè)計和實現(xiàn)以與特定應(yīng)用程序一起操作,并且有時甚至與該應(yīng)用程序的特定版本一起操作。每個應(yīng)用程序提供它自己的基礎(chǔ)結(jié)構(gòu)用于定位和使用它所支持的插件。托管(managed)可擴(kuò)展性框架允許應(yīng)用程序在支持不同應(yīng)用程序間共享功能的基礎(chǔ)結(jié)構(gòu)中在運行時給予和接收軟件功能以及應(yīng)用程序?qū)S脭U(kuò)展。這種應(yīng)用程序被稱為 “可擴(kuò)展的”。托管可擴(kuò)展性框架的基礎(chǔ)結(jié)構(gòu)提供使應(yīng)用程序基于簽名和/或與擴(kuò)展和應(yīng)用程序相關(guān)聯(lián)的其它數(shù)據(jù)類型信息從而定位和加載可用擴(kuò)展的機(jī)制。
發(fā)明內(nèi)容
一些實施例在可擴(kuò)展應(yīng)用程序環(huán)境中提供用于在組合容器間共享值的策略和服務(wù)。每個組合容器具有相應(yīng)的值解析器(value resolver)。值解析器服務(wù)從具有值解析策略的值解析器接收值解析請求,并且試圖標(biāo)識具有兼容的值解析策略的其它值解析器。值解析策略指定在值解析期間搜索組合容器的次序,以及在值解析期間在組合容器之間共享值的可見性;可見性和次序可各自依賴于組合容器范圍。值解析器服務(wù)查詢其值解析策略與請求值解析器的值解析策略兼容的值解析器。如果值解析請求尋找多個經(jīng)解析的值,那么值解析器服務(wù)可提供它所接收的作為查詢響應(yīng)的多個經(jīng)解析的值的聚集集合。如果值解析器不能提供值,那么值解析器服務(wù)可調(diào)用單次使用故障處理器(handler)。所給出的示例只是說明性的。本概述并不旨在標(biāo)識出所要求保護(hù)的主題的關(guān)鍵特征或必要特征,也不旨在用于限定所要求保護(hù)的主題的范圍。相反地,提供本發(fā)明內(nèi)容是為了以簡化的形式介紹將在以下詳細(xì)描述中進(jìn)一步描述的一些概念。利用權(quán)利要求書定義本發(fā)明,在本發(fā)明內(nèi)容與權(quán)利要求書有沖突的情況下,應(yīng)該以權(quán)利要求書為準(zhǔn)。
將參考附圖給出更具體的描述。這些附圖只示出了選定的方面,且因此不完全確定覆蓋或范圍。圖1是示出在操作環(huán)境中具有處理器、存儲器、具有相應(yīng)的值解析器的至少兩個組合容器、以及其它項的計算機(jī)系統(tǒng)并且還示出經(jīng)配置的存儲介質(zhì)實施例的框圖;圖2是進(jìn)一步示出值解析策略和其它值解析機(jī)制的框圖3是示出一示例體系結(jié)構(gòu)中的值解析的數(shù)據(jù)流程圖;圖4是示出標(biāo)識符范圍的圖表;圖5是進(jìn)一步示出值解析上下文中的范圍的圖表;以及圖6是示出一些方法的步驟和經(jīng)配置的存儲介質(zhì)的實施例的流程圖。詳細(xì)描述概覽可擴(kuò)展應(yīng)用程序環(huán)境可包括在彼此之間導(dǎo)入/導(dǎo)出值的組合容器。在一些可擴(kuò)展應(yīng)用程序環(huán)境中,導(dǎo)入/導(dǎo)出遵循嚴(yán)格的父-子模型,例如,子容器可從父容器導(dǎo)入,反之則不然,并且缺少公共祖先的容器不能共享值。微軟提供被稱為“MEF” ( “托管可擴(kuò)展性框架”)的可擴(kuò)展應(yīng)用程序環(huán)境。MEF提供運行時可擴(kuò)展性而不在應(yīng)用程序上施加插件模型。MEF允許主應(yīng)用程序展示它自己的擴(kuò)展以及使用外部擴(kuò)展。擴(kuò)展可在不同應(yīng)用程序間重用,并且還可被實現(xiàn)為應(yīng)用程序?qū)S玫摹?擴(kuò)展可相互依賴;MEF基于類型以及其它約束自動連接擴(kuò)展。MEF提供用于使應(yīng)用程序定位和加載可用擴(kuò)展的發(fā)現(xiàn)機(jī)制。MEF還支持用元數(shù)據(jù)標(biāo)記擴(kuò)展,這便于查詢和過濾。MEF的核心構(gòu)造包括目錄和組合容器。目錄負(fù)責(zé)發(fā)現(xiàn)擴(kuò)展,而組合容器則協(xié)調(diào)項目創(chuàng)建和滿足依賴性。在MEF中,可組合部件貢獻(xiàn)一個或多個導(dǎo)出,并且還可依賴于一個或多個外部提供的服務(wù)或其它導(dǎo)入??山M合部件還管理實例,該實例可以是給定類型的對象實例。MEF是可擴(kuò)展的;可提供附加的可組合部件實現(xiàn),只要它們遵循指定的導(dǎo)入/導(dǎo)出契約。契約是導(dǎo)出和導(dǎo)入之間的橋梁。導(dǎo)出契約可包括可用于對導(dǎo)出發(fā)現(xiàn)進(jìn)行過濾(例如通過指示由導(dǎo)出所提供的專用能力)的元數(shù)據(jù)。MEF支持父組合容器和子組合容器之間的有限共享。然而,共享僅僅是單向的,并且父/子關(guān)系被緊密地耦合,例如該關(guān)系需要在構(gòu)造子容器時知曉。子容器僅可具有一個父容器,因而限制了可與它共享的組合的數(shù)量。此處描述的一些實施例提供用于使組合容器跨其它組合容器解析對值的請求的機(jī)制。一些實施例還提供用于將策略應(yīng)用于約束跨系統(tǒng)內(nèi)各個組合容器發(fā)生解析的方式的機(jī)制。在一些實施例中,單個集中式服務(wù)組織解析并實施策略。定制值解析器可由其范圍、 解析偏好以及按照關(guān)聯(lián)策略的可見性來標(biāo)識。一些實施例支持動態(tài)共享,因為共享不需要先驗地知道什么其它的組合容器存在。一些實施例提供解析故障處理能力以在值解析請求時創(chuàng)建值(例如,創(chuàng)建和填充組合容器)。現(xiàn)在將參考諸如附圖中所示出的那些示例性實施例,并使用特定語言來對其進(jìn)行描述。但是,精通相關(guān)技術(shù)的人員所能想到的對此處所示出的本發(fā)明的特點的更改和進(jìn)一步的修改,如此處所示出的本發(fā)明的原理的其他的應(yīng)用,都應(yīng)該被視為在帶有權(quán)利要求的本發(fā)明的范圍內(nèi)。在本發(fā)明中闡明了術(shù)語的含義,如此,應(yīng)該在仔細(xì)關(guān)注這些闡明的情況下閱讀權(quán)利要求書。給出了具體示例,但是,相關(guān)領(lǐng)域的技術(shù)人員將理解,其他示例也可以落在所使用的術(shù)語的含義范圍內(nèi),并且在一個或多個權(quán)利要求的范圍內(nèi)。術(shù)語不一定具有與它們在一般用途中、在特定行業(yè)的用途、或在特定詞典或詞典集中擁有的相同含義。附圖標(biāo)記可以與各種措詞一起使用,以幫助顯示術(shù)語的廣度。從給定文本片段中省略附圖標(biāo)記不一定意味著沒有通過文本討論附圖的內(nèi)容。發(fā)明人聲稱并行使其對于其自己的詞典編纂的權(quán)利。這里在詳細(xì)描述中和/或在申請文件的別處顯式地或隱式地定義了術(shù)語。如本文所使用的,“計算機(jī)系統(tǒng)”可包括例如一個或多個服務(wù)器、主板、處理節(jié)點、 個人計算機(jī)(便攜式或非便攜式)、個人數(shù)字助理、蜂窩或移動電話、和/或提供至少部分地由指令控制的一個或多個處理器的其它設(shè)備。指令可以采取存儲器中的軟件和/或?qū)iT電路的形式。具體而言,雖然許多實施例在工作站或膝上型計算機(jī)上運行,但是其他實施例也可以在其他計算設(shè)備上運行,并且任何一個或多個這樣的設(shè)備都可以是給定實施例的一部分?!岸嗑€程化”計算機(jī)系統(tǒng)是支持多個執(zhí)行線程的計算機(jī)系統(tǒng)。術(shù)語線程應(yīng)被理解為包括能夠或經(jīng)歷同步的任何代碼,并且可用另一名稱來稱呼,如“任務(wù)”、“進(jìn)程”或“協(xié)同例程”。線程可以并行地、按順序、或以并行執(zhí)行(例如,多處理)和順序執(zhí)行(例如,時間分片)的組合運行。多線程環(huán)境是以各種配置設(shè)計的。執(zhí)行線程可以并行地運行,或者線程可以被組織為并行執(zhí)行,但是實際輪流按順序執(zhí)行。例如,多線程化可以通過在多處理環(huán)境中在不同的核上運行不同的線程、通過對單個處理器核上的不同線程進(jìn)行時間分片、或者通過時間分片和多處理器線程化的某種組合來實現(xiàn)。線程上下文切換可以例如由內(nèi)核的線程調(diào)度器、由用戶空間信號、或由用戶空間和內(nèi)核操作的組合來發(fā)起。線程可以輪流對共享數(shù)據(jù)進(jìn)行操作,或者例如每一線程都可以對其自己的數(shù)據(jù)進(jìn)行操作。“邏輯處理器”或“處理器”是單個獨立的硬件線程。例如,每一個核運行兩個線程的超線程化四核芯片具有8個邏輯處理器。處理器可以是通用的,或者針對特定用途,如圖形處理、信號處理、浮點算術(shù)處理、加密、I/O處理等等,對它們進(jìn)行定制?!岸嗵幚砥饔嬎銠C(jī)”是具有多個邏輯處理器的計算機(jī)系統(tǒng)。多處理器環(huán)境存在各種配置。在一給定配置中,所有處理器都在功能上是相等的,而在另一配置中,由于具有不同的硬件能力、不同的軟件指派,或者兩者,某些處理器可能不同于其他處理器。取決于配置, 處理器可以在單條總線上彼此緊密耦合,或者它們可以是松散耦合的。在某些配置中,處理器共享中央存儲器,在某些配置中,它們每一個都具有它們自己的本地存儲器,而在某些配置中,存在共享的和本地存儲器兩種?!皟?nèi)核”包括操作系統(tǒng)、系統(tǒng)管理程序、虛擬機(jī)、以及類似的硬件接口軟件?!按a”是指處理器指令、數(shù)據(jù)(包括常量、變量和數(shù)據(jù)結(jié)構(gòu))或指令和數(shù)據(jù)兩者。貫穿本文,對可選擇的復(fù)數(shù)的使用意味著存在一個或多個所指示的特征。例如, “(諸)容器”意味著“一個或多個容器”或等效于“至少一個容器”。只要參考了數(shù)據(jù)或指令,就理解這些項目配置了計算機(jī)可讀存儲器,從而將其變換為特定物品,而非簡單地存在于紙張上、人的腦海中、或作為例如線路上的瞬時信號。操作環(huán)境參考圖1,用于一個實施例的操作環(huán)境100可包括計算機(jī)系統(tǒng)102。計算機(jī)系統(tǒng)102 可以是多處理器計算機(jī)系統(tǒng),或者也可以不是。操作環(huán)境可包括一個或多個計算機(jī)系統(tǒng),它們可以群集的、客戶機(jī)-服務(wù)器聯(lián)網(wǎng)的、和/或?qū)Φ嚷?lián)網(wǎng)的。一些操作環(huán)境包括獨立(非網(wǎng)絡(luò)化)計算機(jī)系統(tǒng)。人類用戶104可以通過使用顯示器、鍵盤、及其他外圍設(shè)備106與計算機(jī)系統(tǒng)102 進(jìn)行交互。系統(tǒng)管理員、開發(fā)人員、工程技術(shù)人員、以及最終用戶各自都是特定類型的用戶 104。代表一個或多個人操作的自動化代理也可以是用戶104。在某些實施例中,存儲設(shè)備
7和/或聯(lián)網(wǎng)設(shè)備可以被認(rèn)為是外圍設(shè)備。圖1中未示出的其他計算機(jī)系統(tǒng)可以與計算機(jī)系統(tǒng)102進(jìn)行交互,或者例如通過網(wǎng)絡(luò)接口設(shè)備使用到網(wǎng)絡(luò)108的一個或多個連接與另一系統(tǒng)實施例進(jìn)行交互。計算機(jī)系統(tǒng)102包括至少一個邏輯處理器110。與其他合適系統(tǒng)一樣,計算機(jī)系統(tǒng) 102還包括一個或多個存儲器112。存儲器112可以是易失性的、非易失性的、固定在適當(dāng)位置的、可移動的、磁性的、光學(xué)的、和/或其他類型的。具體而言,諸如CD、DVD、記憶棒、或其他可移動非易失性存儲器介質(zhì)之類的已配置介質(zhì)114在被插入或以其他方式安裝時可以在功能上變?yōu)橛嬎銠C(jī)系統(tǒng)的一部分,從而使其內(nèi)容可被訪問以供處理器110使用??梢苿拥慕?jīng)配置介質(zhì)114是存儲器112的示例。存儲器112的其他示例包括內(nèi)置RAM、ROM、硬盤、以及其他不能被用戶104輕松地移走的存儲設(shè)備。介質(zhì)114用可由處理器110執(zhí)行的指令116來配置;“可執(zhí)行”在此以寬泛的意義使用來包括機(jī)器代碼、可解釋代碼、以及在例如虛擬機(jī)上運行的代碼。介質(zhì)114還被配置有數(shù)據(jù)118,該數(shù)據(jù)通過指令116的執(zhí)行被創(chuàng)建、修改、引用和/或以別的方式使用。指令116 和數(shù)據(jù)118配置它們所駐留于的存儲器112/介質(zhì)114 ;當(dāng)該存儲器是給定計算機(jī)系統(tǒng)的功能部分時,指令116和數(shù)據(jù)118還配置該計算機(jī)系統(tǒng)。在某些實施例中,數(shù)據(jù)118的一部分代表了諸如產(chǎn)品特征、庫存、物理測量值、設(shè)置、圖像、讀數(shù)、目標(biāo)、卷等等之類的現(xiàn)實的世界的項。如此處所討論的,這種數(shù)據(jù)還被變換。存儲器112可以是不同的物理類型。圖中所示的組合容器120、它們的值解析器 122、其它軟件124以及其它項可以部分地或全部地駐留在一個或多個存儲器112中,從而配置這些存儲器。例如,操作環(huán)境也可以包括其他硬件126,例如,總線、電源和加速器。組合容器120可做出請求128,該請求可由按照導(dǎo)入/導(dǎo)出契約的另一組合容器所提供的值 130來滿足。給定操作環(huán)境100可包括向開發(fā)人員提供一組協(xié)調(diào)的軟件開發(fā)工具的集成開發(fā)環(huán)境(IDE) 132。具體而言,對于一些實施例,合適的操作環(huán)境中的一些包括或幫助創(chuàng)建被配置成支持程序開發(fā)的Microsoft Visual Studio⑧開發(fā)環(huán)境(微軟公司的標(biāo)記)。一些合適的操作環(huán)境包括Java 環(huán)境(Sun Microsystems公司的標(biāo)記),并且一些操作環(huán)境包括利用諸如C++或C#(“C-a!arp”)等語言的環(huán)境,但本文的教導(dǎo)適用于各種各樣的程序設(shè)計語言、程序設(shè)計模型、以及程序,以及本質(zhì)上適用于軟件開發(fā)領(lǐng)域之外的使用可擴(kuò)展應(yīng)用程序環(huán)境的努力。在圖1中以輪廓形式示出了托管可擴(kuò)展性框架134、值解析器服務(wù)136和值解析策略138以指示它們不必是所示出的操作環(huán)境的一部分,但是可以與操作環(huán)境中的項進(jìn)行交互操作,如此處所討論的。系統(tǒng)參考圖1到圖3,一些實施例包括定制值解析器122、策略形式的值解析器設(shè)置138 以及協(xié)調(diào)值解析器服務(wù)136。定制值解析器122不是現(xiàn)有值解析器122的替換,包括可能由組合容器120的擁有者使用的任何其它定制解析器。相反,定制值解析器122是一個或多個現(xiàn)有值解析器的包裝器。定制值解析器并未被設(shè)計成防止組合容器的擁有者執(zhí)行它自己的值解析試探,相反它被設(shè)計成使那些經(jīng)解析的值對其它組合容器可見并且允許來自其它域的值成為經(jīng)解析的值130的集合的一部分。
與每個值解析器122相關(guān)聯(lián)的策略138包括指定組合容器120參與共享值130的程度的設(shè)置。在一些實施例中,策略可關(guān)于組合容器的相對次序(按此次序來解析值)和 /或諸如“總是觀察該容器”或“總不觀察該容器”之類的類似約束在次序說明202中指定偏好。在一些實施例中,策略可指定可見性說明204中的限制,諸如組合容器是否可使用值和/或向其它組合容器提供值。在一些實施例中,策略在指定可參與彼此之間值共享的組合容器集合時依賴于范圍206。在一些實施例中,當(dāng)值解析器122被創(chuàng)建時,它將自己向協(xié)調(diào)值解析器服務(wù)136的注冊表208登記。當(dāng)值解析器被要求解析對一個或多個值的請求128時,它將該請求傳遞到服務(wù)136,服務(wù)136隨后根據(jù)每個值解析器的策略集合進(jìn)行搜索。當(dāng)值解析器由于具有與請求解析器的策略兼容的策略而被認(rèn)為是查詢的參與者時,服務(wù)獲得由值解析器包裝的值解析器并且使其試圖解析對值的請求。在所有查詢已實施之后,服務(wù)136聚集結(jié)果并將它們送回發(fā)起查詢的原始值解析器。在一些實施例中,值解析器服務(wù)136還支持每個契約基礎(chǔ)上的故障處理器210的登記。如果查詢未被滿足,則服務(wù)136將調(diào)用針對指定契約已登記的任意處理器。如果處理器中的任何一個返回真(true),則將第二次嘗試查詢。這允許根據(jù)要求創(chuàng)建組合(進(jìn)而是值)。在一些實施例中故障處理是單次的;一旦處理器已被調(diào)用,則它將從服務(wù)的內(nèi)部存儲中移除并且不會再被調(diào)用。一些實施例包括附加代碼212,諸如用于管理策略138集合的應(yīng)用程序接口 (API) 214以及用于管理故障處理器210的API 216。在提供了跨組件域共享值的能力的特定系統(tǒng)中,各單獨子系統(tǒng)可自由地定義組件域(組合容器)以幫助滿足它們的特定情況。例如,子系統(tǒng)可以是自包含的,因為它可由 MEF知曉或MEF不知曉的各種主機(jī)使用。例如,微軟Visual Studio 編輯器可提供由包含其內(nèi)置所需的或加值(value-added)組件的匯編件組成的包。當(dāng)直接或經(jīng)由組件模型實例化時,根編輯服務(wù)將創(chuàng)建它自己的組件域并且用它自己的組件對其進(jìn)行填充。以這種方式構(gòu)建編輯器避免了迫使編輯器適應(yīng)具有其自己的生存期集合的現(xiàn)有組件域,并且避免了重新綁定語義和值解析策略。作為另一示例,子系統(tǒng)可能限制它所提供的值的對其它組件的可見性,以及它所具有的來自其它組件的值的可見性。例如,應(yīng)用程序中的、不同內(nèi)部組件域中的兩個子系統(tǒng)可各自提供要由作為該應(yīng)用程序一部分的其它子系統(tǒng)使用的服務(wù),而不是要由被引入系統(tǒng)中的公共組件域中的其它組件使用的服務(wù)。然而,應(yīng)用程序子系統(tǒng)將能夠從這些公共組件獲得值。在這種情況下,在應(yīng)用程序子系統(tǒng)之間存在多向共享,在它們和公共組件域之間存在單向共享。一些實施例提供利用至少三個組合容器120來配置的計算機(jī)系統(tǒng)102。每個組合容器具有相應(yīng)的值解析器122。系統(tǒng)還包括邏輯處理器110和與該邏輯處理器進(jìn)行有效通信的存儲器112。利用代碼(例如,用于值解析策略138的代碼和用于值解析器服務(wù)136 的代碼)以及值解析請求1 響應(yīng)(其為以該代碼執(zhí)行如下的值解析方法的系統(tǒng)產(chǎn)生的值 130的形式)來配置存儲器。值解析器服務(wù)136從第一組合容器120的第一值解析器122 接收值解析請求128。( “第一”和“第二”僅僅用于標(biāo)識項,并不意味著僅有兩個這樣的項——可以有兩個或更多個。)第一值解析器具有指定次序說明(specification) 202(用于在值解析期間搜索組合容器)和可見性說明204(用于在值解析期間在組合容器之間共享值)的值解析策略138。值解析器服務(wù)標(biāo)識具有與第一值解析器的值解析策略兼容的值解析策略的第二組合容器的第二值解析器。值解析器服務(wù)向第二值解析器查詢在值解析請求中找到的值,并且隨后在值解析請求響應(yīng)中向第一值解析器提供至少一個經(jīng)解析的值。在一些實施例中,配置存儲器112的代碼包括能夠修改組合容器的值解析策略的策略API 214。例如,在一個實施例中,次序說明枚舉器使用以下偏好來描述策略,這些偏好影響為發(fā)起搜索的組合容器解析值的方式
public enum ValueResolutionPreference
{
// There is no preference as to the order in which this component container is searched for values. NoPreference,
// Values are to be searched for in this component container before other component containers are searched.
BeforeValuesFromOtherContainers,
// Values are to be searched for in this component container after other containers are searched.
AfterValuesFromOtherContainers,
// Values are to be searched for only in this component container. OnlyThisContainer,
// Values are never to be searched for in this component container. NeverThisContainer,
// Values are to be searched for in this component container only if none were found in other component containers.
Only ThisContainer WhenNotInOtherContainers,
}在一個實施例中,以下可見性說明標(biāo)記描述了影響如何共享來自組合容器的值的策略public enum ValueSharingPolicyFlags {
Il Do not allow this resolver to provide values to or utilize values from other component containers.
ShareNothing - 0x00000000,
// Allow this resolver to provide values to other component containers. ProvideValuesToOthers = 0x00000001,
// Allow this resolver to utilize values from other component containers that belong to the same scope.
IncludeValuesFromOthersInSameScope = 0x00000002, // Allow this resolver to utilize values from other component containers that belong to inner scopes.
IncludeValuesFromOthersInlnnerScopes = 0x00000004,
// Do not rebind as a result of changes that occur within other component
containers
DoNotRebind = 0x00000008,
// Allow this resolver to utilize values from other component containers. IncludeValuesFromOthers = IncludeValuesFromOthersInSameScope | IncludeValuesFromOthersInlnnerScopes,
// Allow this resolver to provide values to and utilize values from other component containers.
ShareEverything = ProvideValuesToOthers | IncludeValuesFromOthers
}在一個實施例中,還在策略API 214中提供以下自變量和其它項
public ValueResolverSettings(ValueResolutionPreference preference, ValueSharingPolicyFlags sharingPolicy) this (preference, sharingPolicy, true) {} public ValueResolverSettings(ValueResolutionPreference preference,
ValueSharingPolicyFlags sharingPolicy, bool fully Trust) : this (null, preference,sharingPolicy, fully Trust) {}
publicValueResolverSettings(ScopeIdentifierscopeld,
ValueResolutionPreference preference, ValueSharingPolicyFlags sharingPolicy): this(scopeId, preference, sharingPolicy, true) {}
publicValueResolverSettings(ScopeIdentifierscopeld,
ValueResolutionPreference preference, ValueSharingPolicyFlags sharingPolicy, bool fully Trust)
public ScopeIdentifier Scopeld public ValueResolutionPreference Preference public ValueSharingPolicyFlags SharingPolicy public bool FullyTrust
public void AddPreference(string name, ValueResolutionPreference
preference)
public void RemovePreference(string name)
public void AddPolicy(string name, ValueSharingPolicyFlags policy) public void RemovePolicy(string name)
public bool TryGetResolutionPreference(string name, out ValueResolutionPreference preference)
public bool TryGetSharingPolicy(string name, out ValueSharingPolicyFlags policy)在一些實施例中,配置存儲器的代碼包括用于修改對值解析器服務(wù)136可用的故障處理器210的集合的故障處理器API 216。例如,一個實施例包括以下pub lie void AddResolutionFaultHandler (string contractName, ResolutionFaultHandler handler)public void AddResolutionFaultHandler(IEnumerable<string>contractName s, ResolutionFaultHandler handler)在一些實施例中,根據(jù)多個范圍206在系統(tǒng)中組織組合容器120。在一些實施例中,范圍206包括全局范圍??梢娦哉f明204和/或次序說明202可部分地依賴于組合容器范圍。例如,在上面的示例策略API 214中,一些標(biāo)記涉及相對于擁有策略的容器的內(nèi)部范圍或者相同范圍。下面將結(jié)合例如圖4和圖5進(jìn)一步討論范圍。在一些實施例中,配置存儲器的代碼包括被設(shè)計用于管理至少某些組合容器的托管可擴(kuò)展性框架134。例如,可用微軟MEF框架1 來配置系統(tǒng)。在一些實施例中,配置存儲器的代碼包括故障處理器210。在一些實施例中,故障
處理器例如通過注冊表208條目向值解析器服務(wù)登記,并且在值解析期間可由值解析器服務(wù)調(diào)用或以其名義調(diào)用。在一些實施例中,故障處理器是單次使用處理器,其僅被調(diào)用一次,例如將組合容器從盤加載到RAM中以便容器可提供值130。在一些實施例中,至少一個組合容器是可加載的自包含子系統(tǒng)的一部分。可以理解,對關(guān)于策略138的兼容性的判斷取決于實施例的策略集合以及組合容器及其值解析器和策略的具體配置。通常,“兼容”是指邏輯上一致并且至少在理論上能夠產(chǎn)生經(jīng)解析的值。例如,如果兩個策略中的每個策略要求在搜索其它容器前先搜索它相應(yīng)的容器,則這兩個策略是不兼容的。同樣,指定解析器不得向其它容器的解析器提供值的策略與要求從其它容器獲得值的策略不兼容。類似地,僅接受來自相同范圍或內(nèi)部范圍內(nèi)的容器的值的策略與不在這些范圍內(nèi)的容器的策略不兼容。相反,不指定次序偏好的策略與指定次序偏好的策略兼容。同樣,禁止重新綁定的策略與允許不考慮重新綁定或缺少重新綁定的值共享的策略是正交的,并且因而是兼容的。在一些實施例中,諸如人類用戶I/O設(shè)備之類的外圍設(shè)備106(屏幕、鍵盤、鼠標(biāo)、 圖形輸入板、話筒、揚聲器、運動傳感器等等)將可操作地與一個或多個處理器110和存儲器122進(jìn)行通信。然而,一實施例也可以深嵌入在系統(tǒng)中,以便沒有人類用戶104直接與該實施例進(jìn)行交互。軟件進(jìn)程可以是用戶104。在一些實施例中,網(wǎng)絡(luò)接口設(shè)備使用例如諸如分組交換網(wǎng)接口卡、無線收發(fā)器或電話網(wǎng)絡(luò)接口之類的組件提供對網(wǎng)絡(luò)108的接入,并將存在于計算機(jī)系統(tǒng)中。然而,一實施例也可以通過直接存儲器存取、可移動非易失性介質(zhì)、或其他信息存儲檢索和/或傳輸方法進(jìn)行通信,或者,計算機(jī)系統(tǒng)中的一實施例可以不與其他計算機(jī)系統(tǒng)進(jìn)行通信即可操作。方法圖6在流程圖600中示出一些過程方法實施方式。附圖中所示的方法可以在某些實施例中,例如,由策略導(dǎo)向的值解析器服務(wù)136、值解析器122以及組合容器120在腳本控制下自動執(zhí)行,需要極少或不需要用戶輸入。除非另外指明,否則也可以部分自動執(zhí)行并且部分手動執(zhí)行該方法。在給定實施方式中,方法的零個或更多個所示步驟可以重復(fù),也許使用不同的參數(shù)或數(shù)據(jù)來操作。一實施例中的步驟也可以按照與圖6中展示的自頂向下次序不同的次序來執(zhí)行。步驟可以串行地、以部分重疊的方式、或完全并行地執(zhí)行。遍歷流程圖 600以指示在方法期間執(zhí)行各步驟的次序可以隨該方法的一次執(zhí)行到該方法的另一次執(zhí)行而變化。該流程圖遍歷次序也可隨一個方法實施方式到另一方法實施方式而變化。假定所執(zhí)行的方法是可操作的并且符合至少一個權(quán)利要求,則各步驟還可被省略、組合、重命名、 重組、或以其他方式與所示流程分開。在發(fā)送步驟602期間,一實施例將值解析請求1 發(fā)送到值解析器122,值解析器 122又將該請求發(fā)送到值解析器服務(wù)136。在相應(yīng)的接收步驟604期間,值解析器和/或值解析器服務(wù)接收值解析請求。在嘗試步驟606期間,值解析器服務(wù)嘗試標(biāo)識608其策略138與發(fā)起值解析請求的值解析器的策略兼容的至少一個(在一些情況下,全部)值解析器。如果嘗試成功,或者在找到多個值解析器時至少部分地成功,則標(biāo)識步驟608也已發(fā)生。與涉及組合容器的其它數(shù)據(jù)/命令收發(fā)步驟一樣,這些步驟可由托管可擴(kuò)展性框架134來促進(jìn)。在登記步驟610期間,一實施例向值解析器服務(wù)136登記值解析器122。在查詢步驟612期間,值解析器服務(wù)查詢一個或多個兼容的值解析器,從而響應(yīng)
13于值解析請求128尋找值。在提供步驟614期間,值解析器響應(yīng)于查詢步驟612的值解析請求1 提供一個或多個經(jīng)解析的值。在登記步驟616期間,一實施例向值解析器服務(wù)136登記故障處理器210。在調(diào)用步驟618期間,一實施例調(diào)用故障處理器210以允許值解析。在次序指定步驟620期間,一實施例例如在次序說明202中指定容器搜索次序以供值解析期間使用。次序可包括強制性的和/或僅僅偏好的情況。次序可依賴于容器范圍 206。在可見性指定步驟622期間,一實施例例如通過可見性說明204指定容器可見性以供值解析期間使用,容器可見性可包括強制性的和/或僅僅偏好的情況??梢娦钥梢蕾囉谌萜鞣秶?06。在默認(rèn)策略指定步驟6M期間,一實施例指定要在值解析期間遇到不具有明示策略的值解析器時使用的策略138(包括,例如次序說明和/或可見性說明)。在加載步驟6 期間,一實施例將諸如一個或多個組合容器120之類的組件加載到工作存儲器,例如加載到可由在邏輯處理器110上運行的代碼尋址的動態(tài)RAM。加載可由故障處理器210執(zhí)行或以其名義執(zhí)行,以及在一些實施例中可由托管可擴(kuò)展性框架134執(zhí)行。在執(zhí)行步驟6 期間,圖6中示出的和/或本文中討論的一個或多個步驟由使用配置存儲器112的代碼的實施例執(zhí)行,從而在處理器110的控制下變換由代碼指令所指定的數(shù)據(jù)。在策略修改步驟630期間,一實施例例如通過使用諸如API 214之類的API來修改可用策略138的集合。在故障處理器修改步驟632期間,一實施例例如通過使用諸如API 216之類的API 來修改可用故障處理器210的集合。在組織步驟634期間,一實施例至少部分地根據(jù)容器120的各自相應(yīng)范圍206在存儲器112中組織組合容器120。例如,可根據(jù)如圖5所示出的范圍關(guān)系一樣的范圍關(guān)系在具有全局范圍502和一個或多個包含范圍504的范圍環(huán)中組織容器。在管理步驟636期間,一實施例使用諸如例如微軟MEF框架134之類的托管可擴(kuò)展性框架134來管理組合容器120。管理可包括組合容器代碼操作,例如,諸如分類、加載、 綁定、執(zhí)行以及解除分配。在使用步驟638期間,一實施例使用可加載的自包含子系統(tǒng)640,例如通過從子系統(tǒng)640獲得經(jīng)解析的值130和/或向子系統(tǒng)640提供經(jīng)解析的值130來使用該子系統(tǒng)640。下面將參考各實施例更詳細(xì)地討論前面的步驟和它們的相互關(guān)系。一些實施例提供一種在包含至少兩個組合容器的計算系統(tǒng)中解析值的方法,其中每個組合容器具有相應(yīng)的值解析器。該方法包括值解析器服務(wù)從第一組合容器的第一值解析器接收604值解析請求。第一值解析器具有指定620次序說明和/或指定622可見性說明的至少一個值解析策略。值解析器服務(wù)嘗試606標(biāo)識具有與第一值解析器的值解析策略兼容的值解析策略的第二組合容器的第二值解析器。使用“第一”和“第二”并不意味著限制為兩個;盡管一些實施例僅有兩個值解析器,但是其它實施例具有例如不止兩個值解析器。在一些情況下,值解析器服務(wù)成功地標(biāo)識608具有兼容的值解析策略的第二值解析器, 并且值解析器服務(wù)向第二值解析器查詢612在值解析請求中尋找的值。在一些實施例中,如果對于特定的值解析器122沒有明確指定策略,則使用默認(rèn)策略。例如,可指定擬4默認(rèn)策略以允許在全局范圍即最內(nèi)部范圍中完全共享(向他方提供值并且包括來自在相同且內(nèi)部的環(huán)中的他方的值)。在一些情況下,可能發(fā)生值解析器122滿足來自某些其它值解析器的特定值解析請求128的策略需求,但是仍然不能響應(yīng)于該請求提供614值。組合容器可具有滿足策略但不包含正被尋找的值的值解析器??闪⒓蠢闷渌到馕銎骼^續(xù)進(jìn)行對值的搜索,或者可調(diào)用618值解析器的故障處理器并且隨后在繼續(xù)進(jìn)行搜索之前重復(fù)查詢。在一些情形中,值解析請求引導(dǎo)值解析器服務(wù)尋找單個經(jīng)解析的值。在這種情況下,值解析器服務(wù)可向第一值解析器提供614單個經(jīng)解析的值130,值130是由值解析器服務(wù)接收的作為查詢響應(yīng)的首個值。在其它情形中,值解析請求尋找所有經(jīng)解析的值,并且值解析器服務(wù)向第一值解析器提供614作為查詢響應(yīng)的由值解析器服務(wù)接收604的多個經(jīng)解析的值的聚集集合。在一些實施例中,組合容器具有各自相應(yīng)的范圍,并且第一和第二組合容器的解析策略允許在至少相同范圍內(nèi)的容器之間完全共享值。一些實施例按照專用、本地和全局環(huán)來定義范圍。其它實施例使用全局范圍(它是對每一方都是共同的最內(nèi)部范圍),并且按照外部范圍和內(nèi)部范圍來組織。后一方法的示例在圖5中示出。在一些實施例中,值解析器服務(wù)查詢612與第一值解析器在相同環(huán)內(nèi)的值解析器,并且隨后向內(nèi)移動。在一些實施例中,值解析器服務(wù)調(diào)用618單次使用故障處理器。當(dāng)存在對單個值的請求時,如果沒有找到值則調(diào)用故障處理器,即使存在滿足策略的值解析器。當(dāng)存在對值的集合的請求時,即使找到了值也調(diào)用故障處理器。然而,對于特定契約調(diào)用單次使用故障處理器之后,就不能再調(diào)用它們了。在一些實施例中,方法包括向值解析器服務(wù)登記610值解析器,因此服務(wù)將包括在值解析期間進(jìn)行搜索的值解析器122。在其它實施例中,向另一系統(tǒng)組件登記值解析器, 服務(wù)可訪問該組件以定位值解析器。已配置的介質(zhì)一些實施例包括已配置的計算機(jī)可讀存儲介質(zhì)114,其是存儲器112的一個示例。 存儲器122可包括盤(磁盤、光盤或其他)、RAM、EEPROM或其他ROM、和/或其他可配置存儲器。已配置的存儲介質(zhì)可以特別地是諸如⑶、DVD或閃存之類的可移動存儲介質(zhì)114。可以是可移動或不可移動并且可以是易失性或非易失性的通用存儲器112可被配置成使用數(shù)據(jù)118和指令116形式的從可移動介質(zhì)114和/或諸如網(wǎng)絡(luò)連接等另一源讀取的諸如策略138和/或服務(wù)136等項目來形成配置的介質(zhì)的實施例。已配置的存儲器112能夠使計算機(jī)系統(tǒng)執(zhí)行用于通過如此處所公開的通過值解析來變換數(shù)據(jù)的方法步驟。圖1到6因而幫助示出已配置的存儲介質(zhì)實施方式和方法實施例,以及系統(tǒng)和方法實施例。具體而言,圖 3和/或圖6中示出的各方法步驟中的任一步驟或本文以其他方式教導(dǎo)的任一步驟可被用來幫助配置存儲介質(zhì)來形成已配置的介質(zhì)實施例。一些實施例提供利用數(shù)據(jù)118和指令116配置的計算機(jī)可讀介質(zhì)114用于執(zhí)行在由具有值解析器的組合容器所配置的計算系統(tǒng)中解析值的方法。該方法包括值解析器服務(wù)從第一值解析器接收604值解析請求,值解析器服務(wù)標(biāo)識608具有與第一值解析器的值解析策略兼容的值解析策略的第二值解析器,以及值解析器服務(wù)向第二值解析器查詢612在值解析請求中尋找的值。在一些情況下,至少一個組合容器解析策略被指定6M為默認(rèn)策略。在一些實施例中,值解析策略次序說明202指定以下各項中的至少一個關(guān)于針對值搜索該組合容器的次序并不存在偏好,在搜索其它組合容器前在該組合容器中搜索值,在搜索其它組合容器后在該組合容器中搜索值,僅在該組合容器中搜索值,從不在該組合容器中搜索值,僅當(dāng)在其它組合容器中沒有找到值時才在該組合容器中搜索值。在一些實施例中,值解析策略可見性說明204指定以下各項中的至少一個不允許該解析器向其它組合容器提供值或者利用來自其它組合容器的值,允許該解析器向其它組合容器提供值,允許該解析器利用來自屬于與該組合容器相同的范圍內(nèi)的其它組合容器的值,允許該解析器利用來自屬于相對于該組合容器是內(nèi)部范圍的其它組合容器的值,不由于在其它組合容器內(nèi)發(fā)生的變化而進(jìn)行重新綁定,允許該解析器利用來自其它組合容器的值,允許該解析器向其它組合容器提供值或者利用來自其它組合容器的值。指定“不重新綁定”是指在組合容器嘗試對值的檢索之后,該容器將不再嘗試檢索該值。例如,如果容器 A導(dǎo)入多個小部件(widget)且容器B具有兩個小部件,并且容器C稍后變得可用且也具有一個小部件,則將不會通知容器A說有更多的小部件可用。在一些實施例中,該方法包括在響應(yīng)于值解析請求并沒有提供值之后調(diào)用618故障處理器,盡管存在具有與第一值解析器的值解析策略兼容的值解析策略的至少一個值解析器。在一些實施例中,值解析請求尋找多個值,并且該方法包括將至少一個組件加載626 到計算系統(tǒng)動態(tài)RAM中以允許響應(yīng)于值解析請求貢獻(xiàn)值。以上及他處提供了幫助示出該技術(shù)的各方面的示例,但是在本文內(nèi)給出的示例并未描述所有可能的實施例。實施例不僅限于此處所提供的具體實現(xiàn)、排列、顯示、特征、方法或情形。給定實施例可包括例如附加的或不同的特征、機(jī)制、和/或數(shù)據(jù)結(jié)構(gòu),并可以以別的方式偏離此處所提供的示例。記住,以下提供了補充描述和示例。補充示例一些實施例提供跨組合容器120的多向值解析。組合容器用作組件實例的宿主 (host)并且用作這些組件實例和另一組合容器內(nèi)的其他組件實例之間的隔離邊界。來自組件的導(dǎo)出(export)以及直接添加到組合容器的值被歸入該組合容器的范圍,如通過組件的導(dǎo)入和對值的明確請求一樣。然而,組件實例隔離并不一定意味著對一個組合容器內(nèi)的值的請求不能由來自其他組合容器的值來解析。在一些實施例中,組合容器120有且僅有一個分配的值解析器 122,該值解析器122的工作是解析來自組合容器內(nèi)的組件的對值的請求。值解析器通常將其對值的搜索范圍定為發(fā)起組合容器內(nèi)的組件實例,但是并不需要如此。例如,MEF提供被稱為父解析器的值解析器的實例,該值解析器跨具有父/子關(guān)系的兩個組合容器解析值。MEF認(rèn)可值解析可以是復(fù)數(shù)運算(complex operation),并且因而出于此目的提供可擴(kuò)展點;任何人可創(chuàng)建可用于為其組合容器解析值的值解析器。此處所述的一些實施例提供其中多個組合容器可存在且可在它們之間共享值的機(jī)制。跨組合容器共享值可以是有利的。例如,如果存在跨組合容器共享值的能力,那么各個單獨子系統(tǒng)可自由地定義組合容器以幫助滿足它們的具體情況。在一些情況下子系統(tǒng)是自包含的,因為它可由MEF知曉或MEF不知曉的各種主機(jī)使用。應(yīng)用程序可提供由包含其內(nèi)置的所需或值添加組件的匯編件組成的包。當(dāng)直接或經(jīng)由組件模型實例化時,根應(yīng)用程序服務(wù)將創(chuàng)建它自己的組合容器并且用它自己的組件對其進(jìn)行填充。以這種方式構(gòu)建應(yīng)用程序不會迫使應(yīng)用程序開發(fā)人員使應(yīng)用程序適應(yīng)具有其自己的生存期集合、重新綁定語義和值解析策略的現(xiàn)有組合容器。在一些情況下,范圍確定的(scoped)值解析是有利的。子系統(tǒng)開發(fā)人員可能希望限制該子系統(tǒng)所提供的值的對其它組件的可見性,以及該子系統(tǒng)所具有的來自其它組件的值的可見性。例如,應(yīng)用程序中的、不同本地組合容器中的兩個子系統(tǒng)可各自提供要由作為該應(yīng)用程序一部分的其它子系統(tǒng)使用的服務(wù),而不是要由經(jīng)由公共可擴(kuò)展性被引入系統(tǒng)中的其它組件(駐留于全局組合容器中)使用的服務(wù)。然而,應(yīng)用程序子系統(tǒng)將能夠從這些公共組件獲得值。在這種情況下,在應(yīng)用程序子系統(tǒng)的容器之間存在多向共享,在它們和公共組合容器之間存在單向共享。一些可擴(kuò)展性情況涉及多個擴(kuò)展,其中這些擴(kuò)展之一被設(shè)計成作為默認(rèn)擴(kuò)展來對待。這可通過在一個擴(kuò)展上提供將該擴(kuò)展標(biāo)識為默認(rèn)擴(kuò)展的元數(shù)據(jù)來解決,或者通過與獲得其他擴(kuò)展所經(jīng)由的機(jī)制不同的機(jī)制獲得默認(rèn)擴(kuò)展來解決。第一種方法的困難在于任何擴(kuò)展可通過元數(shù)據(jù)說明它是默認(rèn)擴(kuò)展,從而導(dǎo)致可能需要用戶來解決的模糊性。第二種方法的困難在于它違反了可擴(kuò)展性規(guī)則,即不展示你自己未予貢獻(xiàn)的可擴(kuò)展點。然而,利用組合容器適當(dāng)位置中的適當(dāng)?shù)闹到馕霾呗?38,可避免這些指定默認(rèn)組件的困難??缃M合的值解析具有其他考慮。在單個應(yīng)用程序中具有多個組合容器不應(yīng)當(dāng)阻止值在它們之間共享,除非需要如此。如上所述,MEF提供將允許跨兩個組合容器單向共享值的值解析器,其中這兩個組合容器中一個是父容器且另一個是子容器。然而,此處所述的一些實施例提供了支持在組合容器之間多向共享值的可配置機(jī)制。為完成對值的這種多向共享,一些實施例使用定制值解析器以及可根據(jù)明確定義的規(guī)則集聚集來自定制解析器的值的服務(wù)。VSValueResolver是定制值解析器的一個示例。VSValueResolver不是現(xiàn)有值解析器或者可能由組合容器的擁有者使用的任何其它定制解析器的替換。相反,它是現(xiàn)有值解析器的包裝器。該定制值解析器并不意圖防止組合容器的擁有者執(zhí)行它自己的值解析試探,而是意圖幫助使得那些經(jīng)解析的值對其它組合容器可見并且允許來自其它域的值成為經(jīng)解析的值的集合的一部分??梢岳斫?,諸如“VSValueResolver”之類的名稱在一些實施例中可以不同。例如,此處所示的以“VS”開頭的名稱相反可以“Vs”為開頭,“value resolvers (值解析器)”可被表示為“export providers (導(dǎo)出提供者)”,并且可存在其它名稱改變。VSValueResolver是可配置的,以便組合容器擁有者可決定他們的組合容器參與共享值的程度。VSValueResolver可按三種方式來配置(i)通過搜索次序偏好,其指定組合容器解析值的相對次序,(ii)通過可見性,其指定組合容器是否可使用或向其它組合容器提供值,以及(iii)通過范圍,其指定可參與彼此之間值共享的組合容器的集合。這三種約束中的任何一個或全部可在值解析策略138中指定。在一些實施例中,當(dāng)VSValueResolver被創(chuàng)建時,它將自己向值解析器服務(wù)136登記。當(dāng)VSValueResolver被要求解析對一個或多個值的請求時,它將該請求傳遞到該服務(wù), 其中該服務(wù)根據(jù)每個VSValueResolver的可配置策略特性進(jìn)行搜索。當(dāng)VSValueResolver 由于具有兼容策略而被認(rèn)為是查詢的參與者時,該服務(wù)取得由VSValueResolver包裝的值解析器并且使其嘗試解析對值的請求。在所有查詢已被實施之后,該服務(wù)聚集結(jié)果并將它們送回發(fā)起查詢的原始VSValueResolver。對該數(shù)據(jù)變換序列的例示在圖3中示出,它是一些實施例中解析值的通用序列。在解析失敗的情況下,本實施例中的服務(wù)136將調(diào)用任何登記的故障處理器210 以給予它們機(jī)會利用所請求的契約的成果(production)來處理組件困境(component soup),或者通過直接將值添加到組合容器或者通過創(chuàng)建并填充一個或多個新的組合容器。 如果任何故障處理器隨后返回真,則該服務(wù)將重復(fù)查詢。在一些實施例中,在針對特定契約調(diào)用故障處理器后,這些故障處理器將從該服務(wù)的注冊表移除并且將不會再被調(diào)用。在一些情況下,組合容器被設(shè)計成參與和一組組合容器的雙向共享,以及和其它組合容器的單向共享。這允許公共方無法促成的內(nèi)部可擴(kuò)展性,同時允許內(nèi)部組件利用來自公共范圍的組件。這種共享可使用解析范圍206來完成。解析范圍實際上是某些組合容器的容器,其中這些組合容器在一些實施例中默認(rèn)地在它們之間具有雙向共享且與所包含范圍內(nèi)的組合容器具有單向共享。圖4示出范圍標(biāo)識符。解析范圍是由范圍標(biāo)識符表示的,該范圍標(biāo)識符可以是外部標(biāo)識符404,意味著它包含另一范圍標(biāo)識符,或者可以是內(nèi)部標(biāo)識符402,意味著它被包含在另一范圍標(biāo)識符內(nèi)。圖4利用明確示出的兩個級別說明范圍標(biāo)識符之間的關(guān)系。對范圍標(biāo)識符的包容的深度并不存在理論限制。一些人可能將范圍想成是一組同心環(huán),如圖5所示,其中每個環(huán)表示由范圍標(biāo)識符所標(biāo)識的范圍。如果一個范圍意在包含另一范圍,則該包含范圍由外部范圍標(biāo)識符所標(biāo)識,否則它由內(nèi)部范圍標(biāo)識符所標(biāo)識。全局范圍是所有范圍層次中絕對的最內(nèi)部的環(huán),如圖 5所示,因此該全局范圍內(nèi)的任何組合容器可向系統(tǒng)中任何其它組合容器提供值。如圖5所示,單獨的界定范圍的(scoping)環(huán)可通過創(chuàng)建不同的內(nèi)部和外部范圍標(biāo)識符而存在。在一些實施例中,特定范圍內(nèi)的組合容器具有向與它們在相同范圍內(nèi)的組合容器提供值以及從其獲得值的能力,向外部范圍提供值的能力,以及從內(nèi)部范圍中的組合容器獲得值的能力。然而,它們不具有與不在它們的界定范圍的層次中的組合容器共享值的能力。在一些實施例中,范圍可具有不止一個包含范圍。給定的范圍可被包含在不止一個外部范圍內(nèi)。在這種情況下,外部范圍中的組合容器彼此之間將不共享值,但是它們將能夠從相同內(nèi)部范圍獲得值。在一些實施例中,對于組合容器的解析次序始于包含該組合容器的環(huán)并且向內(nèi)移動。當(dāng)解析多個值時,將返回所有組合容器內(nèi)的所有的值。然而,當(dāng)解析單個值時,一找到值就結(jié)束搜索。在利用MEF的一些實施例中,除非另外指定,VSValueResolver將創(chuàng)建和包裝 CatalogResolver并將其自身放入解析服務(wù)中作為全局范圍的一部分。作為本地或?qū)S梅秶囊徊糠?,這些范圍的對象標(biāo)識符必須被傳遞到VSValueResolver的構(gòu)造函數(shù)。示例 VSValueResolver構(gòu)造函數(shù)包括
public VSValueResolver(Catalog catalog)
public VSValueResolver(Catalog catalog, ScopeIdentifier scope) public VSValueResolver(Catalog catalog, ValueResolverSettings settings) public VSValueResolver(ValueResolver resolver)
public VSValueResolver(ValueResolver resolver, ValueResolverSettings settings)在一些實施例中,VSValueResolver還允許在每XName的基礎(chǔ)上設(shè)置解析偏好。通過使用以下示例,對特定XName的設(shè)置優(yōu)先于為VSValueResolver指定的全部設(shè)置public void AddPreference (string name, VSVaIueResoIutionPreference preference)public void RemovePreference(string name)關(guān)于VSValueResolver的其它公用方法只有組件模型所調(diào)用的用于實際上執(zhí)行解析值請求的那些方法。無需曾直接從應(yīng)用程序?qū)S么a調(diào)用這些方法public override bool TryResolveToValue(string name, out IImportInfo value)public override bool TryResolveToValues (string name,out IEnumerable<IImportInfo>values)關(guān)于自引導(dǎo)子系統(tǒng),一個有用的情況允許自包含子系統(tǒng)640,即可在與其它組件或組合容器的存在無關(guān)的情況下被加載到任何主機(jī)中的子系統(tǒng)。在一些實施例中,唯一被一致同意的契約是組合容器的所有擁有者將VSValueResolver用作他們的值解析器。以下兩個示例示出MEF知曉主機(jī)以及非MEF知曉主機(jī)兩者如何能夠自引導(dǎo)子系統(tǒng)。關(guān)于在MEF知曉主機(jī)中加載子系統(tǒng),考慮以下代碼public class SubSystemLoader {
public IEnumerable<ISubSystemLoader> Loaders {get;set;}
public void LoadSubSystems() {
foreach(ISubSystemLoader loader in this.Loaders) loader.Load();
}
} [ComponentPart(CreationPolicy. Singleton)]
public class EditorLoader : ISubSystemLoader {
public void Load() {
Catalog catalog = new StandardCatalog();
VSValueResolverSettings settings = new VSValueResolverSettings( Scopes.Global,
VSValueResolutionPreference.BeforeValuesFromOtherDomains,
ValueSharingPolicyFlags.ShareEverything); VSValueResolver resolver = new VSValueResolver(
new CatalogResolver(catalog),settings); ComponentDomain domain = new ComponentDomain(resolver); Il Load editor components into domain...
}
}SubSystemLoader類由主機(jī)所知曉且被添加到主組件域中,并且將使所有子系統(tǒng)被加載加載器的導(dǎo)入將所有ISubSystemLoader值導(dǎo)入。foreach循環(huán)在每個加載器中迭代并且使其加載它的子系統(tǒng)。導(dǎo)出(The Export)提供實現(xiàn)ISubSystemLoader契約的編輯器加載器類。VSValueResolverkttings構(gòu)造函數(shù)調(diào)用指定該組件域?qū)⑹侨址秶囊徊糠?,將使它的值先被搜索,將允許它的值被其它組件域使用,以及將接受來自其它組件域的值。該代碼使用編輯器作為一個示例,但是其它應(yīng)用程序也可類似地配置。關(guān)于在非MEF知曉主機(jī)中加載子系統(tǒng),考慮以下代碼
public class SubSystemLoader {
public void LoadEditorSubSystem() {
EditorLoader loader = new EditorLoader(); loader.Load();
}
public void LoadSubSystems() {
foreach(string file in Directory.GetFiles(this.subSystemPath,
'*.dll"))
Assemblyassembly
Assembly.Load(AssemblyName.GetAssemblyName(file));
foreach(Type t in assembly.GetTypes) {
TypeFilter filter = new TypeFilter(this.InterfaceFilter);
if (t.FindInterfaces(filter, "ISubSystemLoader")) {
ISubSystemLoaderloader
assembly.Createlnstance(t.FullName);
loader.LoadQ;
break;
如果主機(jī)特別地知曉該編輯器,則它可簡單地實例化該編輯器的加載類并且調(diào)用加載函數(shù)LoadEditorSubSystem ()。如果主機(jī)不知曉任何特定子系統(tǒng),則它可使用LoadSubSystems ()經(jīng)由反射加載所有已安裝的子系統(tǒng)。如果一個類型實現(xiàn) ISubSystemLoader接口,那么Findhterfaces調(diào)用將其實例化并且調(diào)用加載。該代碼同樣使用編輯器作為一個示例,但是可理解其它應(yīng)用程序也可類似地配置。在一些實施例中,API包括以下VSValueResolver構(gòu)造函數(shù)
public VSValueResolver() this(new ValueResolverSettings(null, ValueResolutionPreference.BeforeValuesFromOtherContainers, ValueSharingPolicyFlags.ShareEverything, true)) {}
public VSValueResolver(ValueResolverSettings settings) public VSValueResolver(ComposablePartCatalog catalog)
public VSValueResolver(ComposablePartCatalog catalog, ScopeIdentifier scope)
public VSValueResolver(ComposablePartCatalog catalog, ValueResolverSettings settings)
public VSValueResolver(ValueResolver resolver)
publicVSValueResolver(ValueResolverresolver,
ValueResolverSettings settings)在一些實施例中,API包括以下VSResolverkrvice方法public static VSResolverService GetService()
publicvoid
DisposeCompositionContainers(IEnumerable<CompositionContainer>
containerList)
public bool TryGetExportedObj ect<T>(out T value)
publicbool TryGetExportedObject<T>(ScopeIdentifier scope, out T
value)
publicbool TryGetExportedObject<T>(string contractName, out T
value)
publicbool TryGetExportedObj ect<T>(ScopeIdentifier scope, string
contractName, out T value)
public bool TryGetExportedObj ects<T>(out IEnumerable<T> values) public bool TryGetExportedObj ects<T>(ScopeIdentifier scope, out
IEnumerable<T> values)
public bool TryGetExportedObj ects<T>(string contractName, out
IEnumerable<T> values)
public bool TryGetExportedObj ects<T>(ScopeIdentifier scope, string contractName, out IEnumerable<T> values)
public bool TryGetExport<T>(out Export<T> export)
public bool TryGetExport<T>(ScopeIdentifier scope,out Export<T>
export)
public bool TryGetExport<T>(string contractName,out Export<T>
export)
public bool TryGetExport<T>(ScopeIdentifierscope, string
contractName, out Export<T> export)
public bool TryGetExport<T, TMetadataView>(out Export<T,
TMetadataView> export)
public bool TryGetExport<T, TMetadataView>(ScopeIdentifier scope,out Export<T, TMetadataView> export)
public bool TryGetExport<T, TMetadataView>(string contractName, out Export<T, TMetadataView> export)
public bool TryGetExport<T, TMetadataView>(ScopeIdentifier scope, string contractName, out Export<T, TMetadataView> export)
public bool TryGetExports<T>(ScopeIdentifier scope, out ExportCollection<T> exports)
public bool TryGetExports<T>(string contractName, out ExportCollection<T> exports)
public bool TryGetExports<T>(ScopeIdentifier scope, string contractName, out ExportCollection<T> exports)
public bool TryGetExports<T, TMetadata View>(out ExportCollection<T, TMetadataView> exports)
public bool TryGetExports<T, TMetadataView>(ScopeIdentifier scope, out ExportCollection<T, TMetadataView> exports)
public bool TryGetExports<T, TMetadataView>(string contractName, out ExportCollection<T, TMetadataView> exports)
public bool TryGetExports<T, TMetadataView>(ScopeIdentifier scope, string contractName, out ExportCollection<T, TMetadataView〉exports)結(jié)論雖然在此將具體實施方式
明確示出并描述為方法、已配置介質(zhì),或系統(tǒng),但可以明白,一種類型的實施方式的討論一般也延及其他實施方式類型。例如,結(jié)合圖6的方法描述還幫助描述已配置的介質(zhì),并幫助描述如結(jié)合其他附圖討論的那些系統(tǒng)和制品等系統(tǒng)和制品的操作。對一個實施例的限制也不一定適用于另一個實施例。具體而言,方法不一定需要限于在討論諸如經(jīng)配置的介質(zhì)等系統(tǒng)或制品時呈現(xiàn)的數(shù)據(jù)結(jié)構(gòu)和安排。不是圖中所示出的每一項都需要存在于每個實施例中。相反,實施例可以包含圖中未顯式地示出的項。雖然一些可能性在此處通過具體示例在文本和附圖中示出,但是各實施例可以偏離這些示例。例如,一示例的具體特征可以被省略、重命名、以不同的方式分組、重復(fù)、不同地以硬件和/或軟件實例化,或是在兩個或更多示例中出現(xiàn)的特征的混合。 在某些實施例中,在一個位置處示出的功能也可以在不同的位置處提供。通過附圖標(biāo)記參考了附圖。在附圖或文本中與給定附圖標(biāo)記相關(guān)聯(lián)的措詞中的任何顯而易見的不一致性應(yīng)該被理解為僅僅時拓寬該標(biāo)記所引用的內(nèi)容的范圍。如此處所使用的,諸如“一”和“該”等術(shù)語包括了所指示的項目或步驟中的一個或多個。具體而言,在權(quán)利要求書中,對一個項的引用一般表示至少一個這樣的項存在,并且對一個步驟的引用表示執(zhí)行該步驟的至少一個實例。
標(biāo)題是僅出于方便起見的;關(guān)于給定話題的信息可在其標(biāo)題指示該話題的節(jié)之外找到。所提出的所有權(quán)利要求都是本說明書的一部分。盡管在附圖中示出了并在上文描述了示例性實施例,但是,對于本領(lǐng)域的技術(shù)人員來說顯而易見的是,在不偏離權(quán)利要求書中所闡述的原理和概念的情況下,可以進(jìn)行很多修改。盡管已經(jīng)用結(jié)構(gòu)特征和/或方法動作專用的語言描述了本主題,但可以理解,所附權(quán)利要求書中定義的主題不必限于上述具體特征或動作。不一定在給定定義或示例中標(biāo)識的每一個手段或方面都在每個實施例中存在或使用。相反,所描述的具體特征和動作是作為供當(dāng)實現(xiàn)權(quán)利要求書時考慮的示例來公開的。落入權(quán)利要求書的等效方案的含義和范圍內(nèi)的所有改變應(yīng)在法律允許的最大可能的范圍內(nèi)被權(quán)利要求書的范圍所涵蓋。
權(quán)利要求
1.一種在包含至少兩個組合容器(120)的計算系統(tǒng)(10 中解析值的方法,其中每個組合容器具有相應(yīng)的值解析器(122),所述方法包括以下步驟值解析器服務(wù)(136)從第一組合容器的第一值解析器接收(604)值解析請求(1 ),所述第一值解析器具有指定以下各項中的至少一個的至少一個值解析策略(138)用于在值解析期間搜索組合容器的次序說明O02),用于在值解析期間在組合容器之間共享值的可見性說明(204);以及所述值解析器服務(wù)嘗試(606)標(biāo)識具有與所述第一值解析器的所述值解析策略兼容的值解析策略的第二組合容器的第二值解析器。
2.如權(quán)利要求1所述的方法,其特征在于,還包括所述值解析器服務(wù)標(biāo)識(608)具有與所述第一值解析器的所述值解析策略兼容的值解析策略的第二組合容器的第二值解析器;以及所述值解析器服務(wù)向所述第二值解析器查詢(61 在所述值解析請求中尋找的值。
3.如權(quán)利要求2所述的方法,其特征在于,所述值解析請求尋找單個已解析的值,并且所述方法還包括所述值解析器服務(wù)向所述第一值解析器提供(614)單個已解析的值,其為所述值解析器服務(wù)接收的作為查詢響應(yīng)的首個值。
4.如權(quán)利要求2所述的方法,其特征在于,所述值解析請求尋找多個被解析的值,并且所述方法還包括所述值解析器服務(wù)向所述第一值解析器提供(614)由所述值解析器服務(wù)接收的作為查詢響應(yīng)的多個已解析的值的聚集集合。
5.如權(quán)利要求2所述的方法,其特征在于,所述組合容器具有各自相應(yīng)的范圍006), 并且所述第一和第二組合容器的解析策略允許在相同范圍內(nèi)的容器之間完全共享值。
6.如權(quán)利要求1所述的方法,其特征在于,還包括所述值解析器服務(wù)調(diào)用(618)單次使用故障處理器010)。
7.如權(quán)利要求1所述的方法,其特征在于,還包括向所述值解析器服務(wù)登記(610)值解析器。
8.一種計算機(jī)可讀介質(zhì)(114),其利用用于執(zhí)行一種在包含至少兩個組合容器(120) 的計算系統(tǒng)中解析值的方法的數(shù)據(jù)和指令來配置,其中每個組合容器具有相應(yīng)的值解析器 (122),所述方法包括以下步驟值解析器服務(wù)(136)從第一組合容器的第一值解析器接收(604)值解析請求(1 ),所述第一值解析器具有至少一個值解析策略(138),所述至少一個值解析策略指定用于在值解析期間搜索組合容器的次序說明O02)以及用于在值解析期間在組合容器之間共享值的可見性說明(204);所述值解析器服務(wù)標(biāo)識(608)具有與所述第一值解析器的所述值解析策略兼容的值解析策略的第二組合容器的第二值解析器;以及所述值解析器服務(wù)向所述第二值解析器查詢(61 在所述值解析請求中尋找的值。
9.如權(quán)利要求8所述的經(jīng)配置的介質(zhì),其特征在于,至少一個組合容器解析策略的次序說明指定(620)以下各項中的至少一個關(guān)于在該組合容器中搜索值的次序不存在偏好,在搜索其它組合容器之前在該組合容器中搜索值,在搜索其它組合容器之后在該組合容器中搜索值,僅在該組合容器中搜索值, 從不在該組合容器中搜索值,只有在其它組合容器中沒有找到值時才在該組合容器中搜索值。
10.如權(quán)利要求8所述的經(jīng)配置的介質(zhì),其特征在于,至少一個組合容器解析策略的可見性說明指定(622)以下各項中的至少一個不允許該解析器向其它組合容器提供值或者利用來自其它組合容器的值, 允許該解析器向其它組合容器提供值,允許該解析器利用來自與該組合容器屬于相同范圍的其它組合容器的值, 允許該解析器利用來自相對于該組合容器屬于內(nèi)部范圍的其它組合容器的值, 不由于在其它組合容器內(nèi)發(fā)生的變化而重新綁定, 允許該解析器利用來自其它組合容器的值,允許該解析器向其它組合容器提供值或者利用來自其它組合容器的值。
11.如權(quán)利要求8所述的經(jīng)配置的介質(zhì),其特征在于,至少一個組合容器解析策略被指定(624)為默認(rèn)策略。
12.如權(quán)利要求8所述的經(jīng)配置的介質(zhì),其特征在于,所述方法還包括在響應(yīng)于所述值解析請求并沒有提供值之后調(diào)用(618)故障處理器010),盡管存在具有與所述第一值解析器的所述值解析策略兼容的值解析策略的至少一個值解析器。
13.如權(quán)利要求8所述的經(jīng)配置的介質(zhì),其特征在于,所述值解析請求尋找多個值,并且所述方法還包括將至少一個組件加載(626)到計算系統(tǒng)動態(tài)RAM(112)中以允許響應(yīng)于所述值解析請求貢獻(xiàn)值。
14.一種計算機(jī)系統(tǒng)(102),其利用至少三個組合容器(120)來配置,每個組合容器具有相應(yīng)的值解析器(122),所述系統(tǒng)還包括邏輯處理器(110);以及與所述邏輯處理器可操作地通信的存儲器(112),所述存儲器利用代碼和由所述系統(tǒng)產(chǎn)生的值解析請求響應(yīng)來配置,所述系統(tǒng)利用所述代碼執(zhí)行一種具有至少下列步驟的方法值解析器服務(wù)(136)從第一組合容器的第一值解析器接收(604)值解析請求(1 ),所述第一值解析器具有至少一個值解析策略(138),所述至少一個值解析策略指定用于在值解析期間搜索組合容器的次序說明O02)以及用于在值解析期間在組合容器之間共享值的可見性說明(204);所述值解析器服務(wù)標(biāo)識(608)具有與所述第一值解析器的所述值解析策略兼容的值解析策略的第二組合容器的第二值解析器;所述值解析器服務(wù)向所述第二值解析器查詢(61 在所述值解析請求中尋找的值;以及所述值解析器服務(wù)向所述第一值解析器提供(614)所述值解析請求響應(yīng)內(nèi)的至少一個已解析的值。
15.如權(quán)利要求14所述的系統(tǒng),其特征在于,配置所述存儲器的所述代碼包括用于更改組合容器的值解析策略的至少一個API (214)。
16.如權(quán)利要求14所述的系統(tǒng),其特征在于,配置所述存儲器的所述代碼包括用于更改對所述值解析器服務(wù)可用的一組故障處理器的至少一個API (216)。
17.如權(quán)利要求14所述的系統(tǒng),其特征在于,所述組合容器在所述系統(tǒng)中根據(jù)包括全局范圍的多個范圍來組織,并且所述可見性說明至少部分地依賴于組合容器范圍。
18.如權(quán)利要求14所述的系統(tǒng),其特征在于,配置所述存儲器的所述代碼還包括用于管理所述組合容器中的至少某些組合容器的托管可擴(kuò)展性框架(134)。
19.如權(quán)利要求14所述的系統(tǒng),其特征在于,配置所述存儲器的所述代碼還包括向所述值解析器服務(wù)登記的且對所述值解析器服務(wù)可用的單次使用故障處理器(210)。
20.如權(quán)利要求14所述的系統(tǒng),其特征在于,至少一個組合容器是可加載的自包含子系統(tǒng)(640)的一部分。
全文摘要
策略和服務(wù)便于在可擴(kuò)展應(yīng)用程序環(huán)境中在合成容器之間共享值。值解析器服務(wù)從具有值解析策略的值解析器接收請求。該服務(wù)標(biāo)識具有兼容策略的其它值解析器,根據(jù)所涉及的策略對它們進(jìn)行查詢,獲得值,并且將它們提供給請求值解析器。值解析策略指定在值解析期間搜索組合容器的次序以及在組合容器之間共享值的可見性;策略可依賴于組合容器范圍。如果值解析器不能提供值,那么值解析器服務(wù)調(diào)用故障處理器。
文檔編號G06F9/06GK102257474SQ200980152752
公開日2011年11月23日 申請日期2009年12月11日 優(yōu)先權(quán)日2008年12月19日
發(fā)明者D·羅森 申請人:微軟公司