專利名稱::系統(tǒng)設(shè)計期間的驗證的制作方法
技術(shù)領(lǐng)域:
:本發(fā)明涉及系統(tǒng)的設(shè)計,更特別地涉及系統(tǒng)設(shè)計期間的驗證。
背景技術(shù):
:過去的幾年間,互聯(lián)網(wǎng)的使用蓬勃發(fā)展并且還在繼續(xù)擴大。人們已經(jīng)很習(xí)慣萬維網(wǎng)(或者簡稱為“網(wǎng)絡(luò)”)提供的許多服務(wù),例如電子郵件、在線購物、收集新聞和信息、聽音樂、瀏覽視頻剪輯、找工作,等等。為了跟上這種不斷擴大的基于互聯(lián)網(wǎng)服務(wù)的需求,在致力于宿主站點、為這些站點提供的后端服務(wù)以及存儲相關(guān)站點數(shù)據(jù)的計算機系統(tǒng)方面也已經(jīng)有了很大的發(fā)展。分布式計算機系統(tǒng)的一種類型是數(shù)據(jù)中心(例如互聯(lián)網(wǎng)數(shù)據(jù)中心(IDC)或者企業(yè)數(shù)據(jù)中心(EDC)),該中心是特殊設(shè)計的包括多個宿主基于網(wǎng)絡(luò)的服務(wù)的計算機的聯(lián)合體。也被稱為“網(wǎng)絡(luò)群”或“服務(wù)器群”的數(shù)據(jù)中心典型地在一個氣候可控的、物理上安全的建筑物中具有幾百至幾千臺計算機。典型地,數(shù)據(jù)中心提供可靠地互聯(lián)網(wǎng)訪問、可靠地電力供應(yīng)以及安全的操作環(huán)境。不同的數(shù)據(jù)中心可以對運行在該數(shù)據(jù)中心的應(yīng)用程序有不同的要求。例如,不同的數(shù)據(jù)中心可能需要實施不同類型的安全措施,或者需要應(yīng)用程序支持不同的通信協(xié)議。另外,一些數(shù)據(jù)中心可能在一段時間后要改變這些需求。由于為了使應(yīng)用程序可以在需要的數(shù)據(jù)中心上運行,設(shè)計員要知曉這些不同的需求并且在設(shè)計應(yīng)用程序的時候要考慮到這些,所以數(shù)據(jù)中心間的差異就使得應(yīng)用程序的設(shè)計過程變得困難。進(jìn)一步地,目前程序員在將他們的應(yīng)用程序配置在數(shù)據(jù)中心時,一般僅僅可以評價他們的應(yīng)用程序是否將運行在一個特殊的數(shù)據(jù)中心上。如果由于應(yīng)用程序不能滿足數(shù)據(jù)中心的一個或多個必要條件而使得程序運行不成功,那么設(shè)計員就要修補應(yīng)用程序的問題并在數(shù)據(jù)中心上重新試驗該應(yīng)用程序的運行。此過程將被重復(fù)許多次,并且會造成效率低下和不如人意的設(shè)計過程的結(jié)果。這里將描述的系統(tǒng)設(shè)計期間的驗證將解決這些和其他的問題。發(fā)明概述這里將描述系統(tǒng)設(shè)計期間的驗證。根據(jù)系統(tǒng)設(shè)計期間的驗證的某些方面,接收將被設(shè)計的系統(tǒng)的描述和環(huán)境的描述。這些描述都用于在設(shè)計系統(tǒng)時以及在配置系統(tǒng)之前對照環(huán)境來驗證系統(tǒng)。附圖的簡要說明在整個附圖中,相同的附圖標(biāo)記表示相同的特征。圖1說明了一個示例性的網(wǎng)絡(luò)設(shè)置。圖2是一個說明使用系統(tǒng)定義模塊的示例性體系結(jié)構(gòu)的方框圖。圖3說明了一個示例性的分層設(shè)置。圖4是一個說明用于設(shè)計期間的驗證的示例性過程的流程圖。圖5A和5B是一個說明創(chuàng)建一實例空間的示例性的遞歸擴展過程的流程圖。圖6A和6B是一個說明用于評估信息流的示例性過程的流程圖。圖7A、7B、7C、7D和7E是一個說明評估約束條件的示例性過程的流程圖。圖8說明了一個示例性的SDM文檔。圖9說明了一個示例性的SDM定義。圖10說明了一個示例性的SDM成員。圖11說明了一個示例性的設(shè)置成員。圖12說明了一個示例性的約束條件的定義。圖13說明了一個示例性的描述對象。圖14說明了一個將在一層中的網(wǎng)絡(luò)應(yīng)用程序映射到另一層中的網(wǎng)絡(luò)服務(wù)器主機的實例。圖15說明了一個示例性的嵌入式數(shù)據(jù)類型的分級結(jié)構(gòu)。圖16說明了一個上投射和下投射的例子。圖17說明了一個類型變換的例子。圖18說明了一個示例性的關(guān)系樹。圖19說明了一個利用授權(quán)公開主機實現(xiàn)的例子。圖20說明了一個利用授權(quán)向父體公開一成員實現(xiàn)的例子。圖21和22說明了一個通信連接的驗證的例子。圖23說明了一個區(qū)域邊界的例子。圖24說明了一個示例性的實體空間。圖25說明了一個示例性的可以執(zhí)行這里描述的技術(shù)的普通計算機環(huán)境。實施例的詳細(xì)描述下面公開的內(nèi)容描述了與系統(tǒng)設(shè)計期間的驗證的結(jié)構(gòu)有關(guān)的各個方面。此公開包括系統(tǒng)定義模型(SDM)的論述,其也可以認(rèn)為是服務(wù)定義模型(SDM)。SDM向應(yīng)用程序設(shè)計者提供工具和上下文用以設(shè)計抽象的分布式計算機應(yīng)用程序和數(shù)據(jù)中心。該模塊定義了一系列表示應(yīng)用程序的功能單元的元素,該程序最終將被物理計算機資源和軟件執(zhí)行。與該模塊元素相關(guān)的是規(guī)劃表,其表示如何指定由成員表示的功能性操作。正如這里所使用,術(shù)語“接線”也可以認(rèn)為是“連接”、“通信”或者“通信關(guān)系”。術(shù)語“系統(tǒng)”也可以認(rèn)為是“模塊”并且術(shù)語“資源空間”也可以認(rèn)為是“資源”。另外,術(shù)語“應(yīng)用空間”也可以認(rèn)為是“應(yīng)用程序”,并且術(shù)語“實體空間”也可以認(rèn)為是“實體”。進(jìn)一步地,術(shù)語“類”也可以認(rèn)為是“抽象定義”,術(shù)語“端口”也可以認(rèn)為是“端點”,以及術(shù)語“類型”也可以認(rèn)為是“定義”。圖1說明了一個示例性的網(wǎng)絡(luò)設(shè)置100。在設(shè)置100中,多(x)計算設(shè)備102(1),102(2),...102(x)連接到網(wǎng)絡(luò)106。網(wǎng)絡(luò)106代表各種常規(guī)網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)和類型(包括有線和/或無線網(wǎng)絡(luò))中的任意一種,其使用各種常規(guī)網(wǎng)絡(luò)協(xié)議(包括公共和/或?qū)S袇f(xié)議)中任意一種。網(wǎng)絡(luò)106包括,例如局域網(wǎng)(LAN)、廣域網(wǎng)(WAN)、互聯(lián)網(wǎng)的一部分等等。設(shè)置100表示大量不同的設(shè)置中的任意一種,各種設(shè)置包括,例如數(shù)據(jù)中心(例如互聯(lián)網(wǎng)數(shù)據(jù)中心(IDC))、辦公或商業(yè)設(shè)置、家庭設(shè)置教育或研究設(shè)施、零售或銷售設(shè)置、數(shù)據(jù)存儲裝置等等。計算設(shè)備102可以是各種常規(guī)計算設(shè)備中的任意一種,包括臺式PC、工作站、大型計算機、服務(wù)器計算機、互聯(lián)網(wǎng)儀器、游戲控制臺、掌上電腦、移動電話、個人數(shù)字助理(PDA)等等。設(shè)備102的一個或多個設(shè)備可以是相同類型的設(shè)備,或者可選擇地為不同類型的設(shè)備。另外,即使在多個設(shè)備是相同的設(shè)備類型的情況下,多個設(shè)備也可以進(jìn)行不同的配置(例如,兩個設(shè)備102可以都是服務(wù)器計算機,但是可以有不同的硬件配置,諸如,不同的處理器、不同數(shù)量的RAM、不同容量的硬盤驅(qū)動器,等等)。在添加到設(shè)置100中后,一個或多個設(shè)備102也可以進(jìn)行重新配置。例如,特殊計算設(shè)備102使用一段時間(例如,類似于分鐘、小時、天、月等)來執(zhí)行一個功能,然后管理員可以決定需要不同的功能(例如,從服務(wù)器計算機改變?yōu)楣ぷ髡居嬎銠C、從web服務(wù)器改變?yōu)楸镜匚募?wù)器,等等)。圖2是一個說明使用SDM的示例性體系結(jié)構(gòu)200的方框圖。SDM被設(shè)計成在系統(tǒng)的設(shè)計過程中使用,并且被用于在設(shè)計過程結(jié)束后使用和/或管理系統(tǒng)。一個系統(tǒng)是一組可以共同工作并完成共有的功能的相關(guān)聯(lián)的軟件和/或硬件資源。這樣的系統(tǒng)的一個例子是應(yīng)用程序,其是指一組可以被計算設(shè)備運行或執(zhí)行來完成各種功能的指令。應(yīng)用程序的實例包括諸如游戲的娛樂應(yīng)用程序、諸如文字處理器的產(chǎn)出應(yīng)用程序、諸如電子百科全書的參考應(yīng)用程序、可以用于web服務(wù)或金融分析的分布式應(yīng)用程序,等等。此系統(tǒng)的另一個實例是可以調(diào)度一應(yīng)用程序(或另一環(huán)境)的環(huán)境。環(huán)境是指可以使用應(yīng)用程序(或另一個環(huán)境)的軟件和/或硬件資源。以上環(huán)境可彼此分層。一般地,在系統(tǒng)的設(shè)計過程或階段(也被稱為開發(fā)過程或階段)中,支持SDM的開發(fā)工具用于定義一個由通信軟件和/或硬件部件組成的系統(tǒng)。系統(tǒng)的定義包括使用和操作一個分布式系統(tǒng)必須的所有信息,其包括所需的資源、配置、可操作的特點、策略等。設(shè)計階段完成之后,使用階段也可以利用系統(tǒng)定義來使用該系統(tǒng)并且動態(tài)地分配和配置所需的軟件和硬件(例如,服務(wù)器、存儲器和網(wǎng)絡(luò))資源。相同的系統(tǒng)定義可以針對于不同的主機環(huán)境和不同程度的使用。體系結(jié)構(gòu)200既使用SDM定義模型也使用定義了SDM定義模塊內(nèi)的函數(shù)運算的計劃表。該定義模塊包括各種不同類型的數(shù)據(jù)結(jié)構(gòu),該數(shù)據(jù)結(jié)構(gòu)整體被稱為“定義”。通過一個或多個平臺服務(wù),例如應(yīng)用程序接口(APIs),揭示了SDM的函數(shù)性。一個系統(tǒng)的設(shè)計階段期間,開發(fā)部件202產(chǎn)生一個包括系統(tǒng)定義的的文檔,例如SDM文檔204。開發(fā)部件202可以是任何不同的開發(fā)部件,諸如華盛頓州雷蒙德市的微軟公司出售的VisualStudio開發(fā)系統(tǒng)。SDM文檔204定義了所有的與系統(tǒng)的使用(和可選擇地管理)有關(guān)的信息(這里也被稱為知識)。任何在使用系統(tǒng)或管理系統(tǒng)時必要或使用的信息都包含在SDM文檔204中。盡管在這里被描述為一個文檔,但是應(yīng)當(dāng)認(rèn)識到該知識也可選地被分配并保存到多個文檔中。系統(tǒng)定義定義了根據(jù)一個或多個資源、端點、關(guān)系和子系統(tǒng)的系統(tǒng)。在一個SDM文檔中(例如,XML文檔)說明系統(tǒng)定義。資源可以是硬件資源或軟件資源。端點代表跨系統(tǒng)的通信。關(guān)系定義了系統(tǒng)、資源和端點之間的聯(lián)系。子系統(tǒng)可以表現(xiàn)為完整的系統(tǒng)并且典型地是一個較大系統(tǒng)的一部分。系統(tǒng)定義記錄了動態(tài)系統(tǒng)的基本結(jié)構(gòu)。它可以被看作是要在其上添加所有其他信息的框架。典型地,此結(jié)構(gòu)在開發(fā)過程中由設(shè)計者和開發(fā)者指定,并且不會頻繁改變。除了結(jié)構(gòu)外,SDM還記錄了使用信息、安裝過程、配置表、事件和儀器、自動控制任務(wù)、完整的模型、操作策略等。由操作人員、賣主和/或貫穿分布式系統(tǒng)生命期中由管理系統(tǒng)添加其它的信息。SDM文檔204包括系統(tǒng)的一個或多個約束條件(也可以稱為必要條件),調(diào)用并/或運行此系統(tǒng)的環(huán)境必需滿足此約束條件。利用SDM文檔,該環(huán)境本身被描述為“邏輯基礎(chǔ)結(jié)構(gòu)”(LIM)文檔206、或數(shù)據(jù)中心說明或數(shù)據(jù)中心模型。與SDM文檔204相似,LIM文檔206可以是單一的文檔或者可選地由兩個或多個文檔組成。LIM文檔206可以使用任何不同的開發(fā)部件產(chǎn)生,例如類似于開發(fā)部件202的部件。LIM文檔206也可以利用開發(fā)部件202產(chǎn)生(也就是相同的開發(fā)部件既可以用于產(chǎn)生SDM文檔204也可以用于產(chǎn)生LIM文檔206)。LIM文檔206所描述的環(huán)境可以是單一的計算設(shè)備、或可選擇的是計算設(shè)備的集合(例如,數(shù)據(jù)中心)、應(yīng)用程序主機等等。不同的系統(tǒng)甚至是相同的系統(tǒng)可以安裝到不同的環(huán)境中。例如,一個數(shù)據(jù)中心可以包括五十個計算設(shè)備,并且五個以上計算設(shè)備可調(diào)度此系統(tǒng),而三十五個以上計算設(shè)備可調(diào)度另一系統(tǒng)。這些必要條件可以采取各種形式,例如關(guān)于配置該系統(tǒng)的計算設(shè)備的硬件必要條件(例如,處理器的最低速度、存儲器的最小量、可用硬盤空間的最小量、有效網(wǎng)絡(luò)帶寬的最小量、有效特別安全機制,等等)、關(guān)于配置該系統(tǒng)的計算設(shè)備的軟件必要條件(例如,特定的操作系統(tǒng)、一個或多個其它必須安裝的應(yīng)用程序、關(guān)于特定系統(tǒng)和/或操作系統(tǒng)如何配置的說明、要用的安全或加密的特定類型等等)、關(guān)于配置該系統(tǒng)的計算設(shè)備的其它必要條件(例如,可靠的特定安全密鑰、必須執(zhí)行的數(shù)據(jù)中心策略、使用的驗證機制、環(huán)境拓?fù)浣Y(jié)構(gòu)等等)。相對于不同的LIM206中所描述的多個不同的環(huán)境,在SDMA文檔204中描述的單一系統(tǒng)也是有效的。必要條件也可以用于其它的方面一也就是,環(huán)境可以具有關(guān)于要安裝的系統(tǒng)的配置的約束條件或必要條件(例如,要執(zhí)行的環(huán)境的標(biāo)準(zhǔn)或策略)。這些可以是由環(huán)境操作員創(chuàng)建的“顯式”必要條件,諸如,系統(tǒng)必須具有的特定設(shè)置或配置、系統(tǒng)必須提供或支持的特定功能、系統(tǒng)必須支持的特定安全機制等等。這些也可以是環(huán)境的特定配置所產(chǎn)生的隱式必要條件。例如,如果環(huán)境中的主計算設(shè)備使用了一個特定類型的文件系統(tǒng),那么利用此系統(tǒng)就不可能執(zhí)行某些行為(盡管利用另一個文件系統(tǒng)可以執(zhí)行那些相同的行為)。在系統(tǒng)的設(shè)計階段,SDM文檔204可以被驗證部件208用于驗證適合一個或多個特定環(huán)境的系統(tǒng)。這是一個兩方面的驗證驗證用于環(huán)境的系統(tǒng)以及驗證用于系統(tǒng)的環(huán)境。驗證部件208可以通過將SDM文檔204標(biāo)識的必要條件與在LIM文檔206中描述的環(huán)境進(jìn)行比較,來驗證用于系統(tǒng)的環(huán)境,并且確定該環(huán)境是否滿足所有的必要條件。驗證部件208可以通過將LIM文檔206標(biāo)識的必要條件與在SDM文檔204中描述的系統(tǒng)進(jìn)行比較,來驗證用于環(huán)境的系統(tǒng),并確定該系統(tǒng)是否滿足所有的必要條件。如果系統(tǒng)和環(huán)境都滿足所有的必要條件,那么設(shè)計者或開發(fā)者就知道該系統(tǒng)可以在該環(huán)境中配置并運行。但是,如果環(huán)境和/或系統(tǒng)并不滿足所有的必要條件,那么驗證部件208就通知不被滿足的必要條件的設(shè)計者或開發(fā)者要作出對SDM文檔204(以及響應(yīng)的系統(tǒng))和/或環(huán)境作出改變,以便使系統(tǒng)能在該環(huán)境中配置并運行。LIM文檔206可以用于實際環(huán)境或者可選擇地用于模擬環(huán)境。對于實際環(huán)境,LIM描述了一個存在的或者已經(jīng)描述好但還沒有建立的環(huán)境。例如,實體環(huán)境可以是現(xiàn)有的數(shù)據(jù)中心,或者數(shù)據(jù)中心已經(jīng)設(shè)計好了但是還沒有實際實現(xiàn)。對于模擬環(huán)境,LIM描述了一個不必要存在的預(yù)期中的環(huán)境。對預(yù)期中的環(huán)境可以作出各種設(shè)想,但是對于實際環(huán)境就不需要作出這樣的設(shè)想。典型地,在系統(tǒng)的設(shè)計過程期間,LIM文檔206描述了一個模擬環(huán)境。但是,當(dāng)一實際環(huán)境存在于一特殊時間點時描述了此環(huán)境的LIM文檔可選地用于整個設(shè)計階段。驗證部件208可以是一個或多個與數(shù)據(jù)中心分離的計算設(shè)備,在此數(shù)據(jù)中心中將調(diào)度被開發(fā)的系統(tǒng)。例如,驗證部件208可以是單一的計算設(shè)備,或者可選擇地將該驗證職責(zé)分配到多個設(shè)備??商鎿Q地,驗證部件208可以是將調(diào)度要開發(fā)的系統(tǒng)的數(shù)據(jù)中心中的一個或多個計算設(shè)備。SDM使系統(tǒng)的操作組合跨越了橫向和縱向。橫向的組合由系統(tǒng)和子系統(tǒng)實現(xiàn)??v向的組合由“層”來實現(xiàn)。應(yīng)用程序、服務(wù)站點、網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)和硬件都在分布式系統(tǒng)中起作用,但是典型的也被單獨定義并且屬于不同的組或組織。由定義了一組主機的約束條件的成員實現(xiàn)了分層,并且反之亦然。圖3說明了一個示例性的分層設(shè)置。圖3中顯示了四層層302、層304、層306以及層308。雖然在圖3中顯示了四層,但是實際上層的數(shù)量可以改變,并且可以大于或小于四。另外,在不同實施例中不同層的內(nèi)容也可以改變。如圖3所示,不同的層可以位于其它層的上面和/或下面(例如,層306在成304的上面但是在層308的下面)。在一層中的不同的系統(tǒng)和子系統(tǒng)可以相互作用,并且也可以其它層中的系統(tǒng)和子系統(tǒng)相互作用。例如,層308中的子系統(tǒng)310既可以與層308中的子系統(tǒng)312相互作用,也可以與層306中的子系統(tǒng)314相互作用。另外,每個層可以看作是其相鄰高層的環(huán)境。例如,層306是層308中的系統(tǒng)和子系統(tǒng)的環(huán)境,而層304是層306中的系統(tǒng)和子系統(tǒng)的環(huán)境。每個層302、304、306及308都有其各自關(guān)聯(lián)的SDM文檔。不同的層302、304、306及308可以表示不同的內(nèi)容。在某些實施例中,層302是硬件層,層304是網(wǎng)絡(luò)拓?fù)浜筒僮飨到y(tǒng)層,層306是應(yīng)用程序主機層,并且層308是應(yīng)用程序?qū)?。硬件層是?gòu)建分層系統(tǒng)(例如,圖1中的設(shè)備102)的物理設(shè)備(例如計算設(shè)備)。網(wǎng)路拓?fù)浜筒僮飨到y(tǒng)層表示計算設(shè)備的網(wǎng)絡(luò)拓?fù)?例如,圖1的網(wǎng)絡(luò)設(shè)置100)和安裝在那些計算設(shè)備上的操作系統(tǒng)。應(yīng)用程序主機層表示安裝在計算設(shè)備上并可以宿主其它程序的應(yīng)用程序(例如,SQLServer、IIS等等)。應(yīng)用程序?qū)颖硎景惭b在計算設(shè)備上并且不可以宿主其它程序的應(yīng)用程序(例如,諸如游戲的娛樂軟件、諸如文字處理器的產(chǎn)品應(yīng)用程序、諸如電子百科全書的參考應(yīng)用程序、可以用于web服務(wù)或金融分析的分布式應(yīng)用程序,等等)。再參照圖2,應(yīng)用程序開發(fā)者可以利用開發(fā)部件202設(shè)計并開發(fā)應(yīng)用程序。當(dāng)開發(fā)者定義他或她的系統(tǒng)的不同部分以及這些部分之間如何相互關(guān)聯(lián)的時候,產(chǎn)生獲得這些部分和關(guān)系的SDM文件204。依靠LIM文件206所描述的環(huán)境,開發(fā)者可以使用驗證部件208驗證系統(tǒng)屬性。在設(shè)計階段的這個驗證也可以被稱為“設(shè)計期間的驗證”。在下面的“示例性的SDM執(zhí)行”部分將詳細(xì)討論的SDM將被設(shè)計,用以支持分布式系統(tǒng)(模型化系統(tǒng))中成員的配置、相互作用和改變的說明。SDM基于對象關(guān)系模型。“對象”描述了存在于一個系統(tǒng)中的實體,并且“關(guān)系”表示不同實體間聯(lián)系。進(jìn)一步定義對象和關(guān)系是為了獲得與SDM相關(guān)的語義信息。特別地,對象被分為組件、端點和資源。關(guān)系被分為下面幾種連接(也被成為通信)、包含、宿主、授權(quán)和引用。有關(guān)對象和關(guān)系的進(jìn)一步的細(xì)節(jié)將在下面提供。SDM包括“抽象定義”,其提供了系統(tǒng)成員的公共分類,為大部分系統(tǒng)提供了工具支持以及為在設(shè)計期間的定義檢測提供了基礎(chǔ)。一組抽象的定義為維護(hù)設(shè)計提供了全面的基礎(chǔ)。“具體定義”表示實體系統(tǒng)或數(shù)據(jù)中心的設(shè)計的各部分。通過選擇抽象定義以及提供一限定具體定義的屬性的數(shù)量和設(shè)定值的執(zhí)行過程,產(chǎn)生具體定義。利用這些具體定義的集合產(chǎn)生應(yīng)用程序。SDM也包括“約束條件”,即基于所允許地多組關(guān)系實例可參與的關(guān)系的模型限制。約束條件用于描述依賴于包含在一關(guān)系中的對象配置的必要條件。例如,約束條件可以用于確定在通信協(xié)議的每個端點上的參與者是否使用了一致的安全設(shè)置。LIM文件206和SDM文件204被輸入驗證部件208的接口和處理層210。接口和處理層210控制SDM文件204的驗證。驗證部件208也可以被稱為編譯器。接口和處理層210包括裝入器212、檢驗器214和模擬器218。裝入器212分析SDM文件204,并將任何的參考文件或者類型裝入到一個內(nèi)存類型空間中。SDM文件204定義了SDM類(例如,以XML形式),裝入器212將SDM文件翻譯成在內(nèi)存類型空間中的SDM類。檢驗器214檢查在SDM文件204中是否存在任何錯誤,為了使裝入器212裝入SDM文件204,檢驗SDM文件204是否正確書寫。如果檢驗器214或裝入器212檢查到錯誤,該錯誤將被返回到開發(fā)部件202,其包括會導(dǎo)致錯誤的問題的任何指示。檢驗器214也“遍歷”類型空間,檢查設(shè)置值、類型和SDM文件參考。典型地,如果檢驗器214或裝入器212檢查到錯誤,將中止設(shè)計期間的驗證。然后模擬器218通過調(diào)用下面將要討論的擴展引擎220、信息流引擎222以及約束引擎224,模擬由LIM文檔定義的環(huán)境。模擬器218遇到的任何錯誤都要返回給部件202(例如,作為結(jié)果226),其包括會導(dǎo)致錯誤的問題的指示。典型的,如果模擬器218遇到錯誤,錯誤的指示將返回給開發(fā)部件,但設(shè)計期間的驗證會繼續(xù)進(jìn)行。接口和處理層210調(diào)用擴展引擎220、信息流引擎222以及約束條件引擎224,來執(zhí)行SDM文件204的驗證。通常,擴展引擎220將創(chuàng)建基于SDM文件204的實體空間的操作組,用以添加需要的并包含傳值的子代和關(guān)系的實例和操作,或者正確刪除實例和關(guān)系。流引擎222”遍歷”實例“圖”并查找定義在實例上的流,以及將信息流中的值設(shè)定為合適的值。約束條件引擎224”遍歷”實例空間同時查找和評估每個約束條件成員。在某些的實施例中,如果所有的約束條件都被評估為真實的(也就是,所有的約束條件都滿足),并且在處理SDM文檔204時,驗證部件208沒有遇到錯誤,那么驗證部件208就數(shù)字標(biāo)記SDM文檔204。此數(shù)字簽名表示SDM文檔204已經(jīng)被成功的編譯了。SDM文檔204以任何各種不同的方式數(shù)字標(biāo)記,一般的包括產(chǎn)生一個基于SDM文檔204數(shù)字簽名以及一個于驗證部件208有關(guān)的公開/私人的密鑰對。這樣,數(shù)字標(biāo)記的SDM文檔可以隨后被認(rèn)為(舉例來說,當(dāng)使用他們的時候)已經(jīng)被驗證。已數(shù)字標(biāo)記的SDM文檔也被稱為已編譯SDM文檔。除了評估各種約束條件,驗證部件208也利用那些參考文檔的全名(以及任意版本)更新其它SDM文檔的說明書。于是,已編譯SDM文檔將包括這些全名。例如SDM文檔可以通過名字而不是版本信息,引入另一個SDM文檔并參考那個SDM文檔,并且當(dāng)驗證部件208引入那個參考文檔時,將識別被引入的那個文檔的版本并將其添加到該已編譯SDM文檔。這里的論述涉及包含在SDM文檔204中的各成員和定義。定義限定了如何在實例空間中創(chuàng)建一個實例。換句話說,定義限定了什么是可能的。成員描述了根據(jù)一個定義的特定用法或方案。例如,一個定義描述了對于一個特定的實例什么是可能的,一個構(gòu)建描述了哪個可能性被包含在一個特定的實例中。下面的表格說明了成員或定義的例子,也說明了每個成員或定義的總體描述。這里所討論的引擎參考了傳值成員、傳引用成員、擴展、監(jiān)聽程序以及最高級定義。傳值成員指一個成員,在擴展的過程中為此成員自動創(chuàng)建的實例。在某些的實施中,傳值成員不能是抽象的。傳引用成員指一個成員,擴展引擎不能在擴展期間為此成員自動創(chuàng)建實例。相反地,用于此事件地外源監(jiān)聽程序創(chuàng)建了該實例(例如,接口和處理層210可以在模擬期間創(chuàng)建該實例,或者可以在模擬或使用期間詢問(舉例來說,通過用戶接口)設(shè)計者或開發(fā)者來創(chuàng)建該實例)。擴展是指給定一個根實例然后實例空間就被該根實例填充的過程。根實例的所有成員都被遞歸創(chuàng)建。傳引用成員不是由擴展引擎創(chuàng)建的,而是由外部資源創(chuàng)建的。監(jiān)聽器(例如,模擬器218)在事件剛觸發(fā)時就被通知了。該事件的一個例子就是創(chuàng)建一個傳引用成員的需求。最高級定義是指在SDM文檔的根級限定的定義。SDM文檔一般只有一個最高級定義,,但是在可選擇的實施例中,一個SDM文檔可以有兩個或三個最高級定義。圖4是一個說明用于設(shè)計期間的驗證的示例性過程400的流程圖。此過程由圖2的驗證部件208執(zhí)行,并且可以以軟件、固件、硬件或它們的組合的方式執(zhí)行。響應(yīng)于創(chuàng)建、刪除或修改系統(tǒng)的請求,SDM文檔和任何與該SDM文檔有關(guān)的參考都被加載(步驟402),可選擇加載驗證該SDM文檔。在某些的實施例中,LIM文檔已經(jīng)被加載了并且由該LIM文檔描述的實例空間也已經(jīng)被創(chuàng)建了。但是,如果這些還么有進(jìn)行,那么就加載LIM文檔并且在步驟402中創(chuàng)建由該LIM文檔描述的實例空間。在某些的實施例中,在步驟402加載SDM文檔之前,由在這里描述的擴展、信息流和約束條件引擎創(chuàng)建LIM文檔描述的實例空間。然后進(jìn)行檢測,用以確定在加載SDM文檔的時候在SDM文檔或創(chuàng)建的類型空間中是否存在錯誤(步驟404)。步驟404中的檢測涉及SDM文檔本身的結(jié)構(gòu)或格式,而不涉及系統(tǒng)設(shè)計。例如,在步驟404中,進(jìn)行檢測是為了驗證SDM文檔的格式是正確(例如,文檔具有正確的XML格式),或者在SDM文檔中存在未知的元素和類型,或者SDM文檔中的類型參考是有效的,等等。如果存在任何錯誤,那么將返回這些錯誤的指示(步驟406)并且過程400結(jié)束。這些錯誤將例如,作為結(jié)果226返回給圖2中的開發(fā)部件202。但是,如果沒有錯誤,就選擇步驟402中加載的SDM文檔中的最高級定義。在某些實施例中,只有一個最高級定義。然后創(chuàng)建該選擇的最高級定義的實例(步驟410),并且擴展實例空間(步驟412)。該最高級定義被用作擴展的起點,其由圖4的擴展引擎410來執(zhí)行。實例空間是這樣擴展的分析該最高級的定義并創(chuàng)建根實例的每個成員的實例,然后分析每個創(chuàng)建的實例并創(chuàng)建他們的每個成員的實例,等等。此過程將在標(biāo)題“擴展引擎”之下詳細(xì)討論。當(dāng)基于最高級定義的擴展完成之后,識別由擴展的實例空間中的實例限定的信息流,并且將信息流中的值設(shè)定為適當(dāng)值(步驟414)。此過程將在標(biāo)題“信息流引擎”之下討論。估計信息流的值被設(shè)定后,就檢驗約束條件(步驟416)。作為約束條件檢驗的一部分,實例空間中的每個約束條件都要被驗證,這將在標(biāo)題“約束條件引擎”下面詳細(xì)討論。一般的,這些約束條件將對照模擬環(huán)境中的設(shè)置進(jìn)行驗證,而該模擬環(huán)境(例如,在LIM206中所描述的)是在驗證系統(tǒng)時所對照的。在檢驗完約束條件之后,將進(jìn)行關(guān)于SDM文檔中是否存在其它尚未選擇的任何附加最高級定義的檢驗(步驟418)。如果在SDM文檔中存在一個或多個其它附加最高級定義,那么就選擇此一個或多個其它的最高級定義(步驟420)并且處理返回到創(chuàng)建選擇的最高級定義的實例的步驟410。但是,如果不存在其它未選擇的最高級定義,將檢測是否檢測到任何錯誤(步驟422)。步驟422中的錯誤是指在步驟412的擴展、步驟414中的信息流及步驟416中的約束條件的檢測中產(chǎn)生的錯誤和/或警告。如果存在任何錯誤或警告,返回那些錯誤或警告的指示(步驟406),同時處理400結(jié)束。這些錯誤將被例如,作為結(jié)果226返回給圖2中的開發(fā)部件202。通過在步驟406中將錯誤和/或警告返回給開發(fā)部件202,或者步驟424中的成功的指示,SDM文檔204描述的系統(tǒng)的設(shè)計期間的驗證的結(jié)果將返回給開發(fā)部件202。這些錯誤和/警告或者成功的指示也可以顯示給使用開發(fā)部件202的設(shè)計者,用以允許告知設(shè)計者設(shè)計后(并在SDM文檔204中描述)的系統(tǒng)是否已經(jīng)被驗證過,或者是否存在潛在的問題。通過將特定錯誤和/或警告的指示返回給設(shè)計者,可以更好地通知設(shè)計者潛在的問題是什么以及如何解決他們(或者是否有必要解決它們)。此反饋可以在設(shè)計過程中返回給設(shè)計者,而不需要設(shè)計者在發(fā)現(xiàn)設(shè)計的系統(tǒng)中存在問題之前,將系統(tǒng)配置在一個數(shù)據(jù)中心上。模擬如上所述,圖2的接口和處理層210模擬了LIM文檔206中定義的環(huán)境。這就允許在系統(tǒng)的設(shè)計期間對照預(yù)期的環(huán)境驗證SDM文檔204描述的系統(tǒng),以便在將系統(tǒng)配置到環(huán)境中去之前就識別出錯誤。實例空間中的許多實例可以由擴展引擎創(chuàng)建,這將在以下詳述。但是某些實例由模擬器218創(chuàng)建而不是由擴展引擎創(chuàng)建。在某些實施例中,由模擬器218創(chuàng)建的實例是最高級的定義并且是傳引用成員。在某些實施中,每個最高級定義在其自己的實例空間中被模擬。模擬器218模擬在已編譯文檔的根部發(fā)現(xiàn)的兩種類型的定義(這些被稱為最高級的定義)(1)系統(tǒng)定義,以及(2)其中主機和客機是系統(tǒng)定義的宿主關(guān)系定義。這兩種類型的定義是由模擬器218創(chuàng)建實例的相當(dāng)獨立的定義。其它的定義通常僅僅用在其它定義的上下文中,從而由擴展引擎220創(chuàng)建。在某些實施例中,模擬器218并不模擬抽象的定義,這樣典型地導(dǎo)致少量的,即便要,有意義的驗證。通過創(chuàng)建定義的實例并且將此實例添加為實例空間的根實例來模擬系統(tǒng)定義。然后通過調(diào)用擴展引擎220例示該實例的成員和嵌套成員。宿主定義的模擬提供了主機和客機之間的驗證。在某些實施例中,宿主關(guān)系的實例并不用作根實例,這樣看來,特殊的根實例在調(diào)用擴展引擎之前就創(chuàng)建好了。這個特殊的根實例是具有三個成員的系統(tǒng)定義(1)關(guān)于宿主關(guān)系的主機的系統(tǒng)定義;(2)關(guān)于宿主關(guān)系的客機的系統(tǒng)定義;(3)與第一個兩成員的主機和客機系統(tǒng)定義的實例有關(guān)的宿主關(guān)系定義。然后調(diào)用擴展引擎222例示該特殊的根實例的成員和嵌套成員。擴展引擎220并不創(chuàng)建傳引用成員的實例,因為要創(chuàng)建的實例的數(shù)量是未知的并且要由配置環(huán)境確定。另外,傳引用成員可以是抽象的,這樣用于例示組成成員的具體定義就是未知的。人為干預(yù)(例如,系統(tǒng)管理員所帶來的)通常用于回答在配置期間的問題。可選地,這樣的干預(yù)也可用在設(shè)計期間的驗證期間。但是,更典型地,接口和處理層210(例如模擬器218)會如下模擬人類操作員可能的選擇,這樣就減輕了在模擬期間對人為干預(yù)的需要。模擬器218創(chuàng)建一定數(shù)量的組成成員的實例,該數(shù)量等于一個或者發(fā)生的事件的最小數(shù)量中的比較大的數(shù)(例如,由傳引用成員在一參數(shù)MinOccurs中指定)。如果傳引用成員是抽象的,那么模擬器218就不創(chuàng)建該成員的實例,但是會向用戶返回一個警告信息(例如,表示不能模擬一個抽象的傳引用成員)。擴展引擎擴展引擎220允許向驗證部件208輸入主要的命令,并且將那些命令展開以識別這些命令所作用的正確的對象和關(guān)系。典型地,這些主要的命令是用于創(chuàng)建或刪除特定對象或關(guān)系的命令(例如,創(chuàng)建一個網(wǎng)絡(luò)應(yīng)用程序的命令,或刪除一個網(wǎng)絡(luò)應(yīng)用程序的命令)。為了創(chuàng)建一基于SDM文件204的實例空間而添加所有附加實例和網(wǎng)絡(luò)包括傳值子代和關(guān)系所需的動作,或者刪除恰當(dāng)?shù)膶嵗完P(guān)系,擴展引擎220展開一組操作。最初,在模擬期間創(chuàng)建了最高級定義的實例(也稱為最高級實例)后,調(diào)用擴展引擎220來填充此實例空間。根實例作為擴展的起始位置傳給擴展引擎。通過擴展而創(chuàng)建的實例會與根實例相關(guān)聯(lián)。一特殊實例空間第一次調(diào)用擴展引擎220時,傳給擴展引擎220的根實例是最高級的實例(最高級定義的實例)。但是,擴展引擎220可以并且典型地被遞歸調(diào)用,這樣最高級實例的成員和嵌套成員才能稱為此遞歸調(diào)用的根實例。擴展引擎220由創(chuàng)建根實例的每個成員的實例開始。由于要例示每個成員,就要檢查每個嵌套成員。任何在另一個成員內(nèi)部定義的成員都被稱為嵌套在其它成員之內(nèi)??梢酝ㄟ^多級嵌套成員(例如,一個成員可以具有定義在其內(nèi)部的嵌套成員,并且這些成員的每一個都可以有定義在他們中的嵌套成員,依次可具有定義在其內(nèi)部的嵌套成員等等)??梢栽诿總€成員和嵌套成員上遞歸執(zhí)行擴展過程,直到已經(jīng)完全建立根實例的實例空間。在某些實施例中,在擴展過程中僅僅例示各種成員的子集。在擴展過程中創(chuàng)建的此實例的子集包括以下對象成員子系統(tǒng)、資源以及端點。在擴展過程中創(chuàng)建的此實例子集還包括下面的關(guān)系成員包含、通信、宿主、授權(quán)以及參考。其它不包括在此子集中的成員就不被擴展過程所例示,而是在擴展過程創(chuàng)建上述實例之一時,創(chuàng)建過程檢查成員或定義并自動為其它成員創(chuàng)建其子成員的實例。這些其它成員的例子包括信息流成員和約束條件成員。在某些實施例中,在調(diào)用擴展引擎220時,成員的實例已經(jīng)存在的情況下,就不再創(chuàng)建該實例。但是擴展引擎220繼續(xù)對每個實例遞歸從而驗證其實例空間是否完全創(chuàng)建(并且從沒有創(chuàng)建的遞歸調(diào)用中創(chuàng)建一些嵌套成員)。圖5A和5B是一個說明創(chuàng)建一示例空間的示例性的遞歸擴展過程500的流程圖。此實例空間由SDM文檔定義,例如圖2中的SDM文檔204。過程500由圖2中的擴展引擎220完成,并且可以以軟件、固件、硬件或它們的組合的形式執(zhí)行。最初,訪問一個實例定義(步驟502)。在調(diào)用后,擴展引擎220被告知有一個要擴展的實例定義(如此部分已經(jīng)討論的根實例),并且在步驟502中訪問此實例定義。此實例定義將傳給擴展引擎220,也可以傳送一個表示此實例定義的所在位置的標(biāo)識符(例如,一指針),或者可以通知從何處和/或如何訪問此實例定義。在此實例定義是最高級定義的情況下過程500可以被模擬器218調(diào)用,或者可選擇地可以被過程500本身遞歸調(diào)用。然后選擇實例定義的一個組成成員(步驟504)??梢砸匀我忭樞蜻x擇實例定義中成員,一般以它們出現(xiàn)在定義實例空間的SDM文件的順序進(jìn)行選擇。在某些實施例中,所有對象成員在所有關(guān)系成員之前進(jìn)行選擇。然后對于選擇的成員是對象成員還是關(guān)系成員進(jìn)行檢查(步驟506),同時根據(jù)檢查的結(jié)果繼續(xù)進(jìn)行過程500。如果選擇的成員是對象成員,那么就檢查在創(chuàng)建的實例空間中是否存在正確數(shù)量的所選擇的成員的實例(步驟508)。每個成員都包括一個關(guān)于要創(chuàng)建多少成員的實例的指示。在某些實施例中,使用一個實例的默認(rèn)值,這樣除非該成員指定了要創(chuàng)建更多的實例,否則每個成員只創(chuàng)建一個實例(無論在此成員中是否顯性指定)。如果尚未存在正確數(shù)量的實例,那么就檢查該對象成員是否是一個傳值成員(步驟510)。如果對象成員是一個傳值成員,那么就創(chuàng)建最小數(shù)量的該成員定義中所指定存在的對象成員(步驟512)。但是,如果該對象成員不是傳值成員,那么它就是傳引用成員,這樣就觸發(fā)一個事件,其允許監(jiān)聽器(例如圖2的模擬器218)從而創(chuàng)建傳引用成員的實例(步驟514)。創(chuàng)建對象成員的實例之后,不管是在步驟512或步驟514,或者如果在步驟508中確定已經(jīng)存在正確數(shù)量的成員實例,過程500進(jìn)行到步驟516。在步驟516中,過程500,為在步驟512或步驟514中創(chuàng)建的實例的每個成員實例(或者確定已經(jīng)在步驟508中創(chuàng)建的實例)調(diào)用過程500。當(dāng)遞歸調(diào)用過程500時,調(diào)用過程500的每個成員實例都成為每個調(diào)用的過程500的實例定義。這樣,根據(jù)實例成員遞歸調(diào)用過程500,直到在實例空間中創(chuàng)建了所有的實例。另外,還要進(jìn)行檢測是否在在步驟504中沒有選擇的實例定義中還有附加成員(步驟518)。如果在實例定義中還存在一個或多個附加成員,那么步驟500返回到步驟504從而選擇這些成員中的一個。但是,如果在實例定義中不存在此附加成員,那么這些實例定義的步驟500就完成了。返回到步驟506,如果選擇的成員是一個關(guān)系成員,過程500根據(jù)包含在此關(guān)系中的源實例的數(shù)量和目標(biāo)實例的數(shù)量,確定要創(chuàng)建的關(guān)系實例的數(shù)量(圖5B的步驟522)。通過將原實例的數(shù)量和目標(biāo)實例的數(shù)量相乘確定要創(chuàng)建的關(guān)系實例的數(shù)量,相乘的結(jié)果就是要創(chuàng)建的關(guān)系實例的數(shù)量(步驟524)??蛇x擇地,將原實例的數(shù)量與目標(biāo)實例的數(shù)量相乘的結(jié)果可以得到關(guān)系實例的最大值,而在步驟524中僅僅創(chuàng)建該最大數(shù)量的一個子集。例如,存在多個可以使用的主機,在步驟524中可能僅僅選擇一個。類似于上述的傳引用成員,基于選擇的關(guān)系實例的子集,調(diào)用監(jiān)聽器(例如,人類操作員或者模擬器218)。模擬器218可以利用例如,用于確定要創(chuàng)建的關(guān)系實例的子集的不同條件或規(guī)則進(jìn)行配置或編程。根據(jù)關(guān)系成員的類型以不同方式創(chuàng)建該關(guān)系實例。在某些實施例中,可以使用關(guān)系組成成員的類型如下包含定義成員、通信定義成員、參考定義成員、宿主定義成員、以及授權(quán)定義成員。包含定義成員是一個一對多的關(guān)系,其將每個實例的父體和子成員聯(lián)系起來。包含定義成員描述了一個對象成員可以包含另一個對象成員。通信定義成員是一個多對多的關(guān)系,其將所有的服務(wù)器和客戶機成員實例的組合聯(lián)系起來。通信定義成員描述了獨立配置的軟件單元之間的相互作用。參考定義成員一個多對多的關(guān)系,其將所有的依靠原成員定義的組合聯(lián)系起來。參考定義成員用于取得實例間的從屬性(除宿主關(guān)系定義成員外)。這些從屬性可以用于,例如在配置過程中控制構(gòu)造順序以及在安裝和更新過程中控制系統(tǒng)間信息流參數(shù)。宿主定義成員是一對多的關(guān)系,其將一個宿主和每個客戶機的成員實例相關(guān)聯(lián)。宿主關(guān)系成員用于識別為了被構(gòu)造,一個客機需要一個主機。授權(quán)定義成員是一個一對一的關(guān)系,其將與兩個系統(tǒng)的通信端點相關(guān)。授權(quán)定義成員用于從一個系統(tǒng)向另一個系統(tǒng)傳送一個行為(例如,傳送一個系統(tǒng)直接到其他系統(tǒng)的端點的所有交互作用)。對于關(guān)系的每個實例,該關(guān)系實例都與源和目標(biāo)實例相聯(lián)系(步驟526)。然后過程500返回圖5A的步驟518,檢測在實例定義中是否存在要選擇的其他成員。因此遞歸調(diào)用過程500,在遞歸調(diào)用該過程的過程中,創(chuàng)建了不同的對象和關(guān)系實例。該遞歸擴展過程可以了解當(dāng)已經(jīng)創(chuàng)建了所有的成員實例時何時完成實例空間的創(chuàng)建。由于擴展過程的遞歸特性,產(chǎn)生的實例與作為圖2中的信息流引擎222和約束條件引擎224的入口點的最頂層實例相互連接。這樣創(chuàng)建的實例空間可以被看作是實例樹,其中樹的每個節(jié)點都表示一個成員實例。另外,樹的每個節(jié)點(最高層節(jié)點除外)都連接到一個父節(jié)點,該父節(jié)點表示調(diào)用擴展過程為創(chuàng)建樹節(jié)點而調(diào)用擴展處理的成員實例。進(jìn)一步地,樹的每個節(jié)點都與零個或更多的子節(jié)點相連,該子節(jié)點是樹節(jié)點的成員實例的成員。當(dāng)葉成員確實沒有任何嵌套成員的時候(例如,所有的葉成員都有零個子節(jié)點),該遞歸擴展過程就知道何時完成創(chuàng)建實例圖。另外,為了避免由于一個定義具有一個和它同類型的成員而使得擴展過程無線循環(huán)下去,如果一定義并沒有被例示為祖先實例,在某一特定的實施例中,實例擴展過程僅僅選擇創(chuàng)建該實例。例如,如果存在一個目錄的定義,并且該定義在其內(nèi)部還具有一個目錄,那么一旦存在單個目錄,擴展引擎就停止擴展過程。信息流引擎在擴展引擎220完成擴展處理后,調(diào)用擴展處理產(chǎn)生的實例空間中的信息流引擎222。信息流引擎222“遍歷”實例空間的實例圖,并且發(fā)現(xiàn)實例圖中定義的信息流實例。然后信息流引擎222將信息流中的值設(shè)置成適當(dāng)值??梢栽赟M文件204的定義中說明設(shè)置,并且相應(yīng)的設(shè)置值可以存在于由這些定義創(chuàng)建的實例中。設(shè)置值可以是非計算設(shè)置值或者計算的設(shè)置值。非計算設(shè)置值是由來自定義的默認(rèn)值或初始值設(shè)置的設(shè)定值,或者是由明確設(shè)定值的用戶設(shè)定的值。非計算設(shè)置值可以被限定在創(chuàng)建其所屬的SDM實例時,來設(shè)置,或者可選擇地,在SDM實例的生命期中改變。非計算設(shè)置值并不是信息流的輸出,但是它們可以作為信息流的輸入。計算的設(shè)置值是一個信息流的輸出的設(shè)定值。因此,信息流可以將值設(shè)置為計算后的設(shè)定值的值,但是其它的實體一般不可以。在某些實施中,僅僅存在一個信息流來給該值提供一個特定的計算的設(shè)置值。在某些實施中,如果多個信息流輸出給相同的設(shè)置值實例,那么就報告錯誤并且信息流的輸出設(shè)定為錯誤狀態(tài)。計算的設(shè)置值基于一個或多個輸入。這些輸入可以是計算的設(shè)置值和/或非計算設(shè)置值。在某些實施例中,計算設(shè)置值可以被分為兩類配置值和非配置值。配置值是由信息流計算的值,此值產(chǎn)生將之作為一部分的SDM實例配置。例如一個文件或者數(shù)據(jù)庫名的完全路徑可以是配置值。非配置值是由信息流計算但不產(chǎn)生配置的值。反而,他們僅僅作為約束條件的交換值。例如,考慮所有繼承的web.config的最終web.config設(shè)置就是一個非配置值。另一個非配置值的例子是考慮了文件的包含目錄和內(nèi)容以及關(guān)于該文件的配置的訪問控制列表的該文件的最終訪問控制列表。信息流引擎222隨意不同地處理設(shè)置值和非設(shè)置值。例如,可以給配置值一個較高的優(yōu)先級,這樣可以在設(shè)置非配置值的信息流之前國際設(shè)置配置值的信息流。一般來說,通識別實例空間中的信息流實例以及識別該信息流實例的輸入值(例如,識別作為這些輸入的源的其它實例的設(shè)定值)來估計信息流的值。信息流實例引用一指令模塊和一組指令,此指令模塊或此組指令可以處理相應(yīng)于該信息流實例的信息流函數(shù)。根據(jù)輸入的值處理信息流函數(shù),并獲得該信息流函數(shù)的結(jié)果。該信息流函數(shù)的結(jié)果設(shè)置為信息流實例的輸出。一個信息流可以有零或多個輸入值,以及一個或多個輸出(例如,一個或多個實例的設(shè)置值可以根據(jù)該信息流的輸出進(jìn)行設(shè)置)??梢允褂酶鞣N信息流函數(shù)的任何一種。信息流函數(shù)可以由系統(tǒng)開發(fā)者和/或其他人員定義。例如,與創(chuàng)建SDM文件204相同的設(shè)計者可以定義一個或多個信息流函數(shù)。作為在另一個例子中,開發(fā)部件202的制造商或某些其他第三方開發(fā)者都可以定義一個或多個信息流函數(shù)。信息流函數(shù)本身也可以包括任何不同的計算和/或操作,例如運用代數(shù)、幾何、微積分等的運算,基于日期和/或時間的計算,隨機值計算,等等。在某些實施例中,定義在SDM文件中的信息流成員與管理器定義有關(guān)。反過來,管理器定義包括一個指針,該指針指向一組可以執(zhí)行處理信息流函數(shù)的指令或代碼。這樣,為了估計用于一個信息流實例的信息流,確定該相關(guān)的管理器定義并且例示該相關(guān)的管理器(如果還沒有例示的話)。從該管理器中獲得指向指令或代碼組的指針,為了確定該信息流的輸出,允許獲得并執(zhí)行該指令或代碼組。另外,在某些實施例中,該管理器也支持類型變換。在這樣的實施例中,管理器允許一個信息流基于兩個或更多的不同類型的設(shè)置值。例如,輸入值可以是一個與輸出類型不同的類型。管理器提供了一個或多個允許作出這樣的類型轉(zhuǎn)換的方法,或者可選擇的包括了一個指針,該指針指向用于執(zhí)行該轉(zhuǎn)換的一組可獲得的并且可執(zhí)行的指令或代碼。不同的管理器支持不同的轉(zhuǎn)換(例如,管理器設(shè)計者可以將管理器設(shè)計為支持任何他們想要的類型轉(zhuǎn)換)。圖6A和6B是一個說明用于評估信息流的示例性過程600的流程圖。過程600由圖2重的信息流引擎222執(zhí)行,并且可以以軟件、固件、硬件或者它們的組合的方式執(zhí)行。最初,找出實例空間中的關(guān)于實例的所有設(shè)置(步驟602)。這些設(shè)置可以以不同的方式發(fā)現(xiàn),諸如通過檢查用于設(shè)置值的實例圖中的每個節(jié)點的方式。然后標(biāo)識出實例空間中的所有的信息流實例(步驟604)。實例空間中的每個信息流實例都被標(biāo)識為“臟的”并且“未訪問”(步驟606)。標(biāo)記“臟的”表示該信息流尚未被執(zhí)行或者求值。標(biāo)記“未訪問”表示該信息流的執(zhí)行或求值還沒有開始。信息流實例的標(biāo)記可以以各種不同的方式執(zhí)行。例如,每個信息流可以有一個“臟的”標(biāo)志位,其可以設(shè)置為標(biāo)記該信息流為“臟的”,并且“沒有被訪問”的標(biāo)志位可以設(shè)置為標(biāo)記該信息流為“沒有被訪問”。作為另一個例子中,信息流引擎222可以保存一個列表、表格或其它數(shù)據(jù)結(jié)構(gòu),在其中引擎222可以保存一個信息流實例的記錄以及它們的相關(guān)標(biāo)記。然后確定接收作為信息流實例的結(jié)果的值的設(shè)置(步驟608)。在步驟608中,確定所有計算的設(shè)置值。設(shè)定本身表示它們是不是計算的設(shè)定值或者非計算設(shè)定值(例如,它們可以具有一個標(biāo)志或?qū)傩?,例如一個“固定的”屬性,其可以被設(shè)置為表示它們是非計算設(shè)定值)(在不周608也可產(chǎn)生識別值從屬性的從屬性圖)。從屬性圖為每個設(shè)定值表示它依靠哪個其他設(shè)定值(即,此其它設(shè)定值是其輸入)以及哪個其他設(shè)定值依靠它(即,用它作為輸入值的其它設(shè)定值)。然后選擇在步驟604中標(biāo)識為“臟的”并且“未訪問”的信息流實例的其中之一(步驟610)。信息流實例可以以任何順序選擇,諸如,以信息流在步驟604中被標(biāo)識的順序、隨機的、基于輸入值的編號,等等。然后將該選擇的信息流實例標(biāo)記為“已訪問”,但是保持為“臟的”標(biāo)記(步驟612)。這就表示與信息流實例有關(guān)的信息流的求值或執(zhí)行已經(jīng)開始,但是該信息流還沒有被執(zhí)行或者求值(例如,該信息流的輸出值還沒有確定)。然后標(biāo)識信息流實例的輸入值(步驟614)。每個信息流實例具有一個表示每個輸入源(例如,另一實例的一特定設(shè)置值)的參數(shù)。然后檢查該標(biāo)識的輸入是否被賦值(圖6B的步驟616)。非計算設(shè)置值輸入已被賦值,正如由已被求值的信息流實例計算的已計算設(shè)置值輸入。但是由未被估計的信息流實例計算的已計算設(shè)置值將不被賦值(例如,它們可能有一個空值)。如果一個或多個指定的輸入還沒有被賦值,那么就暫停這個信息流實例(在步驟610中選擇)的求值(步驟618)。暫停求值是為了計算輸入值。對于每個還沒有值的輸入,識別設(shè)定輸入值的信息流實例(步驟620)。然后過程600返回到圖6a中的步驟612來開始求信息流實例的值(步驟622)。然后當(dāng)所有的輸入都具有其值的時候,在步驟618暫停的信息流的求值就重新開始(步驟624)。例如在下面將要討論的步驟616或者步驟626中,可以恢復(fù)求值。應(yīng)當(dāng)注意的是,在步驟620中標(biāo)識的一個或多個信息流實例的求值可以由于標(biāo)識的輸入還沒有值而自行中止。返回到步驟616,如果標(biāo)識的輸入具有了值,那么輸入的值從其源處獲得(步驟626)。該值可以從不同的源獲得,例如,從SDM文件204、從根據(jù)SDM文件204例示的對象實例、從信息流實例(信息流的輸出),等等。然后識別用于執(zhí)行求信息流成員的信息流函數(shù)的值的指令或代碼組(步驟628)。可選擇的,與其運行一組指令或代碼,該信息流函數(shù)還不如由硬件執(zhí)行。然后執(zhí)行這組指令或代碼,然后指令或代碼的執(zhí)行結(jié)果被用作信息流實例的輸出(步驟603),其也被稱為信息流的輸出。然后將信息流標(biāo)記為“不臟”,用以表明該信息流已經(jīng)被執(zhí)行或求值(步驟632)。該信息流應(yīng)該已經(jīng)在步驟612中被標(biāo)記為“已訪問”,但是,如果該信息流沒有被標(biāo)記為“已訪問”,那么在步驟632中將該信息流實例標(biāo)記為“已訪問”。然后檢查在實例中間是否還存在其它的被標(biāo)記為“臟的”或“未訪問”的信息流實例(步驟634)。如果還存在任何其他實例,那么過程返回到圖6A的步驟610,用于選擇此信息流實例之一。當(dāng)所有的信息流實例都被求過值之后(例如在步驟604中沒有一個信息流實例被標(biāo)記為“臟的”或“未被訪問過”),然后信息流求值過程600結(jié)束(步驟636)。當(dāng)信息流結(jié)束,模擬器218有了一個具有設(shè)定值的完整的實例空間。在圖6A和6B中的過程600被描述為,暫停具有輸入但是還沒有值的信息流實例的求值,并且求設(shè)置這些值的信息流實例的值。但是過程600也可以以可選方式執(zhí)行。例如,與其求設(shè)置那些值的信息流實例的值,過程600可以返回到選擇一個信息流實例的圖6A的步驟610(不考慮其是否為暫停的信息流設(shè)定了一個輸入值)。在此可選擇的方式中,信息流的求值可以導(dǎo)致完成某些信息流實例的求值而其它信息實例的求值被暫停了的情況。當(dāng)發(fā)生這種情況的時候,可以重復(fù)步驟616用以為每個暫停的信息流實例確定標(biāo)識的輸入是否具有值。至少有一個被暫停的信息流實例的輸入具有值,并且重復(fù)步驟616的過程可以一直進(jìn)行,直到所有的信息流實例都被求值了。信息流引擎222也檢測圖6A和6B中的信息流求值過程中的循環(huán)引用。循環(huán)引用指一個或多個信息流實例中每一個至少它們的屬性之一都依靠(直接或間接)其他的輸出。例如,信息流實例A具有一個輸出值,該值也是信息流實例A的輸入值。在另一個例子中,信息流實例A的輸入值源自信息流實例B的輸出,但是信息流實例B的輸入值源自信息流實例A的輸出值。還一個例子,信息流實例A的輸入值源自信息流實例B的輸出,信息流實例B的輸入值源自信息流實例C的輸出,而信息流實例C的輸入值源自信息流實例A的輸出。這樣的循環(huán)引用不能被求值,但是信息流引擎222還能檢測它,并且在此循環(huán)引用中的設(shè)置值被設(shè)置為錯誤狀態(tài)。循環(huán)引用可以利用“臟的”和“已訪問”標(biāo)記被檢測出。在上面討論的步驟618中當(dāng)暫停了一個信息流的求值的時候,該信息流被標(biāo)記為“已訪問”,但是也被標(biāo)記為“臟的”,并且開始另一個信息流的求值。該另一個信息流的求值也可以被暫停,等等。如果在此信息流求值的暫停期間,一個被求值的信息流已經(jīng)在前面被標(biāo)記為“已訪問”并且仍然是“臟的”,那么就檢測到一個循環(huán)引用。換句話說,一個或多個信息流被暫停,并且在該暫停期間,求值所選擇的另一個信息流也已經(jīng)被標(biāo)記為“已訪問”和“臟的”,那么由于另一個求值所選擇的信息流的求值也已經(jīng)被暫停了,就檢測到了一個循環(huán)引用??蛇x擇地,可以以其它任何不同的方式檢測循環(huán)引用。例如,在上面討論的步驟618中可以創(chuàng)建表示值從屬性的從屬關(guān)系圖,此從屬關(guān)系圖可以用于識別循環(huán)引用。當(dāng)檢測到循環(huán)引用時,此循環(huán)引用的所有信息流都被標(biāo)記為錯誤(例如,循環(huán)信息流錯誤)。檢測到循環(huán)引用時所進(jìn)行求值的信息流是此循環(huán)引用的一部分,在檢測到循環(huán)引用時從正在進(jìn)行求值的信息流接受輸入的其它信息流以及從這些信息流之一接收輸入的每一個其它信息流也是此循環(huán)引用的一部分。然后停止所有的作為此循環(huán)引用的一部分的信息流的求值。這些信息流都被標(biāo)記為“已訪問”和“臟的”,這樣才能繼續(xù)進(jìn)行其余的信息流。應(yīng)當(dāng)注意到的是,信息流可以是確定性的或非確定性的。確定性的信息流在任何時候用特定的輸入值集合調(diào)用它時,都輸出相同的值。例如,信息流可以輸出兩個輸入值的和。由于信息流總是給定特定的輸入值集合而輸出相同的值,因此這樣的信息流被稱為是確定性的。然而,非確定性的信息流在每次用相同的輸入值集合調(diào)用它時,都可以輸出不同的值。例如,根據(jù)一個輸入值,信息流產(chǎn)生一個隨機數(shù)。由于該信息流可以在每次用相同輸入值調(diào)用時,都產(chǎn)生一個不同的隨機數(shù),因此此信息流被稱為非確定的。不具有輸入值的信息流可以是確定的(總是輸出相同的值)或非確定的(每次調(diào)用時都輸出不同的值)。在某些實施例中,設(shè)定值可以有一個錯誤狀態(tài)。當(dāng)處于一個錯誤狀態(tài)時,設(shè)定值可以保留錯誤信息(例如,錯誤代碼或者錯誤的描述)。如果設(shè)定值不保留錯誤信息,那么此錯誤信息將會以其它的某種方式報告(例如,通過將設(shè)置置為錯誤狀態(tài)的事件)。一個設(shè)定值可以以不同的方式被設(shè)為錯誤狀態(tài)。例如,當(dāng)在執(zhí)行一個信息流的過程中發(fā)生錯誤時(例如,由于信息流返回錯誤;由于信息流引擎不能執(zhí)行信息流,諸如當(dāng)信息流引擎檢測到一個循環(huán)引用或者由于輸入問題不能運行一個信息流;等等),信息流引擎222將此信息流的輸出值設(shè)為錯誤狀態(tài)。錯誤狀態(tài)可以通過信息流傳播,這樣具有錯誤狀態(tài)的輸入的任何信息流將會使信息流引擎將此錯誤狀態(tài)傳播給其輸出。此錯誤狀態(tài)最終會被信息流引擎222返回給開發(fā)部件202(例如,作為圖2的結(jié)果226)??蛇x擇地,引起源錯誤的事件也會被信息流引擎222返回給開發(fā)部件202(例如,作為圖2的結(jié)果226),而是通過該信息流返回錯誤狀態(tài)的傳播結(jié)果。另外,在某些實施例中,一個信息流的輸入和/或輸出涉及當(dāng)前并不存在的實例(例如,輸入或輸出可以涉及還沒有創(chuàng)建的成員)。當(dāng)一個信息流的輸入涉及當(dāng)前并不存在的實例的時候,如果對該信息流定義默認(rèn)值,該輸入就被認(rèn)為被復(fù)位或還原為一個默認(rèn)值(例如,被還原為一個指定的值)。在信息流中不存在這樣的指定,那么它將被還原為一個該成員的數(shù)據(jù)類型的默認(rèn)值。當(dāng)一個信息流的輸出涉及一個當(dāng)前不存在的實例,那么就不使用此輸出值。如果信息流的輸出不存在,那么信息流由于其沒有被設(shè)為任何值,就不必執(zhí)行。但是,即使當(dāng)前所有的輸入都不存在,如果至少存在一個輸出,該信息流將被運行。也可以假設(shè)設(shè)計期間的驗證允許繼承的設(shè)置模式。繼承的設(shè)置是指實例空間具有一層次結(jié)構(gòu)的對象,并且設(shè)置值可以用于一對象并使得此值用于此對象層次結(jié)構(gòu)之下的所有對象。實際上,這為在該對象下面的那些對象創(chuàng)建了一個默認(rèn)值,除非在該對象下面的那些對象不考慮該默認(rèn)值并具有它們自己的明確的適用值。這些可以被稱為對象的適用設(shè)置(該設(shè)置用于一個特定的對象)和對象的結(jié)果設(shè)置(將適用設(shè)置和繼承其父對象的設(shè)置合并的結(jié)果)。此繼承的設(shè)置可以用于不同的方式。在某些實施例中,此繼承的設(shè)置可以在SDM文件204的創(chuàng)建期間使用。SDM文件204的設(shè)計者知道此繼承的設(shè)置存在的位置,并在SDM文件204的設(shè)計中考慮到它們。例如,SDM文件204的設(shè)計者可以說明此適用設(shè)置和結(jié)果設(shè)置,但是約束條件正好與此結(jié)果設(shè)置相反。在可替換的實施例中,每個設(shè)置都具有適用設(shè)置值和結(jié)果設(shè)置值。這樣,在一個實例中的每個設(shè)置都受兩個值的影響而不是一個值。適用設(shè)置值是由該值的初始化或者明確設(shè)置的值設(shè)置。結(jié)果設(shè)置值由信息流設(shè)置。默認(rèn)地,參考該設(shè)置會得到該結(jié)果設(shè)置值,除非沒有信息流設(shè)置它,在這種情況下,它們將獲得適用設(shè)置值。在另一方面參考一個信息流的輸出會涉及默認(rèn)的結(jié)果值。另外,所有的引用都可以任意向明確參考兩個設(shè)置值的其中之一添加一個值類型限定符。典型地,每次對信息流進(jìn)行求值,都使信息流的輸出發(fā)生改變。也就是說,信息流的執(zhí)行可以導(dǎo)致重寫該信息流的任何以前的輸出。但是,在每個設(shè)置都具有適用設(shè)置值和結(jié)果設(shè)置值的實施例中,每個信息流可以將使用設(shè)置值作為其輸入之一寫入。給定一個恰當(dāng)?shù)耐贫ǖ男畔⒘骱瘮?shù),會導(dǎo)致信息流的輸出成為附加到其它信息流的輸入的適用設(shè)置。這樣,在這些實施例中,可能會在實際上具有一個附加到一個信息流輸出的新的輸入。約束條件引擎為了為由SDM文檔204定義的系統(tǒng)評估約束條件,模擬器218調(diào)用約束條件引擎224。由約束條件引擎224執(zhí)行的評估相對于環(huán)境評估在SDM文檔204中定義的約束條件(驗證該環(huán)境是否滿足由SDM文檔204提出的約束條件),和/或相對于在SDM文檔204中定義的系統(tǒng)評估環(huán)境定義的約束條件(驗證在SDM文檔204中定義的系統(tǒng)是否滿足由系統(tǒng)提出的約束條件)。約束條件引擎224“遍歷”實例空間,并查找和評估每個約束條件。約束條件引擎224既評估由SDM文檔204定義的約束條件,也評估由LIM文檔206定義的約束條件。一般地,在信息流引擎222完成信息流的求值后,模擬器218調(diào)用約束條件引擎224,這樣就能在擴展以及信息流求值處理所得到的實例空間的基礎(chǔ)上,執(zhí)行約束條件的檢查。但是,在可替換的實施例中,可以在信息流引擎222完成信息流的求值之前,調(diào)用約束條件引擎224。約束條件可以采用不同的形式,在特定的實施例中,約束條件包括設(shè)置約束條件、關(guān)系約束條件以及對象約束條件。設(shè)置約束條件約束了一個對象的設(shè)置并且由管理器或代碼返回從而執(zhí)行此評估。關(guān)系約束條件約束了一個對象可以參與的關(guān)系。對象約束條件約束了在一個關(guān)系中的對象。典型地,約束條件定義標(biāo)識了一個應(yīng)用約束條件的目標(biāo)定義,并且進(jìn)一步限定了該約束條件是什么。在一個設(shè)置約束條件的情況下,一組指令或代碼(或者可選擇的為一個硬件模塊)與該約束條件(例如,由約束條件定義指定)相關(guān)聯(lián),該指令或代碼可以被執(zhí)行用以評估目標(biāo)是否滿足約束條件。在特定的實施例中,該約束條件與一個指向一組指令或代碼的管理器定義相關(guān)聯(lián),并類似于上述關(guān)于信息流評估的討論中的管理器定義。圖7A-7E是一個說明評估約束條件的示例性處理700的流程圖。處理700由圖2中的約束條件引擎224執(zhí)行,并且可以以軟件、固件、硬件或者它們的組合的方式執(zhí)行。最初,識別實例空間中的所有的約束條件(步驟702)。步驟702中的識別包括識別設(shè)置約束條件、關(guān)系約束條件以及對象約束條件。步驟702中的識別既可以識別由系統(tǒng)(例如SDM文檔204中)限定的約束條件,也可以識別由環(huán)境(例如LIM文檔206中)限定的約束條件。然后選擇一個識別的約束條件(步驟704)。該約束條件可以以任何不同的方式選擇。例如,約束條件可以以它們在步驟702中標(biāo)識的順序進(jìn)行選擇,不同類型的約束條件可以在其它類型之前選擇(例如,設(shè)置約束條件可以在關(guān)系約束條件前面選擇),可以隨機選擇約束條件,等等。然后根據(jù)該約束條件是關(guān)系約束條件、設(shè)置約束條件還是對象約束條件,評估該選擇的約束條件。如果該約束條件是一個設(shè)置約束條件,那么就從該約束條件的目標(biāo)實例中獲得適當(dāng)值(步驟706)。此約束條件識別要評估的目標(biāo)實例(例如,通過名字識別是該約束條件的目標(biāo)的對象)。約束條件也標(biāo)識了要評估該目標(biāo)實例的哪個設(shè)置值,并且這些設(shè)置值從目標(biāo)實例中獲得。然后標(biāo)識出用于執(zhí)行評估約束條件的約束條件函數(shù)的指令或代碼組(步驟708)??蛇x擇地,不執(zhí)行指令或代碼組,約束條件函數(shù)可以以硬件的方式完成。然后執(zhí)行指令或代碼組,用以確定(或者硬件確定)在步驟706中獲得的值是否滿足約束條件(步驟710)。例如,指定組可以將獲得的值與約束條件中的值進(jìn)行比較,如果獲得的一個或多個值與一個或多個約束條件相同,就確定約束條件滿足。然后返回約束條件函數(shù)的結(jié)果(步驟712)。此結(jié)果可以作為結(jié)果226返回給圖2中的開發(fā)部件202。約束條件可以任意地包括一個名字或其它信息,該信息描述了可以在步驟712中作為結(jié)果返回的約束條件,該信息允許向開發(fā)部件202地設(shè)計者呈現(xiàn)描述任何錯誤的附加信息。然后檢查在實例空間中是否存在任何其它沒有選擇的約束條件(步驟714)。如果所有的約束條件都已經(jīng)被選擇并評估過,那么約束條件的檢查過程就完成了(步驟716)。但是,如果還有一個或多個約束條件沒有被選擇,那么處理700就返回到步驟704來選擇另一個標(biāo)識的約束條件。返回到步驟704,如果選擇的約束條件是一個對象約束條件,那么就標(biāo)識出該約束條件的目標(biāo)實例的第一角色和第一對象定義(圖7B中的步驟718)。對于一個對象約束條件,該約束條件的目標(biāo)實例是一個關(guān)系實例。該目標(biāo)實例的第一對象定義指的是所選擇的約束條件目標(biāo)的對象名稱。該對象實例的第一角色標(biāo)識了必須與由第一對象定義標(biāo)識的定義相匹配的關(guān)系作用。然后檢查是否存在由約束條件標(biāo)定的第二角色和第二對象定義(步驟720)。在某些實施例中,約束條件可以標(biāo)定多個對象和/或角色,并且第二角色和第二對象定義可以用于標(biāo)識出由約束條件標(biāo)定的第二角色和/或?qū)ο蠖x。如果存在由約束條件標(biāo)定的第二角色和第二對象定義,那么就檢查該約束條件的第一、第二角色和第一、第二對象定義是否都與目標(biāo)實例相匹配(步驟722)。如果一個或多個角色或者一個或多個對象定義與目標(biāo)實例不匹配,那么匹配計數(shù)變量就設(shè)為零(步驟724),并且處理700繼續(xù)到圖7C的步驟726,其將在下面詳細(xì)討論。但是,如果該約束條件的第一、第二角色和第一、第二對象定義都與目標(biāo)實例相匹配,那么就評估第一對象實例的所有嵌套的約束條件(步驟728)。嵌套的約束條件既指該約束條件定義的任何子實例,也指這些子實例的任何子實例,等等。嵌套的約束條件可以是對象約束條件、關(guān)系約束條件和/或設(shè)置約束條件。如果存在任何的嵌套約束條件已經(jīng)在前面評估過了,那么就記錄它們的結(jié)果,然后在步驟728中使用那些結(jié)果。但是,對于任何還沒有評估過的嵌套約束條件,通過調(diào)用處理700并且利用每個嵌套約束條件作為在圖7A的步驟704中選擇的約束條件,評估該約束條件。一旦所有的嵌套的約束條件都已經(jīng)評估過了,那么就檢測所有的嵌套約束條件是否都為真(步驟730)。如果存在一個或多個嵌套的約束條件被評估不為真,那么匹配計數(shù)變量就設(shè)為零(步驟724)。但是,如果所有的嵌套約束條件都評估為真,那么匹配計數(shù)變量就設(shè)為1(步驟732),并且處理700繼續(xù)到圖7C中的步驟726,這將在下面詳細(xì)討論??蛇x擇地,由于步驟730是一個評估所有嵌套約束條件是否都為真的檢測,在某些情況下,并不是所有的嵌套約束條件都需要評估,一旦有一個嵌套約束條件被評估不為真,就可以停止嵌套約束條件的評估并且處理700可以繼續(xù)到步驟730。例如,存在三個嵌套約束條件并且被評估為錯誤或者不為真的第二個嵌套約束條件,那么不管第三嵌套約束條件是否評估為真,步驟730的結(jié)果都是相同的(轉(zhuǎn)向步驟724)。再返回到步驟720,如果不存在由約束條件標(biāo)定的第二角色和第二對象定義,那么就檢查約束條件的第一角色和第一對象定義是否滿足目標(biāo)實例(步驟734)。步驟734與步驟722類似,但是其僅僅根據(jù)第一角色和第一對象定義而執(zhí)行;在步驟734中不存在第二角色和第二對象定義,所以僅僅考慮第一角色和第一對象定義。如果該第一角色或者第一對象定義與目標(biāo)實例不匹配,那么匹配計數(shù)變量就設(shè)為零(步驟736),并且處理700繼續(xù)到圖7C中的步驟726,其將在下面詳細(xì)討論。但是,如果約束條件的第一角色和第一對象定義與一個對象實例相匹配,那么處理700就進(jìn)行到步驟728,在此步驟中評估該第一對象實例的所有的嵌套約束條件?,F(xiàn)在討論圖7C的步驟726,進(jìn)行檢測該匹配計數(shù)的值是否最起碼是一個最小值并且不大于一個最大值(步驟726)。這些最小值和最大值由約束條件指定,并且可以是任何值。如果匹配計數(shù)最起碼是一個最小值并且不大于一個最大值,那么此約束條件返回真值(步驟738)。此為真的返回值也可以返回給評估其它的實例的過程。例如,當(dāng)圖7B的步驟728的一個嵌套約束條件評估為真,那么此真值可以返回給評估父節(jié)點的過程,用以在步驟730中作出確定。此為真的返回值也可以選擇性地作為結(jié)果226的一部分返回給圖2中的開發(fā)部件202。另外,所滿足的(評估為真)約束條件的名稱或其它的標(biāo)識信息也可選擇的返回給開發(fā)部件202。但是,如果匹配計數(shù)并不至少為最小數(shù)值或者大于最大數(shù)值(步驟726),那么就檢查是否要為這個約束條件產(chǎn)生一個錯誤信息(步驟740)。約束條件具有一個用來表示是否要為此約束條件返回一個錯誤信息的參數(shù)或設(shè)置。此參數(shù)或設(shè)置可以由例如約束條件的設(shè)計者或開發(fā)者設(shè)置。步驟740的檢測可以通過檢查此約束條件的參數(shù)或設(shè)置是否表示應(yīng)該產(chǎn)生一個錯誤信息而執(zhí)行。如果要產(chǎn)生此約束條件的錯誤消息,那么就產(chǎn)生一個錯誤消息(步驟742)。此錯誤信息可選擇地包括以名稱或其它可以幫助用戶(例如設(shè)計者或開發(fā)者)識別產(chǎn)生錯誤的約束條件的特性的識別信息。然后向此約束條件返回為假的值(步驟744)。在步驟724中產(chǎn)生的為假的值和/或錯誤信息可以作為結(jié)果226的一部分返回給圖2中的開發(fā)部件202。與步驟738中的為真的返回值相似,為假的返回值和/或錯誤消息可以返回給評估其他實例的過程。在步驟738中返回為真的值后,或者在步驟744返回為假的值,過程100返回圖7A的步驟714從而檢查是否有任何附加約束條件仍未選擇。當(dāng)返回到圖7A的步驟704時,如果選擇的約束條件是一個關(guān)系約束條件,那么就初始化一個匹配計數(shù)變量(圖7D中的步驟746)。該匹配計數(shù)變量可以通過例如將此匹配計數(shù)變量設(shè)置為零來進(jìn)行初始化。此約束條件的目標(biāo)實例所參與的關(guān)系實例將被識別出來(步驟748),并且識別出這些識別的關(guān)系實例的其中之一(步驟750)。然后檢查此約束條件的關(guān)系定義和/或指向是否滿足所選擇的關(guān)系實例(步驟752)。關(guān)系定義指此關(guān)系的類型(例如,宿主、授權(quán)、通信等等),并且方向是指角色或關(guān)系的方向(例如,此關(guān)系是否指向一個宿主關(guān)系中的主機或客機)。如果此約束條件的關(guān)系定義和指向關(guān)系定義和所選擇的關(guān)系實例的方向相同,那么此關(guān)系定義和約束條件的方向就與標(biāo)識的關(guān)系實例相匹配。如果此約束條件的關(guān)系定義和指向與選擇的關(guān)系實例不匹配,那么就檢查是否存在在步驟748中附加的被標(biāo)識了但還沒有被選擇的關(guān)系(步驟754)。如果存在一個和多個這樣的附加的關(guān)系,那么處理700就返回到750選擇一個還沒有被選擇的附加關(guān)系。但是,如果不存在此附加標(biāo)識的關(guān)系,那么處理700就前進(jìn)到圖7E中的步驟756,將在下面詳細(xì)討論。返回到步驟752,如果此約束條件的關(guān)系定義和指向確實與選擇的關(guān)系實例相匹配,那么就檢查在此約束條件中是否存在目標(biāo)對象定義(步驟758)。目標(biāo)對象定義在一個約束關(guān)系中是可選擇的,并且指的是被評估的關(guān)系實例的相對一方的對象實例。例如,如果該關(guān)系實例是一個宿主關(guān)系,并且目標(biāo)對象實例是主機,那么此宿主關(guān)系的相對一方的對象實例就是客機實例。如果在約束條件中存在目標(biāo)實例,那么就檢查此約束條件的目標(biāo)對象實例是否與此關(guān)系實例的相對一方的實例相匹配(步驟760)。如果此約束條件中的目標(biāo)關(guān)系定義和此關(guān)系實例的相對一方的的實例相同,那么此約束條件中的目標(biāo)對象定義就與此關(guān)系實例的相對一方的實例相匹配。如果約束條件中的目標(biāo)對象定義與此關(guān)系實例的相對一方的實例不匹配,那么處理700就前進(jìn)到步驟754,檢查是否存在任何附加標(biāo)識關(guān)系仍未被選擇。但是,如果約束條件中的目標(biāo)對象定義與此關(guān)系實例的相對一方的實例相匹配,或者如果在此約束定義中不存在目標(biāo)對象定義,那么處理700就進(jìn)一步評估此關(guān)系實例的所有的嵌套約束條件(圖7E中的步驟762)。然后處理700根據(jù)是否所有的嵌套約束條件都評估為真(步驟764)繼續(xù)進(jìn)行。步驟762和764的評估和檢查與圖7B的步驟728和730的評估和檢查是類似。如果并不是所有的嵌套約束條件都評估為真,那么處理700就返回到圖7D步驟754,檢查是否存在任何附加標(biāo)識關(guān)系仍未被選擇。但是,如果所有的嵌套約束條件都評估為真,那么匹配計數(shù)變量就增加(步驟766)。匹配計數(shù)變量被增加不同的數(shù)量,例如加1。然后處理700返回到圖7D的步驟754,檢查還存在任何附加標(biāo)識關(guān)系仍未被選擇。然后檢查匹配計數(shù)值是否最起碼是最小數(shù)值并且不大于最大數(shù)值(步驟756),其與圖7C中的步驟726相似。如果匹配計數(shù)值最起碼是最小數(shù)值并且不大于最大數(shù)值,那么就返回一個真值(步驟768),其與圖7C中的步驟738相似。但是如果匹配計數(shù)值并非是最起碼的最小數(shù)值或者大于最大數(shù)值,那么就檢查是否要為此約束條件產(chǎn)生一個錯誤(步驟770),其與圖7C中的步驟740相似。如果要產(chǎn)生一個錯誤,那么就產(chǎn)生一個錯誤(步驟722),其與圖7C中的步驟742相似。當(dāng)產(chǎn)生了一個錯誤消息時,或者無錯誤消息產(chǎn)生時,那么就返回一個為假的值(步驟774),其與圖7C的步驟744相似。另外,應(yīng)當(dāng)注意的是約束條件的檢查也可以進(jìn)行成組的約束條件的檢查。為了評估一組約束條件,利用處理700獨立地評估每個約束條件,并且該組的結(jié)果依賴于單獨的約束條件的評估的結(jié)果。在某些實施例中,如果該組中的至少一個實施例為真,那么,該組就評估為真。通過在處理700中向開發(fā)部件202返回表示成功的約束條件的驗證(例如為真的值)或不成功的約束條件的驗證(例如為假的值),以及錯誤信息,在SDM文檔204中描述的系統(tǒng)的設(shè)計期間的驗證的結(jié)果就返回給開發(fā)部件202。這些指示和/或錯誤信息可以利用開發(fā)部件202顯示給設(shè)計者,用以允許通知設(shè)計者正在設(shè)計的系統(tǒng)(并且在SDM文檔204中描述)是否已經(jīng)被驗證,或者是否存在潛在的錯誤。通過返回錯誤信息,設(shè)計者被更好的通知了潛在的錯誤是什么以及如果去解決它們。此反饋可以在設(shè)計期間提交給設(shè)計者,而不需要設(shè)計者在找到設(shè)計好的系統(tǒng)的錯誤之前,將此系統(tǒng)配置在一個數(shù)據(jù)中心上。錯誤執(zhí)行的例子此部分說明了一個圖2的驗證部件208如何報告錯誤以及警告的執(zhí)行的例子。錯誤和警告可以是任何形式的,例如此部分討論的XML格式的例子。如果通過CLR(公用語言運行期間)期間使用驗證部件,那么將返回帶有與此部分討論的XML格式等同的信息的類。此部分標(biāo)識了與一類錯誤相同的值。但是其并不排除其它的值。在類型空間驗證期間(語法分析和解析錯誤)發(fā)生的錯誤阻止編譯的SDM文檔的全部寫出。但是在實例空間驗證期間(信息流和約束條件錯誤)發(fā)生的錯誤將不會阻止編譯的SDM文檔的全部寫出?;镜腻e誤格式基本的錯誤包括對于所有的錯誤通用的錯誤信息。用于此基本錯誤格式的XML格式的例子是<xscomplexTypename=″DocumentError″><xsattributename=″category″type=″Severity″use=″required″/><xsattributename=″code″type=″xsstring″use=″required″/><xsattributename=″description″type=″xsstring″use=″required″/><xsattributename=″sdmFile″type=″xsstring″use=″required″/></xscomplexType>下表表述了基本錯誤的格式的屬性或者元素。語法分析錯誤在試圖加載SDM文檔的失敗導(dǎo)致了語法分析錯誤。此錯誤包括行號和列號。用于此語法分析錯誤格式的XML格式的實例是<xscomplexTypename=″DocumentParseError″><xscomplexContent><xsextensionbase=″DocumentError″><xsattributename=″lineNumber″type″xsint″/><xsattributename=″columnNumber″type-″xsint″/></xsextension></xscomplexContent></xscomplexType>下表將描述語法分析錯誤格式的屬性或元素。解析錯誤加載文件和解析文件類型的失敗會導(dǎo)致解析錯誤。這類錯誤包括解析導(dǎo)入失敗,解析類型、成員和路徑失敗。在此階段,存在一全面分析對象模型,所以依據(jù)此對象模型而不是文件中的行號和列號來引用產(chǎn)生一錯誤的部分。用于解析錯誤格式的XMI格式的實例是<xscomplexTypename=″DocumentResolutionError″><xscomplexContent><xsextensionbase=″DocumentError″><xsattributename=″statement″type=″documentPath″/></xsextension></xscomplexContent></xscomplexType>下表描述了解析錯誤的屬性或元素。信息流錯誤當(dāng)執(zhí)行信息流并為一個或多個輸入或輸出返回錯誤的時候發(fā)生信息流錯誤。識別出信息流成員,目的設(shè)置成員的錯誤發(fā)生類型和上下文包括當(dāng)前組的輸入和輸出值。用于信息流錯誤格式的XML格式的實例是<xscomplexTypename=″DocumentFlowError″><xscomplexContent><xsextensionbase=″DocumentError″><xssequence><xselementname=″inputValue″type=″flowlnput″minOccurs=″0″maxOccurs=″unbounded″/><xselementname=″outputValue″type-″fiowOutput″minOccurs=″0″maxOccurs=′unbounded″/></xssequence><xsattributename=″flowType″typc″documentPath″/><xsattributename=″flowMember″type″documentPath″/><xsattributename=″memberContext″type=″containmentPath″/><xsattributename=″flowErrorlD″type=″xsint″/></xsextension></xscomplexContent></xscomplexType>下表描述了信息流錯誤的屬性或元素。用于信息流輸入格式的說明的XML格式的實例是<xscomplexTypename=″flowlnput″><xssequence><xselementname=″value″type=″xsanyType″minOccurs=″0″/></xssequence><xsattributename=″setting″type=″sdmsimpleName″/><xsattributename=″source″type=″documentPath″/></xscomplexType>下表描述了信息流輸入格式的說明的屬性或元素。用于信息流輸出格式說明的XML格式的實例是<xscomplexTypename=″flowOutput″><xssequence><xselementname=″value″type=″xsanyType″minOccurs=″0″/></xssequence><xsattributename=″setting″type=″sdmsimpleName″/><xsattributename=′destination″type=″documentPath″/></xscomplexType>下表中描述了信息流輸出格式的說明的屬性或元素。約束條件錯誤當(dāng)評估一個設(shè)置的約束條件時產(chǎn)生一約束條件錯誤,當(dāng)防護(hù)裝置未執(zhí)行其基數(shù)約束條件,或者約束條件組的至少一個成員沒有被評估為真時,返回一錯誤。當(dāng)一個設(shè)定約束條件失敗時,返回包括約束條件類型、該約束條件執(zhí)行的上下文以及該約束條件的輸入值的設(shè)置的約束條件成員的說明。約束條件也可以返回一個客戶錯誤id,其隨后可以用于查找附加的錯誤信息。用于這樣的約束條件錯誤格式的XML格式的實例是<xscomplexContent><xsextensionbase=″Docun~entError″><xssequence><xselementname=″inputValue″type=″constraintlnput″/></xssequence><xsattributename=″constraintMember″type=″documentPath″/><xsattributename=″constraintType″type=″docmnentPath″/><xsattributename=″memberContext″type=″containmentPath″/><xsattributename=″constraintErrorlD″type=″xsint″/></xsextension></xscomplexContent></xscomplexType>下表描述了此約束條件錯誤格式的屬性或元素。用于一個約束條件輸入格式的描述的XML格式的實例是<xscomplexTypename-″constraintlnput″><xssequence><xselementname=″value″type=″xsanyType″/></xssequence><xsattributename=″setting″type=″sdmsimpleName″/><xsattributename=″source″type=″documentPath″/></xscomplexType>下表描述了約束條件輸入格式的說明的屬性或元素。當(dāng)防護(hù)裝置或組失敗時,識別約束條件成員以及該成員的上下文和評估的上下文關(guān)系。當(dāng)約束條件上下文關(guān)系識別評估該嵌套約束條件所對照的類型和關(guān)系時,該評估上下文關(guān)系不同于嵌套約束條件的成員上下文關(guān)系。用于這樣的約束條件錯誤格式的XML格式的實例是<xscomplexTypename-″constraintGuardOrGroupError″><xsattributename=″constraintMember″type=″docmnentPath″/><xsattributename=″evaluationContext″type=″containmentPath″/><xsattributename=″memberContext″type=″containmentPath″/></xscomplexType>下表描述了約束條件錯誤格式的屬性或元素。文檔路徑這是一個在SDM文檔內(nèi)到達(dá)一個特定SDM元素的路徑。用于文檔路徑格式的XML格式的實例是<xssimplcTypename=″documentPath″><xsrestrictionbase=″xsstring″></xsrestriction></xssimpleType>此路徑一般具有格式namespace/root_type(/nested_type)*/member(/nested_member)*將關(guān)系和約束條件的公知設(shè)置作為嵌套成員。包含路徑包含路徑識別了從根到一特定成員的一成員序列。包含路徑穿過了許多成員,從根模擬組件通過它們的成員等直到產(chǎn)生此錯誤的成員,以此來定位此路徑。用于文檔路徑格式的XML格式的實例是<xssimpleTypename=″containmentPath″><xsrestrictionbase=″xsstring″></xsrestriction></xssimpleType>此路徑一般具有格式Namespace/rootType(/nested_type)*member(/nested_member)*實例錯誤編譯器返回來自編譯中的將顯示給用戶的錯誤和警告。在一個SDM文檔的編譯過程中所遇到的錯誤可以具有不同的嚴(yán)重等級。大多數(shù)的錯誤是致命的,但是也存在某些錯誤,其可能導(dǎo)致其它錯誤或者當(dāng)其被忽略時是安全的。關(guān)于每個等級的安全性的實例細(xì)節(jié)如下。錯誤此類錯誤是致命的,并且具有下面的含義·不能在編譯中創(chuàng)建一輸出sdm文件(.sdmDocument)·錯誤會導(dǎo)致編譯器完成編譯的當(dāng)前階段然后終止。例如,如果出現(xiàn)一個XML語法分析錯誤,那么就不加載文檔。如果出現(xiàn)加載錯誤,就會發(fā)現(xiàn)更多的加載錯誤,但是不會繼續(xù)進(jìn)行信息流和約束條件的檢查。警告1(W1)警告不妨礙編譯SDM文檔。警告1的原則包括·可能會導(dǎo)致在編譯的將來階段中的錯誤。例如,如果一個引用的文件沒有找到,如果從那個引用中使用所有的類型,那么在加載該目標(biāo)SDM文件時會出現(xiàn)錯誤。·在模擬實例空間期間的錯誤。警告2(W2)警告2是最不嚴(yán)重的錯誤。例如,在XML文件中找到額外的屬性。警告2的原則是·忽略警告2是安全的·為了清理SDM,建議進(jìn)行修補。警告3(W3)警告3是一個信息消息?!ぞ?是信息性的。·默認(rèn)的,這些警告不被報告下表列出了可能會由圖2中的驗證部件208報告的錯誤的例子。獨立的表格用于表示一般編譯器錯誤、文檔加載錯誤、定義空間校驗錯誤、信息流錯誤以及約束條件錯誤的實例。這些錯誤的描述和它們的級別都包括在下表中。也標(biāo)識了每個錯誤的格式(例如,錯誤(基本錯誤)的格式、語法分析格式、解析格式、信息流格式以及約束條件格式)。一般編譯器錯誤文檔加載錯誤定義空間校驗錯誤信息流錯誤約束條件錯誤SDM實施的例子下面是SDM的實施的一個例子。此SDM實施的例子包括定義部分(第1部分)、體系結(jié)構(gòu)綜述部分(第2部分)以及實施細(xì)節(jié)部分(第3部分)。應(yīng)當(dāng)理解的是,在此實施的例子中描述了各種的特定值和必要條件,并且并不是所有的實施都限定于這些特定的值和必要條件。1定義2體系結(jié)構(gòu)綜述系統(tǒng)定義模型(SDM)支持連接的系統(tǒng)的單元之間的配置和相互關(guān)系的描述,我們稱此系統(tǒng)為模型化系統(tǒng)。SDM基于一個對象關(guān)系模型。利用對象描述存在于該模型化的系統(tǒng)中的元素,并且利用關(guān)系指定它們之間的聯(lián)系。SDM進(jìn)一步定義了對象和關(guān)系,其用來獲得對SDM很重要的語義。特別地,我們將對象分為系統(tǒng)、端點以及資源,并且將關(guān)系分為通信、包含、宿主、授權(quán)和引用。我們利用抽象對象定義提供了系統(tǒng)部件的通用分類,其允許對大范圍的應(yīng)用程序提供了工具支持,并為設(shè)計期間的類型檢查提供了基礎(chǔ)。我們期望抽象定義組為系統(tǒng)設(shè)計提供全面的技術(shù),并且我們期望它們會隨著時間慢慢地改變。然后我們利用此抽象的定義作為限定具體定義的基礎(chǔ),該具體定義表示實際應(yīng)用程序和數(shù)據(jù)中心的設(shè)計的一部分。我們采用一個抽象定義,并且提供定義具體類型的成員的實施,并且為它的屬性設(shè)定值。然后根據(jù)這些定義的集合創(chuàng)建系統(tǒng)。約束條件用于模擬允許的關(guān)系組上的限定條件,其中實例可以參與到該關(guān)系組中。我們利用約束條件獲得精細(xì)的必要條件,該必要條件依靠包含在一個關(guān)系中的對象的配置。例如,一個約束條件可用于驗證一通信協(xié)議的每一端點上的參與者是否使用兼容的安全設(shè)置。為了實現(xiàn)目標(biāo)系統(tǒng)上的改變,可以使用一個需要的改變的說明性的描述,其被稱為變更請求。SDM定義的用于擴展的過程將變更請求作為SDM執(zhí)行模塊的一部分進(jìn)行驗證和執(zhí)行。實例空間獲得被管理的應(yīng)用程序的需要的和當(dāng)前的狀態(tài)。我們可以跟蹤實例空間中的變化并將它們與初始化變更的變更請求相聯(lián)系。管理器既用于提供專用的行為也用于支持運行期間和模型化系統(tǒng)之間的交互作用。2.1對象對象用于表示模型化的系統(tǒng)的邏輯和物理方面。例如,它們可以用于表示IIS中的文件、路徑并配置。它們也可以用于表示一個應(yīng)用程序或分布式系統(tǒng)的界限。我們將對象分為三類。每一類表示了模型化的系統(tǒng)的一個方面,其每一個都將被揭示并被理解為SDM模塊本身的一部分,而不是特定模型實例的屬性或強制繼承結(jié)構(gòu)。2.2.1資源資源表示可以被組合創(chuàng)建一個系統(tǒng)模塊的行為的基礎(chǔ)單元。資源可以用于與其它的資源組合在一起,以增加系統(tǒng)模塊的結(jié)構(gòu)。每個資源表明對于其它資源的依賴性,該其它資源是為了進(jìn)行模型化行為所需要的資源。為了創(chuàng)建一個資源的實例,要為該系統(tǒng)標(biāo)識出主機環(huán)境。資源的實例包括作為操作系統(tǒng)的一部分的文件、路徑、登記關(guān)鍵字以及值、作為IIS和表格的一部分的web路徑和web文件,作為數(shù)據(jù)庫的一部分的行和所存儲的過程。2.1.2系統(tǒng)系統(tǒng)既用于表示執(zhí)行一適當(dāng)限定的任務(wù)的資源的集合,也用于表示交互執(zhí)行一適當(dāng)限定的任務(wù)的系統(tǒng)的集合。一個系統(tǒng)范圍內(nèi)的資源不能依賴該范圍之外的資源。同時,我們也不需要資源來證明與同一系統(tǒng)范圍內(nèi)的其它資源進(jìn)行通信的機構(gòu)。這意味著在系統(tǒng)間交互作用必須利用通信關(guān)系顯式模型化。這也表明在一般的系統(tǒng)中該裝置是配置的最小單元,如果它們獨立地使用,我們不能保證它們會工作。系統(tǒng)的例子包括操作系統(tǒng)、宿主在IIS上的web應(yīng)用程序以及被SQL宿主的數(shù)據(jù)庫。2.1.3端點端點用于定義使系統(tǒng)支持與其它系統(tǒng)的通信的接口。由于我們不允許資源具有跨系統(tǒng)范圍的依賴性,所以端點必須用于模擬允許系統(tǒng)正確操作所請求的交互作用。端點的實例包括Http、Tcpip以及Soap端點。2.2關(guān)系我們利用關(guān)系獲得對象之間的交互作用的各個方面。所有的關(guān)系都是二元的和有方向的。除了獲得對象之間的交互作用,關(guān)系還可以在參與該關(guān)系的對象上設(shè)置約束條件,并且可以在參與者之間傳遞配置信息。同樣,為了要在這些關(guān)系上添加特定的語義,我們標(biāo)識了一組可以被SDM模型所理解的關(guān)系。這就允許我們推導(dǎo)出模型系統(tǒng)的運行期間的狀態(tài)。特別的,需要描述的特定對象實例的情況是a)它的生命期b)誰可以與它交互c)它位于系統(tǒng)結(jié)構(gòu)的什么位置d)它與誰通信e)它依靠誰進(jìn)行它的工作f)它在什么環(huán)境中執(zhí)行g(shù))它是否可以正確、可靠地操作我們也利用關(guān)系來定義應(yīng)用程序的允許的結(jié)構(gòu)。這些情況包括a)另一個對象可以包括哪些對象b)哪些端點可以連接起來c)什么樣的環(huán)境可以宿主一個特定的對象以下的每個關(guān)系都可獲得上述一個或多個情況的一部分。2.2.1包含包含關(guān)系用于定義SDM模型的包含結(jié)構(gòu)。包含關(guān)系的存在用于表明一個對象可以包含另一個對象。在設(shè)計期間使用這個信息是為了當(dāng)它將如何與系統(tǒng)、資源和端點相聯(lián)系的選項提供給設(shè)計者或體系結(jié)構(gòu)設(shè)計師的時候可以指導(dǎo)設(shè)計環(huán)境。定義包含關(guān)系是為了限制一個SDM模型的結(jié)構(gòu)。例如,體系結(jié)構(gòu)設(shè)計師可以設(shè)計一個包含網(wǎng)絡(luò)目錄、文件系統(tǒng)目錄和文件的網(wǎng)絡(luò)b應(yīng)用程序模型。另一個體系結(jié)構(gòu)設(shè)計師可以擴展該模型以允許它包含網(wǎng)絡(luò)站點。通過理解這些模型的基礎(chǔ)結(jié)構(gòu),操作者和工具創(chuàng)建者可以推導(dǎo)出模型實例需要什么樣的環(huán)境以及特定的模型在其所配置的系統(tǒng)上會產(chǎn)生什么影響。例如,在上面定義的第一個模型中,操作者提供了一個網(wǎng)絡(luò)站點來使配置應(yīng)用程序。包含關(guān)系定義可一個對象的生命期、對象的所有者以及對象出現(xiàn)在模型化的系統(tǒng)結(jié)構(gòu)的什么位置。如果一個對象僅僅具有一個父包含者,那么該父體的生命期就限定了該包含的對象的生命期。父體擁有被包含的對象。這意味著父體具有對象可見性的控制權(quán),并且可以決定是否將對象或者該對象一部分展示給它的母源。最后,父體為對象提供了上下文信息。此上下文信息可以用于幫助開發(fā)者與其它的開發(fā)者或者應(yīng)用程序的用戶就他們的應(yīng)用程序的結(jié)構(gòu)進(jìn)行交流。例如,在一個運行的應(yīng)用程序中定位錯誤的時候,包含鏈可以提供大量的詳細(xì)表示應(yīng)用程序失敗的部分的上下文信息。包含關(guān)系的使用包括表示一個網(wǎng)絡(luò)應(yīng)用程序的虛擬目錄的結(jié)構(gòu)以及該網(wǎng)絡(luò)應(yīng)用程序配置的文件和目錄的結(jié)構(gòu)。包含也可以用于描述網(wǎng)絡(luò)應(yīng)用程序和是其一部分的連接的系統(tǒng)模型之間的關(guān)系。2.2.2宿主宿主關(guān)系用于模型化已模擬化的環(huán)境的包含結(jié)構(gòu)。此關(guān)系獲得環(huán)境的功能性的限定。例如,文件必須被包含在一個目錄或者一個網(wǎng)絡(luò)目錄中的限定必須包含在一個網(wǎng)絡(luò)站點中。宿主關(guān)系定義了一個對象的生命期和它所要執(zhí)行的環(huán)境。為了存在,一個對象必須具有至少一個宿主。這就意味著宿主的生命期限定了該對象的生命期,并且如果宿主被標(biāo)記為脫機,那么此對象也被標(biāo)記為脫機。宿主關(guān)系負(fù)責(zé)一個在宿主限定的環(huán)境中的對象實例的創(chuàng)建和維護(hù)。這種方式就使該關(guān)系擔(dān)負(fù)起在一個宿主上創(chuàng)建客戶的實例的責(zé)任,而不是該客戶也不是該宿主。通過提供一定范圍的宿主關(guān)系,一個客機可以被多個主機環(huán)境支持。宿主關(guān)系的存在表明在一個主機對象上放置一個客機對象是可能的。對于一個包含了許多宿主在另一個系統(tǒng)上的資源的系統(tǒng)來說,此客機系統(tǒng)中的所有的資源都與主機系統(tǒng)中的至少一個資源具有宿主關(guān)系。2.2.3通信通信關(guān)系用于模型化在連接系統(tǒng)中的子系統(tǒng)之間的通信。由于它們被表示在端點對象之間,所以它們僅僅被設(shè)置在具有端點的系統(tǒng)之間。如果一個系統(tǒng)包含也具有端點的嵌套系統(tǒng),那么通過已被內(nèi)部系統(tǒng)端點依次授權(quán)的位于外部系統(tǒng)上的代理端點揭示了這些端點。如果一組端點之間不存在通信關(guān)系,那么就不能在這些端點之間建立連接。如果一個系統(tǒng)被標(biāo)記為脫機,那么該系統(tǒng)的所有客機都被更新,用以反映該系統(tǒng)不能使用的事實。通過基于該系統(tǒng)的通信關(guān)系傳播該改變,實現(xiàn)此更新。2.2.4引用引用關(guān)系用于獲得正確的操作所需的資源或系統(tǒng)間的從屬關(guān)系,但是其并不認(rèn)為是從屬對象的執(zhí)行環(huán)境的一部分。例如,為了向網(wǎng)絡(luò)服務(wù)的用戶提供一個網(wǎng)絡(luò)內(nèi)容,網(wǎng)絡(luò)目錄需要對本地目錄或者遠(yuǎn)程共享的引用。這就被表示為網(wǎng)絡(luò)目錄與本地目錄或遠(yuǎn)程共享之間的從屬關(guān)系。2.2.5授權(quán)授權(quán)關(guān)系用于將代理的交互作用傳遞給一個對象實例,該對象實例執(zhí)行由該代理指示的行為。一般使用授權(quán)是從一個父系統(tǒng)的端點向一個被包含的系統(tǒng)的端點傳送通信關(guān)系。2.3定義對象和關(guān)系定義用于創(chuàng)建可重復(fù)使用的配置,該配置可以被例示為創(chuàng)建該配置的實例。然后這些實例共享由該定義指定的公共特性。抽象定義由于它不完善,所有不能被直接例示。為了完善它,另一定義要擴展它,用以添加丟失元素。利用抽象的定義創(chuàng)建在建立一個實體系統(tǒng)的模型時要用到的建立塊。抽象定義間的關(guān)系限定了擴展該抽象定義的定義的允許的結(jié)構(gòu)。這就允許設(shè)計界面使用抽象定義,定義界面的用戶可以執(zhí)行的動作。例如,一個網(wǎng)絡(luò)應(yīng)用程序參與的包含關(guān)系指導(dǎo)了擴展該抽象定義的網(wǎng)絡(luò)應(yīng)用程序的結(jié)構(gòu)。本質(zhì)上,抽象對象定義和關(guān)系定義的組合限定了模型化目標(biāo)系統(tǒng)的模式。具體對象定義的角色是,根據(jù)一個或多個抽象定義,利用抽象定義空間的一個子集創(chuàng)建一個可重復(fù)使用的配置。作一個簡單的推理,抽象定義空間可以與數(shù)據(jù)庫的規(guī)劃相比較;具體對象定義空間表示了在數(shù)據(jù)庫中的一組行的可重復(fù)使用的模板。當(dāng)創(chuàng)建具體對象的實例時,在數(shù)據(jù)庫中僅僅創(chuàng)建這些行。為了執(zhí)行設(shè)計期間的驗證,我們可以相對于抽象定義空間驗證一個具體對象定義,同樣的方式,我們可以相對于規(guī)劃的約束條件(例如外國關(guān)鍵字等)驗證數(shù)據(jù)庫中的這些行。設(shè)置定義用于創(chuàng)建簡單的值元素。這些值元素可以用于存儲配置信息。2.4成員一個定義可以包括引用其它定義的成員。成員可以以定制特定的應(yīng)用程序的方式,允許一個定義重新使用另一個定義。設(shè)置成員用于識別與定義有關(guān)的配置信息。設(shè)置成員以設(shè)置定義為基礎(chǔ)。對象成員用于創(chuàng)建一個特定對象定義的實例。設(shè)置信息流可以用于提供對象的值。當(dāng)說明一個對象成員時,用戶可以決定對象成員是否與外部系統(tǒng)(值語義)同時創(chuàng)建,或者對象成員是否由一個隨后將發(fā)生的明確的新操作創(chuàng)建(引用語義)。關(guān)系成員限定了創(chuàng)建對象成員時其所參與的關(guān)系。如果一個對象不禁暗被其母源包含,那么將說明該成員和包含定義之間的包含關(guān)系成員。如果一個對象成員被授權(quán),那么將在對象成員和源對象成員之間限定授權(quán)關(guān)系成員??梢栽谕ㄐ诺亩它c之間說明通信關(guān)系成員。可以在從屬物和源對象成員之間說明從屬關(guān)系成員(引用和宿主)。約束成語用于縮小特定對象將要參與的關(guān)系組或者參與到一個特定的關(guān)系中的對象組。它們標(biāo)識了一個對象或者關(guān)系上的約束條件,該約束條件可以指向該對象或者關(guān)系的設(shè)置,或者約束了與該對象或關(guān)系相關(guān)的交互作用。信息流成員用于限定成員間的配置的信息流。它們從成員的設(shè)置中收集數(shù)據(jù)值,根據(jù)這些信息執(zhí)行某西處理,然后向這些成員的設(shè)置分發(fā)結(jié)果。2.5實例實例空間反映了模擬系統(tǒng)的當(dāng)前狀態(tài)。保存了已經(jīng)創(chuàng)建的實例和這些實例之間的關(guān)系的完整的記錄。每個實例具有一個相關(guān)的版本歷史,其中每個版本都與一個變更請求相關(guān)聯(lián)。變更請求初始化創(chuàng)建新實例的過程。此變更請求定義了與一現(xiàn)有實例的特定成員的類型和關(guān)系相關(guān)的一組創(chuàng)建、更新和刪除請求;根是一特殊情況。此變更請求在運行期間擴展,相對于所有約束條件校正,然后構(gòu)建。擴展過程將隱含構(gòu)建的對象和關(guān)系實例識別為包含對象的構(gòu)建請求的一部分,然后通過所有關(guān)系來求設(shè)置信息流的值。識別步驟檢查所有請求關(guān)系是存在的以及此關(guān)系實現(xiàn)所有約束條件。最后,構(gòu)建過程確定每個實例的調(diào)度、更新和刪除的適當(dāng)順序,然后以正確順序?qū)⒚總€實例傳遞給一實例管理器從而執(zhí)行適當(dāng)操作。2.6對象模型以下uml圖取得了SDM模型對象之間的主要交互作用。簡而言之,在基本類型之間定義了這些相互作用中的一部分,其中導(dǎo)出類型之間存在實際交互作用,因而其更特殊。SDM文檔包含描述以下內(nèi)容的信息文檔、文檔中定義的管理器、引用其他文檔的導(dǎo)入語句以及一組由該文檔所描述的對象和關(guān)系的定義。許多SDM元素也可以包含設(shè)計數(shù)據(jù),允許設(shè)計表面由設(shè)計表面內(nèi)元素顯示和制造產(chǎn)生具有特定信息的SDM元素。圖8描述了一示例性的SDM文檔。從如圖9的一公用基本定義派生出所有SDM定義。定義可包含一描述、一組成員、一組設(shè)置值和設(shè)計數(shù)據(jù)。我們將定義分為對象、關(guān)系、約束條件、信息流和設(shè)置定義。對象定義進(jìn)一步分為系統(tǒng)、資源和端點定義。關(guān)系定義進(jìn)一步分為宿主、通信、授權(quán)、參考和包含定義。成員用于將一名稱與一特殊實例或如圖10所示的多組實例相關(guān)。所有成員涉及一定義。每個成員可包含一組設(shè)置值、一描述和設(shè)計數(shù)據(jù)。成員可基于它們參考的定義種類來劃分。信息流和約束成員增加了限定輸入的能力,該其從包含定義范圍內(nèi)的設(shè)置成員獲得源設(shè)置值。信息流成員也增加了輸出,此輸出允許將所處理的信息流值傳給包含定義內(nèi)的設(shè)置成員。一示例性的設(shè)置成員如圖11所示。設(shè)置值涉及一設(shè)置定義,該設(shè)置定義表示一復(fù)雜或簡單的設(shè)置定義。一復(fù)雜設(shè)置定義可包含嵌套設(shè)置成員。一簡單定義限定了一單值域。輸入和輸出對象用于定義了在設(shè)置成員之間的設(shè)置值的傳送。一示例性的約束條件定義如圖12所示。約束條件用于限制設(shè)置值和SDM模型結(jié)構(gòu)的限制條件。一約束條件定義標(biāo)定于一特殊對象或關(guān)系定義。此約束條件定義可對對象參與的關(guān)系或參與一關(guān)系的對象設(shè)置結(jié)構(gòu)約束條件。此結(jié)構(gòu)約束條件也可以直接加到該對象或關(guān)系定義中。描述對象用于提供SDM元素的自然語言描述,如圖13所示。這些元素可響應(yīng)管理器而定位。設(shè)計數(shù)據(jù)元素包含由編輯SDM文檔的設(shè)計表面定義的結(jié)構(gòu)化數(shù)據(jù)。2.7分層SDM文檔的目的是允許區(qū)分應(yīng)用程序的開發(fā)者、軟件基礎(chǔ)結(jié)構(gòu)的設(shè)計者以及數(shù)據(jù)中心體系結(jié)構(gòu)設(shè)計者之間的關(guān)注點。這些組中每一個著重于特殊服務(wù)且具有一組各不相同的相關(guān)性。例如,開發(fā)者主要關(guān)注依靠諸如SQL、IIS和CLR的主機的配置及其之間的聯(lián)系。主機配置的設(shè)計者關(guān)注網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)和OS配置,而開發(fā)網(wǎng)絡(luò)結(jié)構(gòu)、OS配置和存儲映射的體系結(jié)構(gòu)設(shè)計者需要知道數(shù)據(jù)中心的硬件。為支持關(guān)注點區(qū)分,SDM揭示了分層的概念。利用宿主關(guān)系可實現(xiàn)分層。通過定義操作系統(tǒng)、諸如sql的宿主以及sql提供的例如數(shù)據(jù)庫的服務(wù)之間的宿主關(guān)系,就允許應(yīng)用開發(fā)者定義包含數(shù)據(jù)庫的應(yīng)用應(yīng)用程序,而允許體系結(jié)構(gòu)設(shè)計者定義包含SQL宿主的系統(tǒng)。通過連接宿主系統(tǒng)和客戶系統(tǒng)之間的宿主關(guān)系,將分層合并這些分離的系統(tǒng)。層邊界可以是任何存在宿主關(guān)系的地方。為簡化設(shè)置層邊界的選擇,我們定義了四個基本層作為SDM模型的部分。然后將系統(tǒng)與其中一層相聯(lián)系。此四個層為應(yīng)用程序?qū)印ご藨?yīng)用程序?qū)又С旨s束環(huán)境的應(yīng)用程序結(jié)構(gòu)。由主機層中標(biāo)識的主機配置定義此環(huán)境?!?yīng)用程序?qū)又械南到y(tǒng)定義的例子包括網(wǎng)絡(luò)服務(wù)、數(shù)據(jù)庫和新聞組對話時間表。宿主層·在軟件部件外部構(gòu)建數(shù)據(jù)中心。配置部件之間的連接。一些部件作為應(yīng)用層的宿主。·在此層中系統(tǒng)定義的例子——IIS、SQL、AD、EXCHANGE、DNS和Biztalk。網(wǎng)絡(luò)/OS/存儲器層·建立數(shù)據(jù)中心網(wǎng)絡(luò)和平臺。配置網(wǎng)絡(luò)安全模型和操作系統(tǒng)平臺配置。將存儲器加入操作系統(tǒng)配置?!ぴ诖藢又械南到y(tǒng)定義的例子一VLAN、Windows、濾波器、存儲器硬件層此硬件層識別數(shù)據(jù)中心中的機器類型以及這些機器之間的物理連接。圖14表示層4網(wǎng)絡(luò)應(yīng)用程序映射到層3網(wǎng)絡(luò)服務(wù)器主機的例子。每層的外方框代表一系統(tǒng),在邊緣上的方框代表端點而在內(nèi)部的方框代表資源。通過宿主關(guān)系將每個元素映射到下層主機上。3實施細(xì)節(jié)3.1命名在SDM中有很多地方需要一強大的命名系統(tǒng)來識別對象。以下命名系統(tǒng)允許SDM文檔的創(chuàng)建者以以下方式標(biāo)記文檔用戶能確信此文檔的定義與開發(fā)者原始公布的相同。以下是用于SDM文檔識別器的例子<SystemDefinitionModelName=″System.OperatingSystem.FileSystem″Version=″0.1.0.0″DocumentLanguage=″en″Xmlns=http//schemas.microsoft.com/SystemDefinitionModel/2003/10″Version=″0.1.0.0″PublicKeyToken=″AAAABBBBCCCCDDDD″Culture=″neutral″Platform=″neutral″></SystemDefinitionModel>為了引用在另一個名稱空間中的一類型,要導(dǎo)入此名稱空間<lmportAlias=″FileSystem″Name=″System.OperatingSystem.FileSystem″Version=″0.1.0.0″/>然后可以利用別名引用名稱空間內(nèi)的定義FileSystemFile3.1.1身份SDM名稱被定義在它們的名稱空間的范圍內(nèi)。名稱空間通過名稱、版本和一公鑰令牌來識別且包含在一單個文件中。身份的基本形式包括名稱、版本、文化、平臺和一公鑰令牌。<xsattributeGroupname=″ldentiy″><xsattributename=″Name″type=″Path″use=″required″/><xsattributename=″Version″type=″FourPartVersionType″use=″required″/><xsattributename=″PublicKeyToken″type=″PublicKeyTokenType″use=″optional″/><xsattributename=″Culture″type=″CultureNeutral″use=″optional″/><xsattributename=″Platform″type=″xsstring″use=″optional″/></xsattributeGroup>基本身份可結(jié)合一簽名和一公鑰使用,用以創(chuàng)建被稱為名稱空間身份的新的強大的身份。此身份用于識別一SDM文檔。為創(chuàng)建此身份,利用私鑰對此文檔進(jìn)行標(biāo)記,從而允許文檔用戶利用公鑰校驗其上下文。公鑰令牌是識別一公鑰/私鑰對的公共部分的16進(jìn)制字符串。它不是公鑰;它只是公鑰的64位混編信息。<xssimpleTypename=″PublicKeyTokenType″><xsrestrictionbase=″xsstring″><xspatternvalue=″(|[a-f]|[A-F]){16}″></xsrestriction></xssimpleType>利用一文化標(biāo)識符指定文檔語言,此文化標(biāo)識符包含定義語言的兩個小寫字母和定義國家或區(qū)域的兩個或三個大寫字母。<xssimpleTypename=″Culture″><xsrestrictionbase=″xsstring″><xspatternvalue=″[a-z]{2}((-[A-Z]{2})?|(-[A-Z]{3})?)″></xsrestriction></xssimpleType><xssimpleTypename=″CultureNeutral″><xsunionmemberTypes=″Culture″><xssimpleType><xsrestrictionbase=″xsstring″><xsenumerationvalue=″neutral″/></xsrestriction></xssimpleType></xsunion></xssimpleType>3.1.2版本文件版本由N.N.N.N形式的四部分?jǐn)?shù)字來定義,其中0<=N<65535。按照慣例,數(shù)字參考主.次.建立.修正。版本號標(biāo)識文檔所包含的所有定義的版本。這意味著當(dāng)文檔中所有的定義一起升級時,此文檔成為版本單元。<xssHnpleTypename=″FourPartVersionType″><xsrestrictionbase=″xsstring″><xspatternvalue=″({1,4}|{4}|64{3}|655|6553[0-5))(\.({1,4}|{4}|64{3}|655|6553)){3}7></xsrestriction></xssimpleType>3.13簡名簡名是由字母-數(shù)字字符和有限的標(biāo)點符號組成。此名稱以非數(shù)字字符開始。<xssimpleTypename=″SimpieName″><xsrestrictionbase=″xsstring″><xspattemvalue=″[a-z,A-Z,J{1}(<simpleName>(.<simpleName>)*([<別名>]<簡名>(.<簡名>)*)在導(dǎo)入語句內(nèi)定義簡名。<xssimpleTypename=″QualifiedName″><xsrestrictionbase=″xsstring″><xspatternvalue=″[a-z,A-Z,_]{1}()*([a-z,A-Z,_]{1}()*)?(\.[a-z.A-Z,_]{1}()*)*″/></xsrestriction></xssimpleType>3.1.7名稱轄區(qū)定義的名稱由它們在其中定義的上下文來確定轄區(qū)。最主要轄區(qū)是文檔。假如一定義被嵌套,那么它的名稱由此定義確定轄區(qū)。這意味著在其父轄區(qū)內(nèi)可隱藏名稱。也意味著對一個在其定義轄區(qū)之外的定義的引用可以由其父轄區(qū)的名稱限定。一完全限定名稱包括從文檔根到嵌套定義的所有名稱。3.1.8成員路徑成員路徑是一名稱序列,該名稱序列相應(yīng)于定義所通過的成員。路徑應(yīng)以一成員名稱開始,此成員名稱定義在聲明此路徑的上下文中。一些成員名稱被自動加入一定義。我們稱之為公知名稱。公知名稱的例子包括在一定義或引用聲明中的“這個”、在一宿主關(guān)系聲明中的“宿主”和“客戶”、或在一約束聲明中定義的“目標(biāo)”。此設(shè)置目標(biāo)也標(biāo)識對相關(guān)信息流定義的設(shè)置,此設(shè)置將用作由路徑標(biāo)識的設(shè)置的源值或目的設(shè)置成員名稱以點分隔。<simpleName>(.<simpleName>)*(<簡名>(.<簡名>)*)<xssimpleTypename=″Path″><xsrestrictionbase=″xsstringH><xspatternvalue=″[a-z,A-Z]{1}()*(\.[a-z,A-Z]{1}()*)*″/></xsrestriction></xssimpleType>3.1.9實例路徑實例空間中的路徑基于xpath,其中在xpath中的元素名稱對應(yīng)于成員名稱,且在xpath中的屬性對應(yīng)于設(shè)置。3.1.10簽名為了提供一個驗證文檔內(nèi)容并將一強大名稱與文檔相關(guān)聯(lián)的機制,利用一密鑰標(biāo)記一已編譯SDM文檔。此簽名機制利用DSIG標(biāo)準(zhǔn)(http//www.w3.org/2000/09/xmldsig#)來標(biāo)記文檔。在一標(biāo)記文檔中嵌入一個與以下描述類似的簽名節(jié)點。<Signaturexmlns=″http//www.w3.org/2000/09/xmldsig#″><Signedlnfo><CanonicalizationMethodAlgorithm=″http//www.w3.org/TR/2001/REC-xml-c14n-20010315″/><SignatureMethodAlgorithm=http//vww.w3.org/2000/09/xmldsig#rsa-shal″/><ReferenceURI=″″><Transforms><TransformAlgorithm=″http//www.w3.org/TR/2001/REC-xml-c14n-20010315″/><TransformAlgorithm=″http//www.w3.org/2000/09/xmldsig#enveloped-signature″/></Transforms><DigestMethodAlgorithm=″http//www.w3.org/2000/09/xmldsig#shal″/><DigestValue>Dn9BN6rKnnzzgGxaWI3j0aW8/1g=</DigestValue></Reference></Signedlnfo><SignatureValue>JaNLAktv2+n4Xz3p0jM8zqwmUc8T91AOtwasKOVBwHgvYAGijRFI0U1kcVfHbDJoi8ln33prnS5ITNj46rGYRn/UK11vjvpprfgz2a+QI7G4o7hBwO0SZzLLPO7/y7+Gkw0Cr6zaoDmOFSdP8IAATuVJC40pZhbDmcmHJduaXm0=</SignatureValue><Keylnfo><KeyValuexmlns=″http//www.w3.org/2000/09/xmidsig#″><RSAKeyValue><Modulus>wxxlCIOui6J77CZcnzLOcBBxl/3uuFrUBEyFivVklRtTTzQpgirdaNouQ9ziCAK6aipeM6RjgYAoDPs/iWFnrHmtDoxgP2H4/W9lttXO5EjQDb76XAZRPSvthJYtreKEGE0d6L6iTRdg25hYGFkyY/Ys0s0ONh3+5VO0Wxq+Fx0=</Modulus><Exponent>AQAB</Exponent></RSAKeyValue></KeyValue></Keylnfo></Signature>此結(jié)點是文檔的一根結(jié)點,其應(yīng)該文檔的任何其他內(nèi)容之前產(chǎn)生。我們利用“any”(“任何”)標(biāo)記來聲明此元素,但我們在此位置上只承認(rèn)并處理一“Signature”(“簽名”)結(jié)點。<xsanynamespace=″http//www.w3.org/2000/09/xmldsig#″processContents=″skip″minOccurs=″0″/>3.1.11定義、引用和解析名稱空間的名稱在此部分,描述了匹配一引用特定名稱空間的名稱空間所用到的的處理。如3.1.1部分所定義的,一名稱空間身份包括五屬性·Simplename簡名·PublickeyToken公鑰令牌·Version版本·Language語言·Platform平臺名稱空間的客戶利用這些屬性識別所需的名稱空間(名稱空間引用),名稱空間的開發(fā)者用它來提供一名稱空間的公知身份(名稱空間定義)。依據(jù)這些屬性是名稱空間引用的一部分還是名稱空間定義的一部分,每個屬性可以有不同解釋。3.1.11.1名稱空間定義當(dāng)一開發(fā)者希望創(chuàng)建并公布一新的名稱空間時,此開發(fā)者·提供此名稱空間的一個簡名·提供此名稱空間的一個版本此開發(fā)者可選地·以密鑰標(biāo)記名稱空間·標(biāo)識此名稱空間的一個特定文化(默認(rèn)為文化中立)·識別此名稱空間的一個特定平臺(默認(rèn)為平臺中立)假如未標(biāo)記此名稱空間,則無公鑰令牌且此名稱空間將具有一弱名稱??裳舆t標(biāo)記一名稱空間,從而允許開發(fā)者將標(biāo)記處理和編譯處理分開。一個已編譯但未標(biāo)記的延遲標(biāo)記名稱空間可在編譯過程中引用但不能在運行期間使用。3.1.11.2名稱空間引用當(dāng)一客戶在一SDM文件中引用(導(dǎo)入)一名稱空間時,他們需要·提供所引用的名稱空間的名稱他們可選地可以提供其它信息,包括·引用的名稱空間的公鑰令牌·引用的名稱空間的最低版本·引用的名稱空間的文化或一通配符(*)·引用的名稱空間的平臺或一通配符(*)所有未提供的屬性默認(rèn)為一個匹配該屬性的任何值的通配符。3.1.11.3將一引用與一定義匹配以下算法用于匹配引用一名稱空間定義的名稱空間。當(dāng)編譯一名稱空間和解析所編譯的名稱空間之間的引用時,均可采用此算法。在編譯和編譯后的情況之間只有一個微小的不同在編譯期間忽略名稱空間的版本域,但在運行期間則必須給出。編譯處理將更新名稱空間引用,用以增加來自編譯期間一引用所要被解析到的名稱空間的其它信息。一般會添加名稱空間的版本。假如不提供公鑰令牌且此令牌在解析名稱空間中存在,則將其加入到名稱空間引用中。邏輯上,解析算法如下1、查找所有具有與引用中的名稱相匹配的名稱的名稱空間。2、假如此引用提供一公鑰令牌,那么只選擇也與所提供的公鑰令牌相匹配的名稱空間。3、假如引用提供了一特定語言,那么刪除與該語言不匹配的所有名稱空間。假如此語言屬性被設(shè)置為未提供的通配符,那么保持所有名稱空間。4、假如提供了一特定平臺,那么刪除與此平臺不匹配的所有名稱空間。假如平臺屬性被設(shè)置為未提供的通配符,那么保持所有名稱空間。5、然后利用版本策略,從此可能的名稱空間組中選擇一特殊名稱空間。以下的部分更詳細(xì)地定義了這些步驟3.1.11.3.1匹配名稱空間名稱匹配是一精確的字符串匹配。此名稱區(qū)分大小寫。3.1.11.3.2匹配公鑰令牌令牌匹配為一精確匹配3.1.11.3.3匹配語言有三種語言匹配的情況1、引用=*,定義=特定語言。2、引用=特定語言,定義=*。3、引用=特定語言,定義=特定語言。在第一和第二情況下,定義與引用相匹配。在第三情況下,假如語言為精確匹配,則定義只與引用匹配。3.1.11.3.4匹配平臺有三種平臺匹配的情況1、引用=*,定義=特定平臺。2、引用=特定平臺,定義=*。3、引用=特定平臺,定義=特定平臺。在第一和第二情況下,定義與引用匹配。在第三情況下,假如語言為精確匹配,則定義只與引用匹配。3.1.11.3.5匹配版本版本匹配依賴于編譯器或運行期間所使用的版本策略。3.2設(shè)置所有定義能公開設(shè)置值,這在XML模式中被稱為設(shè)置聲明。這些成員用于描述與此定義相關(guān)的配置值。利用SettingValue語句來提供值。這些被使用a)被定義使用,該定義聲明將設(shè)置定義為默認(rèn)值的設(shè)置成員。b)被一定義使用,該定義擴展另一定義用以提供此基本定義的默認(rèn)或固定值。c)被成員使用,該成員引用一定義,并通過在引用此定義的成員處終止的成員路徑使用。d)通過關(guān)系的信息流使用。為定義一設(shè)置,首先需要利用xsd定義此設(shè)置的定義。<SettingDefinitions><xsschematargetNamespace=″System.OperatingSystem.Registry″xmlns=″System.OperatingSystem.Registry″xmlnsxs=″http//www.w3.org/2001/XMLSchema″><xssimpleTypename=″PathType″><xsrestrictionbase=″xsstring″/></xssimpieType><xssimpleTypename=″RegistryValueType″><xsrestrictionbase=″xsNMTOKEN″><xsenumerationvalue=″binary″/><xsenumerationvalue=″integer″/><xsenumerationValue=″long″/><xsenumerationvalue=″expandString″/><xsenumerationvalue=″multiString″/><xsenumerationvalue=″string″/></xsrestriction></xssimpleType></xsschema></SettingDefinitions>然后,可聲明一個使用此定義并包括一組屬性的設(shè)置,從而定義設(shè)置的狀態(tài)。<SettingDeclarationName=″Definition″Definition=″RegistryValueType″Access=″Readwrite″Required=″true″/>一旦具有了一設(shè)置說明,就能為該設(shè)置提供一個值。<SettingValueName=′Definition″Fixed=″true″>long</SettingVaiue>3.2.1設(shè)置定義利用XSD模式定義設(shè)置成員所用到的設(shè)置定義。我們只支持使用一模式的簡單和復(fù)雜類型,盡管存在可支持那些類型的定義的其他模式的元素。設(shè)置定義部分應(yīng)該包含一完整的xml模式,其包括名稱空間聲明和名稱空間導(dǎo)入。除xsd模式名稱空間之外,我們將檢查xsd模式中導(dǎo)入與SDM文件中導(dǎo)入的匹配。這意味著所有引用的類型應(yīng)定義在另一SDM文件中;此模式不能引用定義在任意xsd文件中的類型。模式的目標(biāo)名稱空間必須與SDM文檔的名稱相匹配。當(dāng)為保證名稱空間名稱的唯一性而標(biāo)記文檔時,會將文檔的公鑰加入到名稱空間名稱中。所以編譯器將targetNamespace=“System”改變?yōu)閠argetNamespace=“System/AAAABBBBCCCCDDDD”。當(dāng)一設(shè)置定義模式引用來自另一文檔的名稱空間時,它們將使用用完整的名稱空間名xmlnssystem=″System/AAAABBBBCCCCDDDD″<xscomplexTypename=″SettingDefinitions″><xssequence><xsanynamespace=″http//www.w3.org/2001/XMLSchema″/></xssequence><xsattributename=″Manager″type=″QualifiedName″use=″optional″/><xsattributename=″ClrNamespace″type=″xsstring″use=″optional″/></xscomplexType>設(shè)置可從三個獨立的名稱空間解析a)SDM名稱空間——當(dāng)涉及系統(tǒng)、資源、端點、關(guān)系、約束條件或信息流類型中設(shè)置類型時。b)clr名稱空間——當(dāng)涉及利用clrz中的強類型類的設(shè)置時并且當(dāng)在其他設(shè)置類型上建立設(shè)置類型時。c)XSD名稱空間——當(dāng)利用其他設(shè)置類型建立設(shè)置類型時。為此,在設(shè)置聲明中設(shè)置一些限制a)所有設(shè)置必須在每個clr、SDM和xsd名稱空間的相同組內(nèi)。也就是說,假如兩個設(shè)置共同在一個名稱空間內(nèi),那么它們必須共同在所有三個名稱空間內(nèi)。b)在一xsd模式定義中的導(dǎo)入名稱空間必須與SDM文件中的導(dǎo)入名稱空間以及相關(guān)幫助集合的導(dǎo)入名稱空間相匹配。c)除xsd名稱空間之外,在一xsd模式中的所有導(dǎo)入名稱空間都必須定義在一個SDM文件中。來自導(dǎo)入的SDM文檔的XSD類型可以利用Qname訪問<alias><type-name>以下例子采用了上面所登記的例子中定義的類型。文檔導(dǎo)入了所登記的包括設(shè)置定義的文檔。<lmportAlias=″Registry″Name=″System.OperatingSystem.Registry″Version=″0.1.0.0″PublicKeyToken=″AAAABBBBCCCCDDDD″/>此設(shè)置定義模式也可引用Syetem.Operatinsyetem.registry(系統(tǒng).操作系統(tǒng).登記)名稱空間。<SettingDefinitions><xsschematargetNamespace=″http//DocumentExamples″xmlns=″http//DociimentExamples″xmlnsreg=″System.OperatingSystem.Registry/AAAABBBBCCCCDDDD″xmlns;xs=″http//www.w3.org/2001/XMLSchema″><xssimpleTypename=″UsesReg″><xsrestrictionbase=″regRegistryValueType″><xsenumerationvalue=″guid″/></xsrestriction></xssimpleType></xsschema></SettingDefinitions>3.2.2內(nèi)部簡單數(shù)據(jù)類型SDM支持有限組的作為XSD和C#名稱空間交集的內(nèi)部數(shù)據(jù)類型。SDM運行期間自然支持這些類型,并且這些類型定義如下表。除了這些類型,用戶可以自由構(gòu)建并使用他們自己的在xsd和els類型之間映射。這些類型可變?yōu)镃#和xsd類型空間中的這些類型的兼容派生類型。例如,string(字符串)的值可變?yōu)槎x了字符串限制的xsd類型,而且任何值可以傳遞給接受類型=“any”的設(shè)置。3.2.2.1XSD嵌入式類型圖15表示一個示例性的內(nèi)部數(shù)據(jù)類型的分級結(jié)構(gòu)。在圖15中,所有復(fù)雜類型源自擴展或限制。NMTOKENS、IDREFS和ENTITIES類型源自列表。如圖15所示的所有其他類型源自限制。3.2.2.2C#數(shù)據(jù)類型3.2.2.3所支持的變換xsd類型和els類型之間可以變換。指標(biāo)對比。染料上染百分率測量及計算分別在85℃下染色60分鐘后取出織物,且用蒸餾水洗滌三次,并收集殘液和洗液,轉(zhuǎn)移到250ml容量瓶中,冷卻、定容。在相同條件下測其殘液(A殘)及原染液(A0)吸光度,采用UltraScanXE型測色配色儀(HunterLabLtd.,美國)測量、計算勻染性。按GB251~84≈ISO/A03-1978標(biāo)準(zhǔn),分別對染色樣品進(jìn)行干濕摩擦牢度測試,并用彩色沾色樣卡進(jìn)行評級摩擦牢度。按GB250-84≈ISO105/A02-1982及GB250-84≈ISO105/A03-1982標(biāo)準(zhǔn),評定其沾色和褪色牢度。表1表2由表1、2所示數(shù)據(jù)可以看到,經(jīng)氬低溫等離子體處理后,其練減率、織物白度、毛效,可與常規(guī)精練相當(dāng),并且精練織物的抗彎剛度有所提高。此3.2.3設(shè)置成員設(shè)置說明部分利用前面的設(shè)置定義來創(chuàng)建指定的設(shè)置。利用一個限定名稱來引用xsd模式內(nèi)的設(shè)置定義(假如設(shè)置定義在當(dāng)前文檔中則不需要),此限定名稱包括包含設(shè)置的文檔的別名,和設(shè)置的名稱。當(dāng)參考一設(shè)置定義時我們沒有采用xsd名稱空間。屬性用于進(jìn)一步提供每個設(shè)置成員的參考信息。<xscomplexTypename=″SettingMember″><xscomplexContent><xsextensionbase=″Member″><xsattributename=″List″type=″xsboolean″/><xsattributeGroupref=″SettingsAttributes″/></xsextension></xscomplexContent></xscomplexType>3.2.4列表支持為支持多值設(shè)置的操作,就要支持設(shè)置值的簡單列表。一列表是與設(shè)置聲明具有相同定義的值序列。列表可變換為其可替換或附加到的其他列表。當(dāng)利用設(shè)置流可以更靈活地將值附加到一列表中時,就不支持副本檢測,并且不確保任何形式的排序。一列表聲明包括一個設(shè)置為真的屬性列表<SettingDeclarationName=″roles″Definition=″String″List=″true″/>利用settingValueList提供值。當(dāng)提供此列表時,用戶能指定是替換還是附加先前值。<SettingValuel_istPath=″roles″Fixed=″true″Replace=″true″><Value>6taticContent</Value><Value>aspPages</Value></SettingValueList>SDM支持多列值的簡單操作。當(dāng)來自一信息流成員的路徑指向一設(shè)置說明,那么其結(jié)果就依賴于路徑兩端的定義。3.2.5設(shè)置屬性運行期間利用設(shè)置屬性來描述一特殊設(shè)置的操作。<xsattributeGroupname=″SettingsAttributes″><xsattributename=″Access″><xssimpieType><xsrestrictionbase=″xsstring″><xsenumerationvalue=″Readwrite″/><xsenumerationvalue=″Readonly″/><xsenumerationvalue=″Writeonly″/></xsrestriction></xssimpleType></xsattribute><xsattributename=″Secure″type=″xsboolean″/><xsattributename=″DeploymentTime″type=″xsboolean″/><xsattributename=″Dynamic″type-′xsboolean″/><xsattributename=″Required″type=″xsboolean″/><xsattributename=″KeyValue″type=″xsboolean″/><xsattributename=″Nillable″type=″xsboolean″/></xsattributeGroup>3.2.6設(shè)置值按照設(shè)置是被聲明為單個值還是一列表,可利用一設(shè)置值元素或一設(shè)置值列表元素來提供此設(shè)置的值。3.2.6.1設(shè)置值設(shè)置值語句用于為一特殊設(shè)置聲明明提供值。此值必須匹配與聲明相關(guān)的定義,而此聲明必須能夠投射或被轉(zhuǎn)換成與設(shè)置聲明明相關(guān)的定義。假如此值被聲明為固定,那么根據(jù)此值被固定的點,所提供的值將用于所有導(dǎo)出定義或引用成員。一旦此值被固定,則其不能被覆蓋。<xscomplexTypename=″SettingValue″mixed=″true″><xssequence><xsanyprocessContents=″skip″minOccurs=″0″maxOccurs=″unbounded″/></xssequence><xsattributename=″Path″type=″Path″use=″required″/><xsattributename=″Fixed″type=″xsboolean″use=″optional″/><xsattributename=″Nil″type=″xsbooiean″/><xsattributename=″Definition″type=″QualifiedName″use=″optional″/></xscomplexType>3.2.6.2設(shè)置值列表一設(shè)置值列表用于提供用于以列表形式說明的設(shè)置的一或多值。當(dāng)說明此值時,用戶能決定合并先前值或覆蓋所有先前值。<xscomplexTypename=″SettingValueList″><xssequence><xselementname=″Value″minOccurs=″0″maxOccurs=″unbounded″><xscomplexTypemixed=″true″><xssequence><xsanyprocessContents=″skip″minOccurs=″0″maxOccurs=″unbounded″/></xssequence></xscomplexType></xselement></xssequence><xsattributename=″Path″type=″SimpleName″use=″required″/><xsattributename-′Fixed″type=″xsboolean″use=″optionai″/><xsattributename=″Replace″type=″xsboolean″use=″optionar/><xsattributename=″Definition″type=″QualifiedName″use=″optional″/></xscomplexType>3.2.7設(shè)置繼承設(shè)置繼承意思是導(dǎo)出定義隱含地包含來自基本定義的所有設(shè)置聲明。設(shè)置繼承的一些重要方面為設(shè)置繼承是可傳遞的。假如C從B導(dǎo)出,且B從A導(dǎo)出,則C繼承了B中聲明的設(shè)置同時也繼承了A中聲明的設(shè)置。一導(dǎo)出定義可將新設(shè)置說明加入到從它所擴展的基本定義中所繼承的設(shè)置說明中,但不能刪除和改變所繼承設(shè)置的定義。3.2.8設(shè)置實例實例空間中的設(shè)置實例保存了設(shè)置成員的實際值。一設(shè)置實例的值最初由定義空間中的設(shè)置值語句指定。然后求設(shè)置信息流的值,更新作為流目標(biāo)的設(shè)置實例的值在一些情況下,需要區(qū)分從設(shè)置值語句導(dǎo)出的設(shè)置值和隨后通過信息流提供的任何值。前者被稱之為“分配”值,后者被稱為“結(jié)果”值。3.2.9值傳輸為了將設(shè)置值從一信息流或者約束條件中傳入或傳出,采用了值傳輸。在評估與成員相關(guān)的定義之前,先評估一輸入傳輸,并且在評估了與成員相關(guān)的定義之后,評估一輸出傳輸。每個值傳輸通過Name屬性標(biāo)識將用作輸入目的地或輸出源的定義的設(shè)置。路徑屬性標(biāo)識了一個作為輸入的源或輸出的目的地的設(shè)置聲明。<xscomplexTypename=″ValueTransfer″><xsattributename=″Name″type=″SimpleName″/><xsattributename=″Path″type=″Path″/></xscomplexType>3.2.9.1輸入輸入語句標(biāo)識了在執(zhí)行信息流或約束條件之前將被傳輸?shù)妮斎胫?。此輸入能利用ValueSource元素選擇是將“分配”設(shè)置值還是將“結(jié)果”設(shè)置值作為輸入(參看分配/結(jié)果定義的XX部分)。<xscomplexTypename=″lnput″><xscomplexContent><xsextensionbase=″ValueTransfer″></xsextension></xscomplexContent></xscomplexType>3.2.9.2輸出輸出隨值傳輸而變化,其支持固定和替換目標(biāo)值的語義。<xscomplexTypename=″Output″><xscomplexContent><xsextensionbase=″ValueTransfer″><xsattributename=″Fix″type=″xsboolean″use=″optional″/><xsattributename=″Replace″type=″xsboolean″use=″optional″/></xsextension></xscomplexContent></xscomplexType>3.2.10投射我們支持向上和向下投射設(shè)置定義繼承樹。當(dāng)從目的定義導(dǎo)出一源定義時,從源到目的的投射被稱為上投射。當(dāng)從源定義導(dǎo)出目的定義時,從源到目的的投射被稱為下投射。由于樹根為Any定義,所有定義均可上投射到Any。圖16表示上投射和下投射的例子。在圖16中,User定義擴展基本定義Any。接下來ExtendedUser定義擴展基本定義User。通過構(gòu)建此定義層級,我們指示可在任何需要User定義的地方提供ExtendedUser定義,且可在任何需要Any定義的地方都提供ExtendedUser和User定義。以下設(shè)置聲明語句采用了如圖16的定義,并且將用在以下部分的例子中。<SettingDeclarationName=″First″Definition=″ExtendedUser″/><SettingDeclarationName=″Second″Definition=″Any″/><SettingDeclarationName=″Third″Definition=″User″/>3.2.10.1上投射在圖16中,當(dāng)ExtendedUser定義的實例被分配到一個需要User或Any定義的設(shè)置聲明時,將發(fā)生上投射。一個上投射的例子就是從設(shè)置說明First到設(shè)置說明Second的值傳輸。這將作為信息流輸入聲明的一部分發(fā)生。自動支持上投射。無需任何與開發(fā)者部分的特殊相互作用,任何值都可投射到其基本定義之一。當(dāng)上投射一設(shè)置實例時,此實例的實際定義將保持其設(shè)置值。3.2.10.2下投射在圖16中,當(dāng)用戶將一設(shè)置值從一被標(biāo)記為Any設(shè)置聲明轉(zhuǎn)移到一被標(biāo)記為User的設(shè)置聲明時將發(fā)生下投射。在此情況下,假如與實例相關(guān)的定義是User或ExtendedUser則只發(fā)生生指定。這意味著此設(shè)置實例可具有與當(dāng)前相關(guān)的設(shè)置聲明不同的定義。通過將一參考傳遞給四周都是該實例本身的實例的實際定義,可以在實例空間中追蹤到下投射。當(dāng)將一設(shè)置實例從Second傳遞到Third,假設(shè)此實例最初來自First,則發(fā)生一個下投射的例子。在此情況下,此設(shè)置實例是一個ExtendedUser定義的實例。當(dāng)將一設(shè)置實例從一信息流定義中傳遞出時則發(fā)生此實例。假如此實例的運行期間定義不等于或不是從目標(biāo)定義導(dǎo)出的,則下投射要由開發(fā)者明確地請求而且將會失敗。為請求一下投射,開發(fā)者將相關(guān)傳遞操作(輸入或輸出)的設(shè)置Cast屬性設(shè)為真。假如請求一投射,假如目的定義不是來源于源定義那么用戶將接收到一編譯錯誤,而且假如設(shè)置實例的定義與目的定義不同或者不是來源于目的定義那么用戶將接受到一運行錯誤。3.2.11轉(zhuǎn)換當(dāng)用戶希望將一設(shè)置實例轉(zhuǎn)移到一設(shè)置聲明中,其中此設(shè)置聲明具有與此實例不同的定義而且此設(shè)置說明的定義不是此實例定義的一基本定義,則需要類型轉(zhuǎn)換。圖17表示一個類型轉(zhuǎn)換的例子。如圖17所示,在位于繼承樹的不同分支中的定義之間,并且當(dāng)在繼承樹一分支中目的定義處于源定義之下時,就發(fā)生類型轉(zhuǎn)換。由設(shè)置管理器處理類型轉(zhuǎn)換。源和目的管理器均可支持轉(zhuǎn)換。這意味著一旦給定如圖17的定義和從一User定義到一String定義的指定,用于User的管理器提供到String的轉(zhuǎn)換或用于String的管理器能提供從User的轉(zhuǎn)換。運行期間將首先請求源管理器轉(zhuǎn)換此實例,然后是目的管理器,假如不存在有效轉(zhuǎn)換則最后返回一錯誤。為了請求一類型轉(zhuǎn)換,開發(fā)者將設(shè)置轉(zhuǎn)移(輸入或輸出)的屬性Convert標(biāo)記為真。假如不指定Convert,并且源定義與目標(biāo)定義不同或者源定義不是從目標(biāo)定義導(dǎo)出的,則編譯器將返回一錯誤。假如指定了轉(zhuǎn)換,編譯器將通過詢問兩個管理器是否都支持此轉(zhuǎn)換,來檢查兩種類型之間的轉(zhuǎn)換是否可以進(jìn)行。假如此實例具有一個源自與設(shè)置聲明相關(guān)的定義的定義,首先將在返回到上投射之前嘗試著將導(dǎo)出定義轉(zhuǎn)換為目的定義,然后轉(zhuǎn)換此值。注意,假如進(jìn)行上投射,可能失去作為轉(zhuǎn)換處理的一部分的信息。例如,假如我們指定在User和String之間的轉(zhuǎn)換,并且實際實例是一ExtendedUser,那么在返回到將User轉(zhuǎn)換到String之前,我們將首先嘗試將ExtendedUser轉(zhuǎn)換為String。3.2.12CLR至SDM類型映射在SDM模型中,所有設(shè)置定義均具有相應(yīng)的CLR類型。這些類型由與SDM模型中SettingDefinitons元素相關(guān)的管理器定義。當(dāng)一信息流、約束條件或配置管理器代表一SDM定義時,通過CLR類型的實例而不是SDM設(shè)置定義的實例來實現(xiàn)。這為開發(fā)者提供了一個更自然的編程模型,但是也意味著,為了將信息從SDM運行期間傳遞到管理器,SDM運行期間應(yīng)該能夠從SDM定義映射到CLR類型,并且為了從管理器接受返回信息,SDM運行期間應(yīng)該能夠從CLR類型映射到SDM定義。例如,在一個SDM模型中,開發(fā)者可定義以下設(shè)置定義<xssimpleTypename=″AppPoolIdentityType″><xsrestrictionbase=″xsstring″><xsenumerationvalue=″LocalSystem″/><xsenumerationvalue=″LocalService″/><xsenumerationvalue=″NetworkService″/><xsenumerationvalue=″UserDefined″/></xsrestriction></xssimpleType>然后開發(fā)者可寫一管理器,該管理器處理與獲得一個以下CLR類型的實例的設(shè)置定義相關(guān)的值publicenumAppPoolIdentityType{LocalSystem,LocalService,NetworkService,UserDefined,}此問題分為兩部分第一能夠從定義映射到類型并返回,第二能夠從SDM實例映射到CLR實例并返回。3.2.12.1定義到類型的映射為了從設(shè)置定義映射到一clr類型,我們采用管理器聲明、設(shè)置定義名稱空間和設(shè)置定義名稱。從SettingDefinition元素的Manager屬性所標(biāo)識的管理器聲明中,我們能獲得包含此類型的集合的一強大的名稱和位置,從SettingDefinition元素的ClrNamespace屬性,我們能獲得包含此類型的名稱空間的名稱。最后,我們能將設(shè)置定義的名稱加入到名稱空間名稱中,從而從集合中檢索此clr類型。相反的處理利用相同信息從一clr類型映射到一SDM定義。首先,我們從運行期間提供的類型信息中獲得集合名稱。然后我們發(fā)現(xiàn)引用此集合的管理器聲明,該集合給出一或多個模型文件。然后從模型文件中的設(shè)置定義部分,我們能發(fā)現(xiàn)名稱空間名稱和類型名稱的匹配對。3.2.12.2轉(zhuǎn)換實例值為了將設(shè)置實例從其XML格式的SDM表述轉(zhuǎn)換成Clr對象實例并返回,我們再利用與SettingDefinition元素相關(guān)的管理器。在此情況下,實現(xiàn)此變換的Clr類是由ClrClassName屬性和由Manager屬性標(biāo)識的管理器聲明的集合信息的組合來標(biāo)識。Clr類實現(xiàn)了在管理器接口規(guī)格說明(ref)中描述的ISettingSerialization接口。此接口既支持從SDMXml表述到Clr實例的轉(zhuǎn)換,也支持從一Clr對象實例到SDMXml表述的轉(zhuǎn)換。在Model文件中創(chuàng)建設(shè)置定義的開發(fā)者負(fù)責(zé)寫執(zhí)行該轉(zhuǎn)換的代碼。Clr類應(yīng)支持SettingDefinition元素中的所有設(shè)置定義的轉(zhuǎn)換。3.3屬性SDM中的許多對象能獲得與此對象的核心行為無關(guān)的行為。我們采用一個如下定義的通用屬性模型3.4定義定義用于創(chuàng)建資源和系統(tǒng)的可重用配置。它們與面向?qū)ο笳Z言中的類相似。3.4.1定義定義是導(dǎo)出對象、關(guān)系、約束條件和信息流定義的基礎(chǔ)。所有定義可包括以描述、設(shè)置成員、設(shè)置值和設(shè)計表面數(shù)據(jù)。每個定義由一簡名標(biāo)識并且引用一管理器。此管理器通過該定義標(biāo)識的類為此特殊定義的SDM運行期間提供支持。定義的名稱對于包含此定義的范圍內(nèi)的所有定義來說應(yīng)為獨一無二的。此范圍可為一SDM文檔或另一定義。<xscomplexTypename=″Definition″><xssequence><xselementname=″Desaiption″type=″Description″minOccurs=″0″/><xselementname=″DesignData″type=″DesignData″minOccurs=″0″/><xschoiceminOccurs=″0″maxOccurs=″unbounded″><xselementname=″SettingDeclaration″type=″SettingMember7><xselementname=″SettingValue″type=″SettingValue″/><xselementname=″SettingValueList″type=″SettingValueList″/></xschoice></xssequence><xsattributename=″Name″type=″SimpleName″use=″required″/><xsattributename=″Manager″type=″QualifiedName″use=″optional″/><xsattributename=″ClrClassName″type=″xsstring″use=″optional″/></xscomplexType>3.4.2對象定義一抽象的對象定義公開了一組設(shè)置聲明,可包含其所參與的關(guān)系的約束條件并在運行期間具有一相關(guān)管理器。以下是一個網(wǎng)絡(luò)服務(wù)器的抽象系統(tǒng)定義。此網(wǎng)絡(luò)服務(wù)器具有兩個設(shè)置和一個要求其包含至少在vsite類型上的關(guān)系約束條件。<SystemDefinitionAbstract=″true″Name=″WebServer″ClrClassName=″micorosft.sdm.llSSupportClass″Manager=″IISSupportCode″><SettingDeclarationName=″serverName″Definition=″String7><SettingDeclarationName=″category″Definition=″String″/><SettingDeclarationName=″roles″Definition=″String″List=″true7><RelationshipConstraintName=″containsVsites″RelationshipDefinition=″containmentRelationship″TargetRole-′Member″TargetObjectDefinition=″vsite″MinOccurs=″1″WlaxOccurs=″unbounded″/></SystemDefmition>Vsite是一個包含服務(wù)器捆綁信息的抽象端點定義<EndpointDefinitionAbstract=″true″Name=″vsite″><SettingDeclarationName=″ipAddress″Definition=″ipaddress″required=″true7<SettingDeclarationName=″port″Definition=″lnt7><SettingDeclarationName=″domainName″Definition=″lnt″/><SettingDeclarationName=″securityModel″Defintion=″securityModelEnum7></EndpointDefinition>一個前端網(wǎng)絡(luò)服務(wù)器的具體系統(tǒng)定義標(biāo)識了網(wǎng)絡(luò)服務(wù)器的范疇為靜態(tài)內(nèi)容,包含代表1和100之間的端點實例的單個傳引用的端點成員。此端點的具體端點定義嵌套在系統(tǒng)定義中,并且其將vsite的ip端點定義為端點80。<SystemDefinittonName=″FrontendWebServer″Extends=″WebServer″><SettingValuePath=″serverName″Fixed=″true″>myFEServer</SettingValue><SettingValueListPath=″roles″Fixed=″true″Replace=″true″><Value>staticContent<A/alue><Value>aspPages<A/alue></SettingValueList><EndpointDefinitionName=″port80Vsite″Extends=″vsite″><SettingValuePath=″port″Fixed=″true″>80</SettingValue></EndpointDefinition><EndpointName=″contentOnlyVsite″Definition=″port80Vsite″Reference=″true″MinOccurs=″TMaxOccurs=″100″/></SystemDefinition>3.4.2.1對象定義抽象和具體對象擴展了以下基本對象定義。除了基本類型定義的元素之外,它們共同具有約束對象所參與的關(guān)系的能力。<xscomplexTypename=″ObjectDefinition″><xscomplexContent><xsextensionbase=″Definition″><xschoiceminOccurs=″0″maxOccurs=″unbounded″><xselementname=″Flow″type=″FlowMember″minOccurs=″0″maxOccurs=″unbounded″/><xselementname=″RelationshipConstraintGroup″type=″RelationshipConstraintGroup″/><xselementname=″RelationshipConstraint″type=″RelationshipConstraint″/><xselementname=″Constraint″type=″ConstraintMember″/></xschoice><xsattributename=″Visibility″type=′VisibilityEnum″use=″optional″/><xsattributename=″Layer″type=″xsstring″use=″optional″/><xsattributename=″Extends″type=″QualifiedName″use=″optional″/><xsattributename=″Abstract″type=″xsboolean″use=″optional″/></xsextension></xscomplexContent></xscomplexType>抽象對象定義用于定義設(shè)計表面公開的結(jié)構(gòu)塊,并且從其中能導(dǎo)出所有具體對象一具體對象定義實現(xiàn)了一抽象對象定義。抽象對象定義通過加入簡單繼承來擴展SDM對象“extends”屬性用于標(biāo)識一抽象對象定義的基本對象定義。此抽象對象定義然后從基本對象定義中繼承設(shè)置和關(guān)系約束條件。通過繼承,對象定義可通過加入新設(shè)置和約束條件來擴展抽象對象定義的設(shè)置和約束條件。抽象對象定義也能加入它們希望參與的關(guān)系上的約束條件。例如,一抽象對象定義可要求存在某些關(guān)系,可約束處于關(guān)系另一端的對象定義或可約束參與一給定關(guān)系的實例的設(shè)置。對象定義也可包含嵌套定義的聲明。這些定義可用于在包含定義范圍內(nèi)的成員并且可以被引用到該定義范圍之外的約束條件中。具體對象定義提供了一抽象對象定義的實現(xiàn)。該實現(xiàn)根據(jù)對象和關(guān)系成員、所實現(xiàn)的抽象定義的設(shè)置值、新設(shè)置聲明、成員間的信息流和成員的約束條件構(gòu)成了該實現(xiàn)。3.4.2.2隱含基本定義所有未擴展另一對象定義的對象定義隱含地擴展了端點、系統(tǒng)或源基本定義之一。這些基本定義形成了用在關(guān)系和約束條件聲明的每個樹的根。這允許關(guān)系或約束條件指示任何從根導(dǎo)出的類型可用在所標(biāo)識的根定義。這些根類型總是抽象的并且不能直接例示。這些類型的定義包括控制模型內(nèi)的例示的基本約束條件。3.4.2.3端點定義端點定義通過增加聲明嵌套資源類型、資源成員以及宿主、包含和引用關(guān)系成員的能力來擴展基本對象定義。<xscomplexTypename=″EndpointDefinition″><xscomplexContent><xsextensionbase=″ObjectDefinition″><xschoiceminOccurs=″0″maxOccurs=″unbounded″><xselementname=″ResourceDefinition″type=″ResourceDefinition″/><xselementname=″Resource″type=″ResourceMember″/><xselementname=″Hosting″type=″HostingMember″/><xselementname=″Containment″type=″ContainmentMember″/><xselementname=″Reference″type=″ReferenceMember″/></xschoice></xsextension></xscomplexContent></xscomplexType>3.4.2.4系統(tǒng)定義一系統(tǒng)類型通過增加對以下內(nèi)容的支持?jǐn)U展了基本類型嵌套端點、系統(tǒng)和資源類型;端點、系統(tǒng)和資源成員以及宿主、包含、連接、授權(quán)和參考關(guān)系。<xscomplexTypename=″SystemDefinition″><xscomplexContent><xsextensionbase=″ObjectDefinition″><xschoiceminOccurs=″0″maxOccurs=″unbounded″><xselementname=″EndpointDefinition″type=″EndpointDefinition″/><xselementname=″SystemDefinition″type=″SystemDefinition7><xselementname=″ResourceDefinition″type=″ResourceDefinition″/><xselementname=″Endpoint″type=″EndpointMember7><xselementname=″Subsystem″type=″SystemMember7><xselementname=″Resource″type=″ResourceMember″/><xselementname=″Hosting″type=″HostingMember″/><xselementname=″Containment″type=″ContainmentMember″/><xselementname=″Connection″type=″CommunicationMember″/><xselementname=″Delegation″type=″DelegationMember″/><xselementname=″Reference″type=″ReferenceMember″/></xschoice><xsattributename=″SimulationRoot″type=″xsbooiean″use=″optional″/></xsextension></xscomplexContent></xscomplexType>3.4.2.5資源定義一資源類型可包含嵌套資源類型定義、資源成員以及宿主、包含和引用關(guān)系成員。<xscomplexTypename=″ResourceDefinition″><xscomplexContent><xsextensionbase=″ObjectDefinition″><xschoiceminOccurs=″0″maxOccurs=″unbounded″><xselementname=″ResourceDefinition″type=″ResourceDefinition7><xselementname=″Resource″type=″ResourceMember″/><xselementname=″Hosting″type=″HostingMember″/><xselementname=″Containment″type=″ContainmentMember″/><xselementname=″Reference″type=″ReferenceMember7></xschoice></xsextension></xscomplexContent></xscomplexType>3.4.2.6關(guān)系規(guī)則對于一對象定義的一特殊實例,下表標(biāo)識了與實例所能扮演的角色相關(guān)的基數(shù)。3.4.2.6.1系統(tǒng)規(guī)則3.4.2.6.2端點規(guī)則3.4.2.6.3資源規(guī)則3.4.2.6.3資源規(guī)則3.4.2.6.4注意每個實例應(yīng)該正確參與一個包含關(guān)系和至少一個宿主關(guān)系。這意味著a)非引用(傳值)成員應(yīng)標(biāo)識一個在相同定義中的包含關(guān)系b)為了被構(gòu)建一引用成員應(yīng)標(biāo)識一包含關(guān)系。3.4.3關(guān)系定義關(guān)系用于標(biāo)識類型之間的可能的交互作用。它們是二元的并且是直接的,每個標(biāo)識都標(biāo)識了能參與此關(guān)系的實例類型。關(guān)系也能約束參與此關(guān)系的實例的設(shè)置,并能通過此關(guān)系傳遞設(shè)置值。以下是一個用于在類型部分所述的網(wǎng)絡(luò)服務(wù)器的webApplication的可能的宿主關(guān)系。此關(guān)系包含一約束條件,此約束條件驗證兩個系統(tǒng)的安全模型是兼容的,并且此關(guān)系還包括了一設(shè)置信息流,而此設(shè)置信息流將服務(wù)器名稱從vsite復(fù)制到vdir。<HostingDefinitionName=″vsiteHostsVdir″GuestDefinition=″vdir″HostDeffinition=″vsite″><ObjectConstraintName=″checkCompatibility″PrimaryRole=″Guest″PrimaryObjectDefinition=″vdir″><ConstraintName=″constrainSecurityModel″Definition=″SimpleOperatorComparison″><SettingValuePath=″operator″>=</SettingValue><lnputName=″LHS″Path=″host.securityModel7><lnputName=″RHS″path=″guest.securityModeP/></Constraint></ObjectConstraint><FlowDefinition=″copy″Name=″copyServerToVdir″><lnputName=″source″Path=″host.server″/><OutputName=″desination″Path=″guest.server″/></Flow></HostingDefinition>通過聲明一個標(biāo)識了將參與此關(guān)系的類型成員的關(guān)系成員來使用關(guān)系。<SystemDefinitionName=″TestSystemt″Extends=″DistributedApplication″><ResourceName=″myVdir″Definition=″vdir″Reference=″false″/><ResourceName=″myVsite″Definition=″vsite″Reference=″false″/><HostingName=″HostMyVsite″Definition=″vsiteHostsVdir″GuestMember=″myVdir″HostMember=″myVsite″/></SystemDefinition>3.4.3.1關(guān)系定義基本關(guān)系定義將對象約束條件和信息流加入到定義中。對象約束條件是關(guān)于參與此關(guān)系實例的對象實例的設(shè)置值的語句。例如,一個表示DCOM連接的通信關(guān)系可檢查客戶機和服務(wù)器是兼容的安全設(shè)置。在此情況下,在易于獲得的作為部分設(shè)計處理的設(shè)置間存在嚴(yán)格的關(guān)系;在此關(guān)系上存在四階設(shè)置組合,但只有少得多的有效組合。信息流賦予關(guān)系開發(fā)者將值從一個實例傳遞給另一實例的能力。為充分描述一特殊實例,信息流允許對象定義與其可能的交互關(guān)系獨立開發(fā)且允許此實例獨立作為一信息引用點而無需一關(guān)系圖子集。具體關(guān)系是兩個具體對象定義之間的關(guān)系。每個具體關(guān)系可實現(xiàn)一抽象關(guān)系。此抽象關(guān)系應(yīng)在由具體對象定義直接或間接(通過繼承)實現(xiàn)的的抽象對象定義的一匹配對之間。關(guān)系的名稱應(yīng)在包含此關(guān)系的名稱空間內(nèi)是獨一無二的。<xscomplexTypename=″RelationshipDefinition″><xscomplexContent><xsextensionbase=″Definition″><xschoiceminOccurs=″0″maxOccurs=″unbounded″><xselementname=″ObjectConstraintGroup″type=″ObjectConstraintGroup″/><xselementname=″ObjectConstraint″type=″ObjectConstraint″/><xselementname=″Flow″type=″FlowMember″/></xschoice><xsattributename=″Extends″type=″QualifiedName″use=″optionai″/><xsattributename=″Abstract″type=″xsboolean″use=″optional″/></xsextension></xscx)mplexContent></xscomplexType>3.4.3.2通信關(guān)系通信關(guān)系用于獲得端點定義之間可能的通信鏈接。它們用于描述獨立配置的軟件元素之間的相互作用。通信關(guān)系模式通過增加客戶機和服務(wù)器端點引用從而擴展了基本關(guān)系模式。<xscomplexTypename=″CommunicationDefinition″><xscomplexContent><xsextensionbase=″RelationshipDefinition″><xssequence><xselementname=″Connection″type=″HostingMember″minOccurs=″0″maxOccurs=″unbounded″/></xssequence><xsattributename=″ClientDefinition″type=″QualifiedName″use=″required″/><xsattributename=″ServerDefinition″type=″QuaiifiedName″use=″required″/></xsextension></xscomplexContent></xscomplexType>以下抽象類型對的組合對于通信關(guān)系是有效的3.4.3.3宿主關(guān)系宿主關(guān)系用于獲得一客戶為了被構(gòu)件需要一宿主的事實。由于一個客戶可存在超過一個可能的宿主,這意味著宿主關(guān)系也負(fù)責(zé)在一宿主上的客機的構(gòu)造。所以為了創(chuàng)建一對象的一實例,宿主關(guān)系是從一客戶到一可兼容宿主。例如,在一Webservice對象定義和一IIS對象定義之間可存在一宿主關(guān)系。在此情況下,假定MyWebservice和MyIIS分別實現(xiàn)網(wǎng)絡(luò)服務(wù)和IIS,此關(guān)系表示有可能利用宿主關(guān)系的管理器,在系統(tǒng)MyIIS實例上創(chuàng)建系統(tǒng)MyWebservice實例。直到評估了系統(tǒng)和關(guān)系的約束條件后,我們才知道將是否有可能創(chuàng)建此關(guān)系。當(dāng)我將一應(yīng)用程序配置到一數(shù)據(jù)中心時,需要解析在此應(yīng)用程序中系統(tǒng)的所有典型宿主關(guān)系。為此,操作者需要為每個所需的宿主關(guān)系創(chuàng)建宿主成員。為簡化操作者的任務(wù)并允許開發(fā)者引導(dǎo)配置過程,開發(fā)者可創(chuàng)建一具體宿主關(guān)系。此具體宿主關(guān)系用于將一組宿主關(guān)系成員按以下方式分組當(dāng)配置此應(yīng)用程序時操作者只需聲明一單個宿主成員。一客戶可被歸為一宿主iff對于客戶中的每個客戶成員在宿主中存在一個或多個宿主成員,其中g(shù)uestMeraber.Type與withhostMember.type具有宿主關(guān)系并且guestMember.hostConstraints相對于hostMember.settings進(jìn)行驗證并且hostMember.settings相對于guestMember.settings進(jìn)行驗證并且對于guestMember的每個成員,都存在一到hostMember的成員的歸并(AguestcanbeboundtoahostiffForeachguestMemberinGuestThereexistsoneormorehostMemberinHostwhere)guestMeraber.TypehasahostingrelationwithhostMember.type)andguestMember.hostConstraintsvalidateagainsthostMember.settings)andhostMember.guestConstraintsvalidateagainstguestMember.settingsandforeachmemberofguestMemberthereexistsabindingtoamemberofhostMember)例如,以下具體關(guān)系將一層三個系統(tǒng)(Bike)歸并到一層兩個主機(操作系統(tǒng))。在此情況下,我們定義一個用于宿主關(guān)系的設(shè)置,其默認(rèn)值被設(shè)為“系統(tǒng)文件夾”。我們將此設(shè)置傳給定義層3應(yīng)用系統(tǒng)和層2主機系統(tǒng)之間的宿主關(guān)系的三個主機成員之一。<HostingDefinitionName=″DefaultBikePlacement″GuestDefinition=″Bike″HostDefinition=″OperatingSystemOperatingSystem″><SettingDeclarationName=″fileLocationRelativeToRoot″Definition=″xssting″Access=″Readwrite″/><Sett!ngValuePath=″dirPath″>systemFolder</SettingValue><FlowName=″copyPath″Definition=″copy″><lnputName=″source″Path=″dirPath″/><OutputName=″destination″Path=″bikeExecutableHost.hostRelativePath″/></Row><HostingName=″bikeExecutableHosfDefinition=″fileDirectoryHost″GuestMember=″guest.bikeFile″HostMember=″host.FileSystem″/><HostingName=″bikeEventKeyHost″Definition=″registryKeyRegistryKeyHost″GuestMember=″guest.bikeEventKey″HostMember=″host.Registry.ApplicationEventKey″/><HostingName=″bikeSoftwareKeyHost″Definition=″registryKeyRegistryKeyHost″GuestMember=″guest.bikeSoftwareKey″HostMember=″host.Registry.HKLM″/></HostingDefinition><xscomplexTypename=″HostingDefinition″><xscomplexContent><xsextensionbase=″RelationshipDefinition″><xssequence><xselementname=″Hosting″type=″HostingMember″minOccurs=″0″maxOccurs=″unbounded7></xssequence><xsattributename=″GuestDefinition″type=″QualifiedName″use=″required″/><xsattributename=″HostDefinition″type=″QualifiedName″use=″required″/><xsattributename=″SimulationRoot″type=″xsboolean″use=″optional″/></xsextension></xscomplexContent></xscomplexType>以下抽象定義對的組合對于宿主關(guān)系是有效的3.4.3.4包含關(guān)系在兩個抽象對象之間的包含關(guān)系用于獲得基于parentType的具體類型可包含基于memberType的成員的事實。包含意味著父實例可控制成員實例的生命期,并且可授權(quán)成員實例的行為。<xscomplexTypename=″ContainmentDefinition″><xscomplexContent><xsextenstonbase=″RelationshipDefinition″><xssequence><xselementname=″Containment″type=″HostingMember″minOccurs=″0″maxOccurs=″unbounded″/></xssequence><xsattributename=″ParentDefinition″type=″QualifiedName″use=″required″/><xsattributename=″MemberDefinition″type=″QualifiedName″use=″required″/></xsextension></xscomplexContent></xscomplexType>以下抽象定義對的組合對于包含關(guān)系是有效的3.4.3.5授權(quán)關(guān)系授權(quán)用于將行為從一個外部系統(tǒng)傳遞給一個被包含的系統(tǒng)。這通過將外部系統(tǒng)的端點授權(quán)給內(nèi)部系統(tǒng)的端點來實現(xiàn)。這就有效地將所有直接對外部系統(tǒng)的交互作用傳送給了內(nèi)部系統(tǒng)端點。授權(quán)可以是一連串的,允許內(nèi)部系統(tǒng)將該行為進(jìn)一步授權(quán)給另一系統(tǒng)。一授權(quán)關(guān)系限定了多對能參與授權(quán)的抽象端點定義。每個關(guān)系標(biāo)識了作為一代理的抽象端點定義和能授權(quán)此行為的一抽象端點定義。<xscomplexTypename=″DelegationDefinition″><xscomplexContent><xsextensionbase=″RelationshipDefinition″><xssequence><xselementname=″Delegation″type=″HostingMember″minOccurs=″0″maxOccurs=″unbounded″/></xssequence><xsattributename=″ProxyDefinition″type=″QualifiedName″use=″required″/><xsattributename=″DelegateDefinition″type=″QualifiedName″use=″required″/></xsextension></xscomplexContent></xscomplexType>以下抽象類型對的組合對于授權(quán)關(guān)系是有效的為支持層間的結(jié)合,我們允許資源和系統(tǒng)的授權(quán)。例如,允許IIS無需配置文件系統(tǒng)便可公開部分文件系統(tǒng)。3.4.3.6參考關(guān)系我們利用參考關(guān)系給出實例之間除宿主關(guān)系從屬性之外的強大從屬性。這些從屬性用于控制配置期間的構(gòu)建順序以及安裝和更新期間系統(tǒng)之間的信息流參數(shù)。由于引用關(guān)系表示一強大的從屬性,就不能允許引用關(guān)系跨越一系統(tǒng)邊界。這意味著系統(tǒng)內(nèi)資源以來另一系統(tǒng)資源。這使得此系統(tǒng)不再是一個獨立的配置單元。在系統(tǒng)之間存在從屬性的地方,我們使用通信關(guān)系。通信關(guān)系無需重安裝系統(tǒng)便可隨著時間推移而改變。<xscomplexTypename=″ReferenceDefinition″><xscomplexContent><xsextensionbase=″RelationshipDefinition″><xssequence><xselementname=″Reference″type=″HostingMember″minOccurs=″0″maxOccurs=″unbounded″/></xssequence><xsattributename=″DependentDefinition″type=″QualifiedName″use=″required″/><xsattributename=″SourceDefinition″type=″QualifiedName″use=″required″/></xsextension></xscomplexContent></xscomplexType>以下抽象類型對的組合對于參考關(guān)系是有效的3.4.3.7隱含基本關(guān)系所有抽象關(guān)系隱含地擴展一個基本關(guān)系定義。這些定義形成了每個關(guān)系樹的根。圖18描述了一個示例性的關(guān)系樹。為此,我們可從約束條件定義內(nèi)參考根定義且能從根類型繼承通用類型約束條件3.5成員3.5.1成員成員用于標(biāo)識一個在運行期間存在的特殊定義的實例。所有成員均通過一名稱標(biāo)識,此名稱在包含此成員的定義范圍內(nèi)的成員組中是獨一無二的。一成員可為其所引用的定義提供設(shè)置。一成員也可包含設(shè)計表面特定數(shù)據(jù)。<xscomplexTypename=″Member″><xssequence><xselementname=″Description″type=″Description″minOccurs=″0″/><xselementname=″DesignData″type=″DesignData″minOccurs=″0″/><xschoiceminOccurs=″0″maxOccurs=″unbounded″><xselementname=°SettingValue″type=″SettingValue″/><xselementname=″SettingValueList″type=″SettingValueList″/></xschoice></xssequence><xsattributename=″Name″type=″SimpleName″use=″required″/><xsattributename=″Definition″type=″QualifiedName″use=″required″/><xsattributename=″Visibility″type=″VisibilityEnum″use=″optional″/></xscomplexType>3.5.2對象成員對象成員可參考一抽象或具體的對象定義。它們能表示一實例陣列,在這種情況下,它們能定義此陣列的上限和下限。假如它們是引用成員,那么用戶例示此對象就隱含構(gòu)建了一個此成員的實例。假如它們不是引用成員,那么此運行期間將在創(chuàng)建外部對象的同時創(chuàng)建一實例。<xscomplexTypename=″ObjectMember″><xscomplexContent><xsextensionbase=″Member″><xsattributename=″MinOccurs″type=″MinOccurs″use=″optional″/><xsattributename=″MaxOccurs″type=″MaxOccurs″use=″optional″/><xsattributename=″Reference″type=″xsboolean″use=″required″/></xsextension></xscomplexContent></xscomplexType>在一SDM模型中,我們需要將當(dāng)構(gòu)建父體時創(chuàng)建并且消滅父體時也被消滅的成員與其生命期獨立于其父體的成員相區(qū)分。為此我們使用IsReference屬性。一簡單的模擬是C++說明,其基于“new”是否用于創(chuàng)建一實例,允許基于堆棧和堆結(jié)構(gòu)。假如一成員標(biāo)記為IsReference,那么部分操作者需要一清楚的新的操作,用以創(chuàng)建一個實例并將其與成員相關(guān)。有許多原因?qū)е挛覀円?.當(dāng)一操作者構(gòu)建一系統(tǒng)時,我們只需給出構(gòu)建isReference成員的能力。這大大簡化了操作者的操作過程。2.但我們處理一SDM文檔時,我們對文檔的實例空間與具體定義空間明確區(qū)分。3.5.3關(guān)系成員關(guān)系成員標(biāo)識了當(dāng)創(chuàng)建對象成員時它們之間存在的關(guān)系。關(guān)系實例是由操作者明確地創(chuàng)建或由運行期間隱含地創(chuàng)建。前者的例子是實例之間的宿主關(guān)系,后者的例子是系統(tǒng)之間的通信關(guān)系。<xscomplexTypename=″RelationshipMember″><xscomplexContent><xsextensionbase=″Member″/></xscomplexContent></xscomplexType>3.5.4端點成員<xscomplexTypename=″EndpointMember″><xscomplexContent><xsextensionbase=″ObjectMember″/></xscomplexContent></xscomplexType>3.5.5系統(tǒng)成員<xscomplexTypename=″SystemMember″><xscomplexContent><xsextensionbase=″ObjectMember″/></xscomplexContent></xscomplexType>3.5.6資源成員<xscomplexTypename=″ResourceMember″><xscomplexContent><xsextensionbase=″ObjectMember″/></xscomplexContent></xscomplexType>3.5.7宿主成員宿主成員用于聲明兩個對象成員之間的宿主關(guān)系。此對象成員是包含定義的直接成員或是與此定義具有一成員關(guān)系的嵌套成員。在被引用的成員和包含成員之間存在一成員關(guān)系鏈。<xscomplexTypename=″HostingMember″><xscomplexContent><xsextensionbase=″RelationshipMember″><xsattributename=″GuestMember″type=″Path″use=″required″/><xsattributename=″HostMember″type=″Path″use=″required″/></xsextension></xscomplexContent></xscomplexType>3.5.8通信成員通信成員用于聲明在定義的即時系統(tǒng)的端點成員中的端點成員之間的通信關(guān)系。<xscomplexTypename=″CommunicationMember″><xscomplexContent><xsextensionbase=″RelationshipMember″><xsattributename=″ClientMember″type=″Path″use=″required″/><xsattributename=″ServerMember″type=″Path″use=″required″/></xsextension></xscomplexContent></xscomplexType>3.5.9包含成員包含成員用于聲明一個類型成員被該類型所包含。每個類型成員可被包含或授權(quán)。包含成員自動將包含關(guān)系的父值設(shè)置成該關(guān)系的指針。<xscomplexTypename=″ContainmentMember″><xscomplexContent><xsextensionbase=″RelationshipMember″><xsattributename=″ChildMember″type=″Path″use=″required″/></xsextension></xscomplexContent></xscomplexType>3.5.10授權(quán)成員一授權(quán)成員用于建立在外部類型的端點定義成員和外部類型的及時系統(tǒng)成員的端點定義成員之間的授權(quán)關(guān)系。<xscomplexTypename=″DelegationMember″><xscomplexContent><xsextensionbase=″RelationshipMember″><xsattributename=″ProxyMember″type=″Path″use=″required″/><xsattributename=″DelegateMember″type-′Path″use=″required″/></xsextension></xscomplexContent></xscomplexType>3.5.11參考成員參考成員用于在外部定義的兩個即時或嵌套成員之間建立一個參考關(guān)系。<xscomplexTypename=″ReferenceMember″><xscomplexContent><xsextensionbase=″ReiationshipMember″><xsattributename=″DependentMember″type=″Path″use=″required″/><xsattributename=″SourceMember″type=″Path″use=″required″/></xsextension></xscomplexContent></xscomplexType>3.6信息流設(shè)置信息流用于在一對象定義的成員之間以及關(guān)系的參與者之間傳遞參數(shù)。作為信息流的一部分,用戶可利用變換來組合或分離設(shè)置值以及計算新的設(shè)置值。所有設(shè)置信息流成員利用一信息流定義來實現(xiàn)變換。以下是分析url的信息流定義。<FlowDefinitionName=″urlToComponents″><SettingDeclarationName=″url″Definition=″url″Access=″Writeonly″/><SettingDeclarationName=″protocol″Definition=″String″Access=″Readonly″/><SettingDeclarationName=″server″Definition=″String″Access=″Readonly″/><SettingDeclarationName=″Path″Definition=″String″Access=″Readonly″/><SettingDeclarationName-′file″Definition=″String″Access=″Readonly″/></FlowDefinition>在一對象或關(guān)系中聲明一信息流成員。信息流成員提供了信息流定義的輸入,然后將信息流的輸出導(dǎo)入目標(biāo)設(shè)置。<FlowName=″deconstructUrl″Definition=″urlToComponents″><lnputName=″url″Path=″webservice.ul″/><OutputName=″server″Path=″webservice.server″Replace=″false″/></Flow>3.6.1信息流定義我們利用信息流定義來定義我們希望對一組設(shè)置值應(yīng)用的特殊變換。信息流定義給出了定義輸入設(shè)置(只寫設(shè)置)和輸出設(shè)置(制度設(shè)置)的一設(shè)置模式,一用于設(shè)計表面特定信息的DesignData部分,例如用于定義變換的輸入接口、以及當(dāng)瀏覽SDM文件時使用的描述。信息流定義是由在其中定義該信息流定義的名稱空間內(nèi)的名稱來標(biāo)識。,此定義也標(biāo)識了一個將支持評估信息流的運行的管理器。我們希望運行期間將包括幾個標(biāo)準(zhǔn)信息流定義從而簡化需要直接變換的信息流元素的構(gòu)建。例子可包括復(fù)制、合并和字符串替換。由于信息流定義可參數(shù)化,我們也希望有一或多個基于配置參數(shù)來執(zhí)行不同動作的變換。<xscomplexTypename=″FlowDefinition″><xscomplexContent><xsextensionbase=″Definition″/></xscomplexContent></xscomplexType>3.6.2信息流成員每個信息流成員標(biāo)識一或多個輸入設(shè)置、一或多個目的設(shè)置可提供固定設(shè)置值并且能標(biāo)識一信息流定義。當(dāng)評估此信息流時,從輸入收集源數(shù)據(jù),合并固定設(shè)置值并將其傳遞給用于變換的信息流定義。依據(jù)信息流成員列出的輸出,將定義的輸出傳遞給目的設(shè)置。只要其中的一個源值改變便會觸發(fā)信息流的再評估。因此,我們需要避免導(dǎo)致值振蕩的循環(huán)信息流。假如此值保持不變,那么將終止循環(huán)。運行期間通過跟蹤堆棧的深度來檢測并終止無極限的回路。從分離的信息流成員到對象實例的相同設(shè)置成員的輸出是一錯誤。<xscomplexTypename=″FlowMember″><xscomplexContent><xsextensionbase=″Member″><xschoiceminOccurs=″0″maxOccurs=″unbounded″><xselementname=″lnput″type=″SettingTarget″/><xselementname=″Output″type=″OutputPath″/></xschoice></xsextension></xscomplexContent></xscomplexType>3.7約束條件約束條件用于標(biāo)識對一定義的成員的設(shè)置值或者一關(guān)系的參與者的限定。在設(shè)計期間和配置期間的在實例空間中都要評估這些限定。所有設(shè)置約束條件采用一約束條件定義來評估設(shè)置值。約束條件定義采用設(shè)置聲明來標(biāo)識它所約束的值。以下約束條件定義實現(xiàn)了將兩個變量和一操作者簡單比較的功能,然后評估約束條件,最后返回成功或錯誤。<ConstraintDefinitionName=″SimpleOperatorComparison″><SettingDeclarationName=″LHS″Definition=″Any″Access=″Writeonly″/><SettingDeclarationName=″operator″Definition=″operator″Access=″Writeonly″/><SettingDeclarationName=″RHS″Definition=″Any″Access=″Writeonly″/></ConstraintDefinition>一約束條件成員然后將此值提供給用于評估的約束條件類型。<ConstraintName=″constraintSecurityMode″Definition=″SimpleOperatorComparison″><SettingValuePath=″operator″>=</SettingValue><SettingValuePath=″RHS″>basicAuth</SettingValue><lnputName=″LHS″Path=″webservice.securityMode″/></Constraint>3.7.1約束條件定義一約束條件定義限定了一組輸入值的約束條件。此約束條件可參數(shù)化,從而選擇客戶行為或支持一簡單的利用參數(shù)來定義其行為的約束條件引擎。我們希望為簡單參數(shù)值約束條件和一組復(fù)雜約束條件的寫一組標(biāo)準(zhǔn)約束條件定義從而支持抽象對象的已知關(guān)系。<xscomplexTypename=″ConstraintDefinition″><xscomplexContent><xsextensionbase=″Definition″><xschoiceminOccurs=″0″maxOccurs=″unbounded″><xselementname=″RelationshipConstraint″type=″RelationshipConstraint″/><xselementname=″RelationshipConstraintGroup″type=″RelationshipConstraintGroup″/><xselementname=″ObjectConstraint″type=″ObjectConstraint″/><xselementname=″ObjectConstraintGroup″type=″ObjectConstraintGroup″/></xschoice><xsattributename=″TargetDefinition″type=″QualifiedName″use=″optional″/></xsextension></xscomplexContent></xscomplexType>3.7.2約束條件成員一約束條件成員標(biāo)識了特殊約束條件定義的一組輸入值。此成員可標(biāo)識設(shè)置的靜態(tài)值,并且也能利用輸入語句將一約束條件設(shè)置結(jié)合到一路徑中。<xscomplexTypename=″ConstraintMember″><xscomplexContent><xsextensionbase=″Member″><xschoiceminOccurs=″0″maxOccurs=″unbounded″><xselementname=″Input″type=″Input″/></xschoice></xsextension></xscomplexContent></xscomplexType>3.7.3結(jié)構(gòu)的約束條件我們采用對象和關(guān)系約束條件來定義具體空間的拓?fù)浣Y(jié)構(gòu)并約束用于特定關(guān)系中的對象設(shè)置。例如,在一抽象對象定義(A)中,我們想標(biāo)識此抽象定義的實現(xiàn)應(yīng)包含另一抽象對象定義的實例(B)。假定已存在至少一個適當(dāng)?shù)陌P(guān)系,為此,我們將采用A中的一關(guān)系約束條件,其如下所示<RelationshipConstraintname=″AContainsB″relationship=″ContainmentDefinition″myRole=″parent″targetType=″B″minOccurs=TmaxOccurs=″1″/>此約束條件標(biāo)識了應(yīng)當(dāng)存在的一約束條件關(guān)系,其中A為父角色而關(guān)系另一端的類型(成員)是類型B。假如我們需要經(jīng)一步控制B的配置,我們可在類型B上增加如下設(shè)置約束條件<RelationshipConstraintName=″AContainsB″RelationshipDefinition=″containementRelationship″TargetRole=″Member″TargetObjectDefinition=″B″MinOccurs=″1″MaxOccurs=″1″><ConstraintDefinition=″simpleValueConstraint″Name=″BValueConstraint″><SettingValuePath=″operator″>=</SettingValue><SettingValuePath=″RHS″>myPort</SettingValue><lnputPath=″member.Name″Name=″LHS″/></Constraint></RelationshipConstraint>在這種情況下,我們增加了一個要求成員名稱等于字符串“myPort”的約束條件。我們也能給關(guān)系增加約束條件;我們調(diào)用這些對象約束條件。從一關(guān)系中,我們約束參與此關(guān)系的對象。對于關(guān)系中的每個角色,我們可標(biāo)識一對象定義然后將設(shè)置約束條件加入到那些對象定義上。從關(guān)系角度來看,基數(shù)一直是minOccurs=1且maxOccurs=1,所以其未出現(xiàn)在約束條件聲明中。<ObjectConstraintName=″allowedPair″PrimaryRole=″Host″PrimaryObjectDefinition=″IIS″SecondaryRole=″Guest″SecondaryObjectDefinition=″webApp″/>最后,我們可嵌套約束條件。這使得我們能夠?qū)⒓s束條件鏈接在一起,外部約束條件設(shè)置了內(nèi)部約束條件的上下文。以下是一個宿主到Webapp系統(tǒng)的IIS系統(tǒng)的例子,其僅僅約束了一特定類型的webApp包含端點。在這種情況下,我們利用一組對象約束條件來標(biāo)識一組至少一個為真的可能性。<SystemDefinitionName=″test″><RelationshipConstraintName=″WebAppHostConstraint″RelationshipDefinition=″HostingDefinition″TargetRole=″Guest″TargetObjectDefinition=″webApp″><RelationshipConstraintName=″WebAppContainsPort1″RelationshipDefinition=″containmentRelationship″TargetRole=″Member″TargetObjectDefinition=″EndpointDefinition″MinOccurs=″1″MaxOccurs=″unbounded″><ObjectConstraintGroup><ObjectConstraintName=″hasWebPort″PrimaryRole=″Member″PrimaryObjectDefinition=″webPort″/><ObjectConstraintName=″hasSqiPort″PrimaryRole=″Member″PrimatyObjectDefinition=″sqlPort″/></ObjectConstraintGroup></RelationshipConstraint></RelationshipConstraint>嵌套約束條件形成了一條我們可從內(nèi)到外評估的路徑。路徑的每個約束條件可向?qū)Ξ?dāng)前實例一樣訪問路徑上先前實例的設(shè)置。就像該約束條件已定義在已標(biāo)識系統(tǒng)中一樣,傳播對嵌套約束條件的評估。從foo角度來看,以下兩種情況應(yīng)該是相等的。在第一種情況下,foo在一包含系統(tǒng)bar上設(shè)置了一嵌套約束條件,在第二種情況下,類型bar已經(jīng)包含了此約束條件。情況1<SystemDefinitionname=″foo″><RelationshipConstraintName=″containsBar″RelattonshipDefinition=″containment″TargetRole=″Member″TargetObjectDefinition=″bar″MinOccurs=T><RelationshipConstraintName=″containsX″RelationshipDefinition=″containment″TargetRole=″MembernTargetObjectDefinition=″X″MinOccurs=″1″/></RelatbnshipConstraint></SystemDefinition><SystemDefinitionname=″bar″/>情況2<SystemDefinitionName=″foo″><RelationshipConstraintName=″containsBar″RelationshipDefinition=″containment″TargetRole=″Member″TargetObjectDefinition=″bar″MinOccurs=″1″/></SystemDefinition><SystemDefinitionName=″bar″><RelationshipConstraintName=″containsX″RelationshipDefinition=″containment″TargetRole=°Member″TargetObjectDefinition=″X″MinOccurs=″1″/></SystemDefinition>3.7.3.1約束條件模型約束條件模型具有兩部分防護(hù)和判定。利用防護(hù)定義執(zhí)行判定的上下文。例如在一關(guān)系中,我們利用防護(hù)來標(biāo)識我們想執(zhí)行的斷定的類型的一特殊組合。在一對象內(nèi),我們利用防護(hù)來標(biāo)識與其他對象的一組關(guān)系。當(dāng)遇到防護(hù)的需求時,執(zhí)行判定。我們有兩種形式的判定驗證設(shè)置值的設(shè)置約束條件和驗證一組約束條件的組約束條件。我們可在防護(hù)內(nèi)嵌套防護(hù),在這種情況下,當(dāng)滿足外防護(hù)時只檢查內(nèi)防護(hù)。這就允許我們建立支持關(guān)系結(jié)構(gòu)的驗證的路徑。一防護(hù)及其判定的組合具有一基數(shù),其指示了防護(hù)應(yīng)該匹配且判定被評計為真的次數(shù)。更正式地,Guard=ObjectConstraint(ObjectDefintion,ObjectDefintion.required){(Guard|predicate)*}|RelationshipConstraint(RelationshipDefinition,Targetobject,1Bound,uBound){(Guard|predicate)*}防護(hù)被定義為ObjectConstraint或RelatiomshipConstraint。對象約束條件標(biāo)識了與關(guān)系兩端相關(guān)的兩個對象定義。關(guān)系約束條件標(biāo)識了一關(guān)系定義和一目標(biāo)對象定義。當(dāng)一關(guān)系約束條件具有一下限和一上限時,對象約束條件是可選地或必需地。基數(shù)不同反映了一關(guān)系只能標(biāo)識兩種類型而一種類型可參與多個關(guān)系。predicat=Settingsconstraint(rule)|group{(group)*}判定是一個包含一規(guī)則的設(shè)置約束條件或者是包含了一組防護(hù)的組。在防護(hù)的上下文中評估約束條件。在其是設(shè)置約束條件的情況下,判定可標(biāo)識來自根防護(hù)的所有者以及由每個嵌套防護(hù)所標(biāo)識的內(nèi)容的設(shè)置。組用于標(biāo)識一組防護(hù),其中該防護(hù)中的至少一個應(yīng)匹配且評估為真。例1.RelationshipConstraint(containmentRelationship,webapp,0,1){}此例表示了一個防護(hù),其中只要存在包含webapp的包含關(guān)系,該防護(hù)就被評估為真。此防護(hù)最多一次評估為真。進(jìn)一步的匹配將向用戶返回一錯誤。2.RelationshipConstraint(containmentRelationship.webapp,0,1){settingsconstraint(webapp.name=2)}此例給防護(hù)增加了一判定。只有當(dāng)關(guān)系和目標(biāo)定義相匹配并且設(shè)置約束條件被評估真時,此防護(hù)被評估為真。假如關(guān)系和目標(biāo)定義相匹配且設(shè)置約束條件不為真,那么將向用戶返回一錯誤。假如關(guān)系和目標(biāo)類型匹配且設(shè)置約束條件多次被評估為真,那么向用戶返回一錯誤。3.RelationshipConstraint(containmentRelationship,webapp,0,1){RelationshipConstraint(containmentRelationship,vdir,0,1)}在此例中,在一防護(hù)中嵌套一防護(hù)。當(dāng)外部防護(hù)為真(包含約束條件的類型也包含一webapp),然后評估在外部防護(hù)上下文中的內(nèi)部防護(hù)。這意味著將在一webapp實例的上下文中評估內(nèi)部關(guān)系約束條件。假如webApp包含0或一個vdir,則此內(nèi)部約束條件將返回真,假如它包含超過一個vdir,則此約束條件將向用戶返回一錯誤。4.objectConstraint(webapp,iis,0,1){RelationshipConstraint(containmentRelationship,systemType,0,1){ObjectConstraint(webapp,vdir,0,1)}}對象約束條件的上下文為第一對象定義(第一對象定義)。這意味著將在webapp的上下文中評估關(guān)系約束條件。此關(guān)系約束條件定義了兩種可能的上下文,第一種是關(guān)系,將成為用作對象約束條件的上下文,而第二種是目標(biāo)對象定義,其用作關(guān)系約束條件的上下文。5.RelationshipConstraint(containmentRelationship,webapp,0,1){group{RelationshipConstraint(containmentRelationship,vdir,0,1)RelationshipConstraint(containmentRelationship,directory,0,1)}}在此例中,我們利用一個組來包含將在Webapp上下文中評估的兩個關(guān)系約束條件。除非解除至少一個關(guān)系并返回真,否則此組將產(chǎn)生一個錯誤。在此情況下,Webapp應(yīng)包含一Vdir或一目錄。3.7.3.2基本約束條件所有結(jié)構(gòu)的約束條件源自一個被稱為StructualConatraint的通用基本約束條件。每個結(jié)構(gòu)的約束條件可包含一描述元素和設(shè)計數(shù)據(jù)。當(dāng)所需約束條件失敗時,此描述元素將作為錯誤消息返回。每個約束條件也具有一個名稱和一個標(biāo)識此約束條件是必需還是僅僅是一形成較大約束條件的一部分的標(biāo)志。最后當(dāng)評估約束條件時,約束條件的評估元素可用于指示。參看與約束條件評估相關(guān)的更多信息的3.7.3.7部分。<xscomplexTypename=″StructuralConstrainr><xssequence><xselementname=″Description″type=″Description″minOccurs=″0″/><xselementname=″DesignData″type=″DesignData″minOccurs=″0″/></xssequence><xsatlributename=″Name″type=″SimpleName″use=″required″/><xsattributename=″Evaluate″type=″ConstraintEvaluation″use=″optional″/><xsattributename=″Required″type=″xsboolean″use=″optional″/></xscomplexType>3.7.3.3對象約束條件一對象約束條件描述了關(guān)系中一或兩個角色上的約束條件。此約束條件具有一名稱,其用于在它失敗的情況下輔助識別約束條件。此約束條件評估如下a)第一角色和第一定義與一對象實例是否匹配,而且假如被提供,第二角色和第二定義是否匹配一對象實例。假如這些不匹配,那么設(shè)置match=0并跳到c)b)評估第一對象實例上下文中的所有嵌套約束條件。假如所有的評估計均為真,那么設(shè)置match=1,否則設(shè)置match=0。c)假如匹配>MinOccurs且匹配<MaxOccurs,那么設(shè)置result=真,否則設(shè)置result=假。d)假如請求為真且結(jié)果為假,則向用戶返回一消息。e)向父上下文返回結(jié)果。<xscomplexTypename=″ObjectConstraint″><xscomplexContent><xsextensionbase=″StructuralConstraint″><xschoiceminOccurs=″0″maxOccurs=″unbounded″><xselementname=″Constraint″type=″ConstraintMember″/><xselementname=″RelationshipConstraint″type=″RelationshipConstraint″/><xselementname=″RelationshipConstraintGroup″type=″RelationshipConstraintGroup″/></xschoice><xsattributename=″PrimaryRole″type=″RolesList″use=″required″/><xsaltributename=″PrimaryObjectDefinition″type=″QualifiedName″use=″required″/><xsattributename=″SecondaryRole″type=″RolesList″use=″optional″/><xsattributename=″SecondaryObjectDeflnition″type=″QualifiedName″use=″optional″/><xsattributename=″MinOccurs″type=″MinOccurs″use=″optional″/><xsattributename=″MaxOccurs″type=″MaxOccurs″use=″optiona!″/></xsextension></xscomplexContent></xscomplexType>3.7.3.4對象約束條件組對象約束條件組允許多組對象約束條件的組合,從而它們可利用至少一語義來評估。除非組中至少一個約束條件被評估為真,否則此組將返回一錯誤。約束條件組進(jìn)行如下評估a)依次評估每個嵌套約束條件組。假如至少一個被評估為真,那么設(shè)置result=真,否則設(shè)置result=假。b)假如result=假且required=真,那么產(chǎn)生一錯誤。c)向父上下文返回結(jié)果。<xscomplexTypename=″ObjectConstraintGroup″><xscomplexContent><xsextensionbase=″Constraint″><xssequence><xselementname=″ObjectConstraint″type=″ObjectConstraint″maxOccurs=″unbounded″/></xssequence></xsextension></xscomplexContent></xscomplexType>3.7.3.5關(guān)系約束條件關(guān)系約束條件用于約束對象可參與的關(guān)系。一關(guān)系約束條件標(biāo)識關(guān)系定義,可選地標(biāo)識了在關(guān)系另一端的實例的對象定義和關(guān)系的基數(shù)。此約束條件被給定一名稱,這樣在錯誤消息中就可以識別它。關(guān)系約束條件的主體包含進(jìn)一步提煉此約束條件的嵌套約束條件。關(guān)系約束條件可用于一些目的無需附加判定簡單地利用基數(shù),它們就能用于標(biāo)識為一實例正確操作所提供的關(guān)系,利用判定,它們用于縮小當(dāng)前實例希望交互作用的實例的配置。關(guān)系進(jìn)行如下的評估a)設(shè)置matches=0b)對于對象實例參與的每個關(guān)系實例a.關(guān)系定義與關(guān)系實例定義是否匹配,關(guān)系方向與目標(biāo)角色所標(biāo)識的方向是否匹配,而且假如提供了,目標(biāo)對象定義與關(guān)系的另一端的實例定義是否匹配。假如這些都不匹配則跳到下一關(guān)系b.評估關(guān)系實例上下文中的所有嵌套約束條件。假如均評估為真,設(shè)置matches=matches+1。c)假如matches>MinOccurs且matches<MaxOccurs則設(shè)置result=真,否則設(shè)置result=假。d)假如required為真result為假則向用戶返回一消息。e)向父上下文返回結(jié)果。<xscomplexTypename=″RelationshipConstraint″><xscomplexContent><xsextensionbase=″StructuralConstraint″><xschoiceminOccurs=″0″maxOccurs=″unbounded″><xselementname=″Constraint″type=″ConstraintMember″/><xselementname=″RelationshipConstraint″type=″RelationshipConstraint″/><xselementname=″RelationshipConstraintGroup″lype=″RelationshipConstraintGroup″/><xselementname=″ObjectConstraint″type=″ObjectConstraint″/><xselementname=″ObjectConstraintGroup″type=″ObjectConstraintGroup″/></xschoice><xsattributename=″RelationshipDefinition″type=″QualifiedName″use=″required″/><xsattributename=″TargetRole″type=″RolesList″use=″required″/><xsattributename=″TargetObjectDefinition″type=″QualifiedName″use=″optional″/><xsattributename=″MinOccurs″type=″MinOccurs″use=″optional″/><xsattributename=″MaxOccurs″type=″MaxOccurs″use=″optional″/><xsattributename=″DelegationAware″type=″xsboolean″use=″optional″/></xsextension></xscompiexContent></xscomplexType>3.7.3.6關(guān)系約束條件組關(guān)系約束條件允許多組關(guān)系約束條件組合到一起,這使得可將它們評估為具有至少一語義的一個判定。約束條件組進(jìn)行如下評計d)依次評估每個嵌套約束條件。假如至少一個被評估為真,那么設(shè)置result=真否則設(shè)置result=假。e)假如result=假且required=真,那么產(chǎn)生一錯誤。f)向父上下文返回結(jié)果。<xscomplexTypenam′e=″RelationshipConstraintGroup″><xscomplexContent><xsextensionbase=″StructuralConstraint″><xssequence><xselementname=″RelationshipConstraint″type=″RelationshipConstraint″maxOccurs=″unbounded7></xssequence></xsextension></xscomplexContent></xscomplexType>3.7.3.7約束條件評估在三個明顯的時機可評估一約束條件設(shè)計過程期間、一應(yīng)用程序的配置過程中以及一旦配置了應(yīng)用程序,在操作者想檢查或更新應(yīng)用程序配置的任何時候。評估一約束條件的時機改變了對約束條件有用的信息組。在設(shè)計期間評估的約束條件不能依賴于只在配置期間提供或在配置之后有效的值。在配置期間評估的約束條件不能依賴于只在配置之后有效的值。在配置之后評估的約束條件可訪問應(yīng)用程序中的任何設(shè)置。我們允許一約束條件開發(fā)者依據(jù)其何時運行來標(biāo)記他們的約束條件。假如當(dāng)輸入無效時我們試著運行一約束條件,此信息用于避免即將發(fā)生的錯誤。編譯器然后能檢查一設(shè)計約束條件不依賴于它所知道的配置或確認(rèn)之后才生效的值,同樣它能檢查一調(diào)度約束條件不依賴于它所知道在的配置之后才生效的值。假如編譯器完全知曉何時設(shè)置將生效,那么可以計算可運行約束條件的時機,但不幸地,事實并非如此。為一設(shè)置提供值的時機可改變,例如,目錄名可預(yù)先知道或可利用產(chǎn)生獨一無二的標(biāo)識符的算法在配置過程中創(chuàng)建一目錄名。約束條件進(jìn)行如下標(biāo)記a)Design(設(shè)計)——指示了在設(shè)計期間、配置期間或驗證期間可運行約束條件b)Deployment(配置)——指示了在配置或驗證期間可運行約束條件c)Validation(驗證)——指示了只能在驗證期間運行約束條件d)Never(從不)——指示從不運行約束條件以下列舉用于獲得這些選項<xssimpleTypename=″ConstraintEvaluation″><xsrestrictionbase=″xsstring″><xsenumerationvalue=″Design″/><xsenumerationvalue=″Deployment″/><xsenumerationvalue=″Validate″/><xsenumerationvalue=″Never″/></xsrestriction></xssimpleType>可對結(jié)構(gòu)的約束條件和約束條件成員設(shè)置約束條件的評估行為。在以上兩種情況下,對結(jié)構(gòu)的約束條件或約束條件成員應(yīng)用所有的嵌套約束條件。約束條件默認(rèn)地被標(biāo)記為設(shè)計期間約束條件并且其可在任何期間運行。3.8授權(quán)授權(quán)的目的是允許一模型的開發(fā)者向一客機或父體公開主機或所包含的組件的特定行為。這允許開發(fā)者設(shè)計一個重用現(xiàn)有實施的組件,并提供一更全面的用于其客戶機的實施。圖19描述了一個利用授權(quán)向客機公開的主機的實施的例子。在圖19,應(yīng)用平臺部件利用一授權(quán)關(guān)系向客機公開了主機的文件系統(tǒng)、操作系統(tǒng)組件、應(yīng)用程序。這樣,此應(yīng)用平臺無需直接實現(xiàn)它們便能控制操作系統(tǒng)哪部分對其客機有效的。圖20描述了一個利用授權(quán)向父層公開一成員的實施的例子。在圖20中,客戶機應(yīng)用程序公開了票務(wù)應(yīng)用程序的定購服務(wù)端點。這允許票務(wù)應(yīng)用程序然后將此端點連接到服務(wù)器應(yīng)用程序,此服務(wù)器應(yīng)用程序反過來將其端點授權(quán)給用戶數(shù)據(jù)應(yīng)用程序。3.8.1原則以下原則指導(dǎo)了授權(quán)模型的設(shè)計?!ぴ谀繕?biāo)系統(tǒng)中不存在代理。代理對于模型來說是方便的并且無物理顯示。假如不為真,那么使用授權(quán)將對目標(biāo)系統(tǒng)具有側(cè)面影響?!ご聿荒芨淖兪跈?quán)的行為除非授權(quán)支持此改變。由于目標(biāo)系統(tǒng)中不存在代理,代理只能改變模型而非實際的系統(tǒng)行為。假如授權(quán)公開了影響其行為的設(shè)置,那么和其他關(guān)系一樣,授權(quán)關(guān)系可通過信息流來改變那些設(shè)置?!囊煌獠坑脩艚嵌葋砜?,用戶不用知道一特殊實例是否是一代理或一實際實施。假如不為真,那么約束條件和信息流作者將不得不覆蓋導(dǎo)致復(fù)雜和易碎代碼的情況。·一用戶能明確將代理作為約束條件表達(dá)的一部分。為了通過一部件邊界實現(xiàn)控制行為的約束條件,這是必需的。3.8.2情況以下是描述在一系統(tǒng)中與利用授權(quán)相關(guān)的問題的兩種情況3.8.2.1通信連接驗證為驗證一客戶機端口能連接到一服務(wù)器端口,通信關(guān)系包含一通到此服務(wù)器的約束條件,然后返回此服務(wù)器主機,然后沿層3的通信關(guān)系返回,然后沿宿主關(guān)系到層4客戶機并且最后返回通信關(guān)系。這在圖21中示出。由于包含邊界的存在,在兩層的客戶機和服務(wù)器之間存在授權(quán)關(guān)系。圖22就描述了這樣的一個例子。為寫沿此路徑的約束條件,用戶應(yīng)當(dāng)能復(fù)制任意數(shù)量的這些關(guān)系,這使得約束條件的描述更復(fù)雜且減少了約束條件語言的可用性。為避免以上情況,我們需要用戶能夠不用事先知道是否將有代理且有多少代理的情況下寫約束條件。3.8.2.2區(qū)域邊界在數(shù)據(jù)中心,區(qū)域經(jīng)常用于區(qū)分帶有不同保密需要或行為的系統(tǒng)。當(dāng)一通信關(guān)系與區(qū)域邊界交叉時,用戶希望在關(guān)系的行為上設(shè)置約束條件。例如,一用戶希望只允許在一特定端點與后終端服務(wù)器之間http通信。為此,用戶應(yīng)該在通訊關(guān)系與區(qū)域邊界交叉時能夠標(biāo)識該通信關(guān)系代理是他們唯一可取的方法。圖23描述了區(qū)域邊界的一個例子。在圖23中,假如開發(fā)者希望約束從區(qū)域1到區(qū)域2的輸出通信,那么他們將通過約束授權(quán)給區(qū)域邊界的端點來實現(xiàn)。例如,他們可寫一個只允許輸入http且輸出sql通信流的約束條件。此約束條件對區(qū)域公開的每個代理端點無效。為約束一代理,其對于約束條件應(yīng)該是可視的。這意味著約束條件能將代理所參與的關(guān)系與實現(xiàn)此行為的授權(quán)分離開來。這使得在與不對用戶透明的代理的情況相同先前情況下,期望的行為變得復(fù)雜。3.8.3與模型其他部分的交互作用利用如圖24所示的例實例空間來描述授權(quán)的規(guī)則。3.8.3.1代理和授權(quán)代理應(yīng)該與授權(quán)相同或是授權(quán)的一基本類。在如圖24的例子中,作為一代理的b,應(yīng)該與c相同是c的一基本定義,c是授權(quán)。因為代理b只能公開c的行為,所以這是必需的。假如允許區(qū)分類型,那么所公開的b的行為可與c的行為不同,但沒有b的實現(xiàn)所需行為的物理顯示。在此實例空間,一代理實例只能有一個授權(quán),即只能有一個來自b的授權(quán)關(guān)系,其中b為此關(guān)系中的代理。此約束條件是必需的,因為沒有它不可能返回授權(quán)的設(shè)置值或成員集合——運行期間不會知道選擇哪個授權(quán)作為此值的源。3.8.3.2關(guān)系角色一代理可擔(dān)當(dāng)以下關(guān)系角色3.8,3.3成員過濾和路徑解析代理只公開來自被定義為部分代理定義的授權(quán)的成員。在代理和授權(quán)定義相同的情況下,代理公開了所有授權(quán)的成員。當(dāng)代理定義是授權(quán)定義的基本定義時,代理將只能公開那些兩者定義通用的成員。以下給出的定義用于如圖24的B和C<DefinitionName=″B″><SettingDeclarationName=″height″Definition=″lnt″/></Definition><DefinitionName=″C″Extends=″B″><SettingDeclarationName=″weight″Definition=″lnt7></Definition>然后代理b將只公開高度設(shè)置而不公開重量設(shè)置。當(dāng)在一代理上設(shè)置一設(shè)置值時,通過授權(quán)關(guān)系將此行為傳遞給授權(quán)直接將新設(shè)置值記錄在授權(quán)上并且其對于任何指向此授權(quán)的其他代理均是可視的。當(dāng)從一代理中檢索一設(shè)置值時,請求被傳遞給授權(quán)并且直接從此授權(quán)返回設(shè)置值。對象和關(guān)系成員過濾與設(shè)置過濾工作方式相同。只有被聲明為代理定義的一部分的公共成員被此代理公開。成員的改變立即影響授權(quán)的成員,并且其對于所有指向此授權(quán)的代理均是可視的。當(dāng)一成員路徑引用一代理的成員時,此路徑自動解析成授權(quán)的成員。這意味著無論成員是代理或是授權(quán)都不改變此路徑的語法。3.8.3.4關(guān)系過濾每個對象實例參與一組關(guān)系。這些關(guān)系用于評估約束條件和信息流,并且用于控制例示的過程。為實現(xiàn)向用戶表示代理和授權(quán)的一致性,代理和授權(quán)都參與應(yīng)該結(jié)合在一起的關(guān)系組。從此代理中,我們需要公開與代理關(guān)系結(jié)合的授權(quán)關(guān)系的子集。假如我們隱藏實現(xiàn),那么此代理需要向用戶返回其自身的包含關(guān)系,且可能只是一個授權(quán)得關(guān)系的小型子集。假如我們希望代理完全透明,那么我們就公開所有授權(quán)的關(guān)系并隱藏代理的關(guān)系。從此代理中,我們需要結(jié)合其代理參與的關(guān)系子集公開它的的直接關(guān)系。也就是說,假如一代理與另一端點具有通信關(guān)系,那么它應(yīng)當(dāng)表現(xiàn)為好像授權(quán)直接參與此關(guān)系一樣。另一方面,我們不希望公開作為授權(quán)的一部分的代理的包含關(guān)系。由約束條件所造成的行為在3.8.3.6部分描述。3.8.3.4.1代理身份和關(guān)系過濾我們有兩種代理——透明代理和不透明代理。當(dāng)開發(fā)者希望向代理的客戶機公開授權(quán)的實施時使用透明代理,而當(dāng)開發(fā)者希望向授權(quán)的客戶機隱藏代理的實施時使用不透明代理。3.8.3.4.1.1透明協(xié)議透明代理用于向客戶機公開授權(quán)的實施。一典型的例子如圖23所示,其中區(qū)域純粹用作模型目的且不應(yīng)隱藏它們包含的系統(tǒng)。在這種情況下,與區(qū)域2的Sql系統(tǒng)通信的開發(fā)者知道授權(quán)端點的實施是一Sql服務(wù)器而不是一區(qū)域。透明代理從授權(quán)而非服務(wù)器中返回所有標(biāo)識信息。這意味著實例ID、定義、版本和包含信息都源自授權(quán)而非代理。當(dāng)查詢時,透明代理也將返回代理所參與的關(guān)系集而不是那些授權(quán)。3.8.3.4.1.2不透明代理不透明代理用于隱藏授權(quán)的實施,這使得開發(fā)者不需斷開客戶機便可自由改變實施。例如在圖19中,IIS系統(tǒng)可利用不透明協(xié)議隱藏文件系統(tǒng)實施,這使得IIS的客戶不依賴實現(xiàn)此文件系統(tǒng)的操作系統(tǒng)。不透明協(xié)議將從代理而不是授權(quán)中返回實例ID、定義和版本和包含信息。當(dāng)查詢時,不透明代理將只返回它所直接參與的不包括其授權(quán)關(guān)系的關(guān)系。3.8.3.5信息流指向一代理的信息流將無需知曉目標(biāo)是一代理而不是實際實施,就可以自動重定向到授權(quán)。由于代理將對所有成員的請求發(fā)到與授權(quán)相關(guān)的實例,信息流得影響直接通過代理傳送到授權(quán)。被聲明為代理的一部分的信息流將不被評估。這是因為由于授權(quán)應(yīng)當(dāng)與代理定義相同或從代理定義導(dǎo)出,此信息流也將作為授權(quán)的一部分而進(jìn)行評估。假如其被評估,我們將獲得有關(guān)授權(quán)設(shè)置值的雙重信息流錯誤。3.8.3.6約束條件約束條件可被寫入用以讓授權(quán)知曉也可不寫入。假如一約束條件是一授權(quán)知曉,那么無需出現(xiàn)任何此代理所參與的關(guān)系,就其將在每個代理實例上進(jìn)行評估。授權(quán)關(guān)系將對約束條件公開。例如,如圖24從x指向b的一授權(quán)知曉通信約束條件將看到代理b及其x、c、d、e和i所參與的關(guān)系。然后假設(shè)它向c傳遞授權(quán)關(guān)系,則其可看到從c到b、f、h和g的關(guān)系。假如一約束條件未被標(biāo)記為授權(quán)知曉,那么當(dāng)評估指向一代理的關(guān)系時,此約束條件引擎將自動跳過透明代理。假如約束條件的目標(biāo)實例是一代理,那么約束條件引擎將用授權(quán)替代它。此約束條件將不能看見授權(quán)關(guān)系。假如無授權(quán)知曉來評估相同約束條件,則該約束條件完全看不到b。取而代之,只能相對于c進(jìn)行評估。當(dāng)評估c時,其可看見在c和x、d、f、h、g、I之間的關(guān)系。應(yīng)當(dāng)注意在此情況下,我們使所有來自b的關(guān)系都出現(xiàn),除了其包含關(guān)系,并且我們隱藏了授權(quán)關(guān)系。通過將一結(jié)構(gòu)的約束條件(對象或關(guān)系約束條件——參看3.7.3部分)的DelegationAware屬性設(shè)置為真,從而將一約束條件標(biāo)記為授權(quán)知曉。聲明作為代理定義的一部分進(jìn)行的約束條件將不在代理上進(jìn)行評估。這是因為此約束條件也將相對于授權(quán)被評估。而這對于代理和授權(quán)定義是通用的。3.9管理器管理器是類型和關(guān)系通過它將客戶行為插入到運行期間環(huán)境的機制。對于其管理的每種類型,管理器可支持幾個作用它能參與類型安裝,它能提供類型的一CLR表達(dá),它能涉及關(guān)于如何解析類型間結(jié)合的策略決定中,并且它能提供用于復(fù)雜約束條件和信息流的實施。由CLR揭示的所有的對象管理器作為強大名稱類的輸入點。與SDM其他類型相同的方式一樣,對象管理器被打包并設(shè)置其版本;它們被分配在系統(tǒng)分布單元內(nèi),并且它們的版本和強大名稱源自聲明它們的SDM文件。<xscomplexTypename=″ManagerDeclaration″><xssequence><xselementname=″Description″type=″Description″minOccurs=″0″/></xssequence><xsattributename=″Name″type=″SimpleName″use=″required″/><xsattributename=″AssemblyName″type=″xsstring″use=″required″/><xsattributename=″Version″type=″FourPartVersionType″use=″optional″/><xsattributename=″PublicKeyToken″type=″PublicKeyTokenType″use=″optiona!″/><xsattributename=″Culture″typr″CultureNeutral″use=″optional″/><xsattributename=″Platform″type=″xsstring″use=″optional″/><xsattributename=″SourcePath″type=″xsstring″use=″optionai″/></xscomplexType>3.9.1作用一對象管理器能支持用于它所支持類型的一或多個作用。這些作用包括a)評估類型或關(guān)系的約束條件b)評估類型或關(guān)系的信息流c)構(gòu)建/消除/更新一類型的支持d)公開一個用于類型或關(guān)系的設(shè)置的對象表達(dá)e)執(zhí)行類型或關(guān)系的發(fā)現(xiàn)f)支持一類型或關(guān)系的設(shè)計表面特定UI3.9.2注意管理器依賴于其他管理器,但這些依賴應(yīng)反映在用戶管理器的SDM文件的導(dǎo)入語句。假如未描述這些依賴,那么將在運行期間將不能裝載一特定管理器所依賴的其他管理器,并且管理器將不能運行。3.10設(shè)計數(shù)據(jù)和描述描述包含描述相關(guān)SDM元素的文本。此文本采用以DocumentLanguage屬性標(biāo)識的文檔的語言。為支持文本定位,可提供一源標(biāo)識符。運行期間將詢問描述中識別的管理器或是否沒應(yīng)用默認(rèn)管理器,該默認(rèn)管理器用于與描述相關(guān)的定位文本的文檔。<xscomplexTypename=″Description″mixed=″true″><xsattributename=″ResourcelcPtype=″xsstring″use=″optional″/><xsattributename=″Manager″type=″QualifiedName″use=″optiona!″/></xscomplexType>Adesigndatatypecontainsstructureddatathatdefinedbyadesignsurface.Eachdesignsurfaceshouldusetheirownschematoidentifyandtostricturethedata.<xscomplexTypename=″DesignData″><xssequence><xsanynamespace=″##other″processContents=″lax″minOccurs=″0″maxOccurs=″unbounded″/></xssequence></xscomplexType>3.11SDM文檔結(jié)構(gòu)SDM文檔提供了用于一組關(guān)系、對象和管理器的強大身份、版本和定位信息。<xselementname=″SystemDefinitionModer><xscomplexType><xssequence><xselementname=″lnformation″type=″lnformation″minOccurs=″0″/><xselementname=″lmport″type=″lmport″minOccurs=″0″maxOccurs=″unbounded″/><xselementname=″DesignData″type=″DesignData″minOccurs=″0″/><xselementname=″SettingDefinitions″type=″SettingDefinitions″minOccurs=″0″/><xschoiceminOccurs=″0″maxQccurs=″unbounded″><xselementname=″CommunicationDefinition″type=″CommunicationDefinition″/><xselementname=″ContainmentDefinition″type=″ContainmentDefinition″/><xselementname=″DeIegationDefinition″type=″DelegationDefinition″/><xselementname=″ReferenceDefinition″type=″ReferenceDefinition″/><xselementname=″HostingDefinition″type=″HostingDefinition″/><xselementname=″EndpointDefinition″type=″EndpointDefinition″/><xselementname=″ResourceDefmition″type=″ResourceDefinition″/><xselementname=″SystemDefinition″type=″SystemDefinition″/><xselementname=″ConstraintDefinition″type=″ConstraintDefinition″/><xselementname=″FlowDefinition″type=″FlowDefinition″/><xselementname=″Manager″type=″ManagerDeclaration″/></xschoice></xssequence><xsattributeGroupref=″Namespaceldentity″/><xsattributename=″DocumentLanguage″type=″Culture″/></xscomplexType></xselement>3.11.1信息SDM文檔的信息部分包含支持SDM文檔的識別和管理的人類可讀信息。<xscomplexTypename=″Information″><xsannotation><xsdocumentation>HumanreadableinformattonabouttheSDMDefinitionlibrary.</xsdocumentation></xsannotation><xssequence><xselementname=″FriendlyName″type=″xsstring″minOccurs=″0″/><xselementname=″CompanyName″type=″xsstring″minOccurs=″0″/><xselementname=″Copyright″type=″xsstring″minOccurs=″0″/><xselementname=″Trademark″type=″xsstring″minOccurs=″0″/><xselementname=″Description″type=″Description″minOccurs=″0″/><xselementname=″Comments″type=″xsstring″minOccurs=″0″/></xssequence></xscomplexType>計算機環(huán)境舉例圖25描述了一通用計算機環(huán)境800,其可用于實現(xiàn)這里所描述的技術(shù)。計算機環(huán)境800只是計算機環(huán)境的一個例子,并不對計算機和網(wǎng)絡(luò)結(jié)構(gòu)的使用或功能范圍做任何限制。計算機環(huán)境800不解釋為涉及具有典型計算機環(huán)境800所述的組件或其組合的依賴性或要求。計算機環(huán)境800包括一通用目的的計算設(shè)備,其形式為計算機802。計算機802可以是,例如,圖1中的計算設(shè)備102,或圖2中的實現(xiàn)開發(fā)系統(tǒng)202或有效部件208。計算機802的部件可包括但不局限于,一或多個處理器或處理單元804,一系統(tǒng)存儲器806以及將包括處理器804的各系統(tǒng)組件耦合到系統(tǒng)存儲器806的一系統(tǒng)總線808。系統(tǒng)總線808表示幾種總線結(jié)構(gòu)中的一或多個,其包括一存儲器總線或存儲控制器、一外圍總線、一加速圖形端口以及一處理器或采用任意一種總線結(jié)構(gòu)的局域總線。例如,此總線結(jié)構(gòu)可包括工業(yè)標(biāo)準(zhǔn)結(jié)構(gòu)(ISA)總線,微通道結(jié)構(gòu)(MCA)總線,增強ISA(EISA)總線、視頻電子標(biāo)準(zhǔn)協(xié)會(VESA)局域總線以及也稱之為夾層總線的外設(shè)部件互連(PCI)總線,。計算機802典型地包括多種計算機可讀介質(zhì)。此介質(zhì)可以是計算機802可訪問的任何可用得介質(zhì)并且包括易失性和非易失性介質(zhì)、可移動和不可移動介質(zhì)。系統(tǒng)存儲器806包括易失性存儲器形式的計算機可讀介質(zhì),例如隨機存儲器(RAM)810,和/或非易失性存儲器,例如只讀存儲器(ROM)812。一存儲在ROM812中的基本輸入/輸出系統(tǒng)(BIOS)814,其包含有助于在計算機802內(nèi)的元素之間傳輸信息的基本例程,例如在啟動過程中。RAM810典型地包含處理單元804可即時訪問和/或操作的數(shù)據(jù)和/或程序模型計算機802也可包括其他可移動/不可移動、易失性/非易失性計算機存儲介質(zhì)。例如,圖25描述了一個用于讀出和寫入一不可移動非易失性磁介質(zhì)(未示出)的硬盤驅(qū)動器816、一個用于讀出和寫入一可移動非易失性磁盤驅(qū)動器820(例如,一“軟盤”)的磁盤驅(qū)動器818、以及一個用于讀出和/或?qū)懭胫T如一CD-ROM、DVD-ROM或其他光介質(zhì)的一可移動非易失性光盤824的光盤驅(qū)動器822。硬盤驅(qū)動器816、磁盤驅(qū)動器818和光盤驅(qū)動器822都通過一或多個數(shù)據(jù)介質(zhì)接口826與系統(tǒng)總線808相連。可選地,硬盤驅(qū)動器816、磁盤驅(qū)動器818和光盤驅(qū)動器822可通過一或多個接口(未示出)與系統(tǒng)總線808相連。盤驅(qū)動器及其相關(guān)的計算機可讀介質(zhì)提供了計算機可讀指令、數(shù)據(jù)結(jié)構(gòu)、程序模型及其他計算機802的數(shù)據(jù)的非易失性存儲器。盡管此例描述了一硬盤816、一可移動磁盤820以及一可移動光盤824,也可以理解存儲計算機可訪問數(shù)據(jù)的其它類型的計算機可讀介質(zhì)也能用于實現(xiàn)典型的計算機系統(tǒng)和環(huán)境,例如盒式磁帶或其它磁性存儲設(shè)備、閃存卡、CD-ROM、數(shù)字化通用盤(DVD)或其它光學(xué)存儲器、隨機訪問存儲器(RAM)、只讀存儲器(ROM)、電可擦除可編程只讀存儲器(EEPROM)等。任何數(shù)量的程序模塊都可以存儲在硬盤816、磁盤820、光盤824、ROM812和/或RAM810中,包括例如,一操作系統(tǒng)826、一個或多個應(yīng)用程序828、其它程序模型830和程序數(shù)據(jù)832。此操作系統(tǒng)826、一或多個應(yīng)用程序828、其他程序模塊830和程序數(shù)據(jù)832或它們的組合中的每一個均可實現(xiàn)支持分布式文件系統(tǒng)的所有或部分常駐組件。用戶可經(jīng)由諸如鍵盤834和指示設(shè)備836(例如一“鼠標(biāo)”)的輸入設(shè)備將命令和信息輸入到計算機802中。其他輸入設(shè)備838(未特別示出)可包括一麥克風(fēng)、操縱桿、游戲盤、衛(wèi)星天線、串行端口、掃描儀等。這些和其他輸入設(shè)備經(jīng)由耦合到系統(tǒng)總線808的輸入/輸出接口840與處理單元804相連,也可通過其他接口和總線結(jié)構(gòu),例如一并行端口,游戲端口或一通用串行總線(USB)連接。監(jiān)視器842或其他類型的顯示設(shè)備也可經(jīng)由接口,例如一視頻適配器844,與系統(tǒng)總線808相連。除監(jiān)控器842之外,其他輸出外設(shè)可包括諸如揚聲器(未示出)組件和一個經(jīng)由輸入/輸出接口840與計算機802相連的打印機846。利用與一個或多個例如一遠(yuǎn)程計算設(shè)備848的遠(yuǎn)程計算機的連接,,計算機802可工作在網(wǎng)絡(luò)環(huán)境中。例如,遠(yuǎn)程計算設(shè)備848可以是一個人計算機、便攜式計算機、一服務(wù)器、一路由器、一網(wǎng)絡(luò)計算機、一對等設(shè)備或其他通用網(wǎng)絡(luò)結(jié)點等。遠(yuǎn)程計算設(shè)備848被表示為一便攜式計算機,其包括許多或所有此處描述的與計算機802相關(guān)的元素和特征。在計算機802和遠(yuǎn)程計算機848之間的邏輯連接被描述為一局域網(wǎng)(LAN)850和一通用廣域網(wǎng)(WAN)852。此網(wǎng)絡(luò)環(huán)境通常在辦公室、公司范圍的計算機網(wǎng)絡(luò)、內(nèi)部網(wǎng)和Internet。當(dāng)在一LAN網(wǎng)絡(luò)環(huán)境中實施時,計算機802經(jīng)由一網(wǎng)絡(luò)接口或適配器854與局域網(wǎng)850相連。當(dāng)在一WAN網(wǎng)絡(luò)環(huán)境中實施時,計算機802典型地包括一調(diào)制解調(diào)器856或其他與廣域網(wǎng)852通信的裝置。可在計算機802的內(nèi)部或外部的調(diào)制解調(diào)器856,,經(jīng)由輸入/輸出接口840或其他適當(dāng)結(jié)構(gòu)與系統(tǒng)總線808相連??梢岳斫馑枋龅木W(wǎng)絡(luò)連接是典型的并且可使用其他方式建立計算機802和848之間的通信鏈接。在一網(wǎng)絡(luò)環(huán)境中,例如計算環(huán)境800的描述,與計算機802相關(guān)的程序模塊,或其中的部分,可存儲在遠(yuǎn)程存儲設(shè)備中。例如,遠(yuǎn)程應(yīng)用程序858駐留在遠(yuǎn)程計算機848的存儲設(shè)備中。為方便描述,應(yīng)用程序和其他諸如操作系統(tǒng)的可運行程序組件被描述為不連續(xù)塊,盡管此程序和組件在不同時段駐留在計算設(shè)備802的不同存儲組件中,并由計算機的數(shù)據(jù)處理器執(zhí)行。此處將描述在計算機可運行指令的通用上下文中的由一或多個計算機或其他設(shè)備執(zhí)行的不同模塊和技術(shù),例如程序模塊。通常,程序模塊包括執(zhí)行特殊任務(wù)或?qū)崿F(xiàn)特殊抽象數(shù)據(jù)類型的例程、程序、對象、組件、數(shù)據(jù)結(jié)構(gòu)等。典型地,在各實施例中可根據(jù)需要合并或分布程序模塊的功能。這些模塊和技術(shù)的實施存儲在或通過一些形式傳送到計算機可讀介質(zhì)。計算機可讀介質(zhì)可以是任何計算機可訪問的有效介質(zhì)。例如,但不限于,計算機可讀介質(zhì)可包括“計算機存儲介質(zhì)”和“通信介質(zhì)”?!坝嬎銠C存儲介質(zhì)”包括以任何信息存儲的方法或技術(shù)實現(xiàn)的易失性和非易失性、可移動和不可移動介質(zhì),此信息例如是計算機可讀指令、數(shù)據(jù)結(jié)構(gòu)、程序模塊或其他數(shù)據(jù)。計算機存儲介質(zhì)包括,但不局限于,RAM、ROM、EEPROM、閃存或其他存儲技術(shù)、CD-ROM、數(shù)字通用磁盤(DVD)或其他光學(xué)存儲器、盒式磁帶、磁帶、磁盤存儲器或其它磁性存儲設(shè)備,或任何其它可用于存儲所需信息且計算機可訪問的介質(zhì)?!巴ㄐ沤橘|(zhì)”典型地是計算機可讀指令、數(shù)據(jù)結(jié)構(gòu)、程序模塊或在調(diào)制數(shù)據(jù)信號中的其他數(shù)據(jù),例如載波或其他傳送機制。通信介質(zhì)也包括任何信息傳遞介質(zhì)。術(shù)語“調(diào)制數(shù)據(jù)信號”的意思是具有一個或多個特征設(shè)置或通過與編碼此信號中信息相同的方式來改變的信號。例如,但不限于,通信介質(zhì)包括諸如一有線網(wǎng)絡(luò)或直接有線連接的有線介質(zhì),以及諸如聲音、RF、紅外的無線介質(zhì)以及其它無線介質(zhì)。上述內(nèi)容的任何組合都包括在計算機可讀介質(zhì)范圍內(nèi)??蛇x地,可用硬件或硬件、軟件和/或固件的組合來實現(xiàn)框架部分。例如,可設(shè)計或編程一或多個專用集成電路(ASIC)或可編程邏輯設(shè)備(PLD)來實現(xiàn)一個或多個框架部分。結(jié)論盡管本發(fā)明已經(jīng)用特定于結(jié)構(gòu)特征和方法行為的語言進(jìn)行了描述,但是可以理解由所附權(quán)利要求所限定的本發(fā)明并不局限于所述特定特征或行為。相反地,所述特定特征和行為僅僅是實現(xiàn)所要求保護(hù)的發(fā)明的示例性的形式。權(quán)利要求1.一種方法,包括接收一個將要設(shè)計的系統(tǒng)的描述;接收一個將要設(shè)計的環(huán)境的描述;以及在所述系統(tǒng)正在設(shè)計期間并且將要配置所述系統(tǒng)之前,利用這兩個所接收的描述相對于所述環(huán)境驗證所述系統(tǒng)。2.如權(quán)利要求1中所述的方法,所述系統(tǒng)的描述包括一個SDM文檔。3.如權(quán)利要求1中所述的方法,所述環(huán)境的描述包括一個LIM文檔。4.如權(quán)利要求1中所述的方法,所述系統(tǒng)包括一個軟件應(yīng)用程序,并且所述環(huán)境包括一個數(shù)據(jù)中心。5.如權(quán)利要求1中所述的方法,所述環(huán)境包括一個在其中預(yù)期部署所述系統(tǒng)的環(huán)境。6.一種或多種計算機可讀媒體,其上存儲了多條指令,當(dāng)一個或多個處理器執(zhí)行該指令時,能夠使所述一個或多個處理器在一或多個處理器運行地程序設(shè)計過程中,訪問描述了系統(tǒng)的系統(tǒng)描述;以及利用所述系統(tǒng)描述,相對于一個模擬的環(huán)境驗證所述系統(tǒng)。7.如權(quán)利要求6所述的一種或多種計算機可讀媒體,所述多條計算機指令進(jìn)一步使所述處理器從一個請求者那里接收一個驗證所述系統(tǒng)的請求;以及向所述請求者返回所述驗證的結(jié)果。8.如權(quán)利要求6所述的一種或多種計算機可讀媒體,其中使所述一個或多個處理器相對于所述模擬的環(huán)境驗證所述系統(tǒng)的指令進(jìn)一步使所述一個或多個處理器從所述系統(tǒng)描述中選擇一個最高級定義;為一個實例空間,產(chǎn)生一個由最高級定義所描述的適當(dāng)?shù)膶嵗?;選擇嵌套在所述最高級定義中的附加定義;根據(jù)所述選擇的定義是限定了一個對象還是一個關(guān)系,為所述實例空間,產(chǎn)生一個由附加定義所描述的適當(dāng)實例;以及繼續(xù)進(jìn)行所述附加定義的選擇以及如所述附加定義所描述的適當(dāng)實例產(chǎn)生,直到為所述實例空間產(chǎn)生了嵌套在所述最高級定義中的所有定義的實例為止。9.如權(quán)利要求6所述的一種或多種計算機可讀媒體,其中使所述一個或多個處理器相對于所述模擬的環(huán)境驗證所述系統(tǒng)的指令進(jìn)一步使所述一個或多個處理器識別一個實例空間中的一個或多個信息流,所述實例空間描述了所述系統(tǒng);為一個或多個信息流中的至少一個信息流的每一個識別所述信息流的一個或多個輸入值,所述輸入值從所述實例空間中的其它實例中獲得;以及至少部分地根據(jù)所述輸入值,產(chǎn)生所述信息流的輸出值。10.如權(quán)利要求6所述的一種或多種計算機可讀媒體,其中使所述一個或多個處理器相對于所述模擬的環(huán)境驗證所述系統(tǒng)的指令進(jìn)一步使所述一個或多個處理器識別一個實例空間中的一個或多個約束條件,所述實例空間描述了所述系統(tǒng);檢查是否滿足了所述一個或多個約束條件;以及對于所述一個或多個約束條件的每一個,返回表示是否滿足所述約束條件的一個值。11.一種裝置,包括加載器,其被配置為加載一個或多個描述了一個系統(tǒng)的文檔,所述加載所述一個或多個文檔時,所述系統(tǒng)正在被設(shè)計;模擬器,其被配置為模擬了一個數(shù)據(jù)中心的環(huán)境,并且相對于所述環(huán)境驗證所述系統(tǒng);以及所述裝置與所述數(shù)據(jù)中心相分離。12.如權(quán)利要求11所述的裝置,其進(jìn)一步包括擴展引擎,其用于從所述一個或多個文檔中的其中之一中識別一個最高級定義,并且通過例示嵌套在所述作高級定義中的成員,擴展所述最高級定義,來填充一個實例空間。13.如權(quán)利要求12所述的裝置,其進(jìn)一步包括信息流引擎,其用于識別所述實例空間中的信息流,識別輸入到所述信息流中的所述值,以及根據(jù)所述信息流的所述輸入,設(shè)置所述信息流的一個輸出。14.如權(quán)利要求13所述的裝置,其進(jìn)一步包括約束條件引擎,其用于識別和評估所述實例空間中的約束條件。15.一種或多種計算機可讀媒體,其上存儲了多個指令,當(dāng)一個或多個處理器執(zhí)行該指令時,能夠使所述一個或多個處理器訪問一個描述了一個系統(tǒng)的文檔,所述系統(tǒng)被設(shè)計用于一個數(shù)據(jù)中心的環(huán)境中;從所述文檔中選擇一個最高級定義;為一個實例空間,產(chǎn)生一個由所述最高級定義所描述的適當(dāng)實例;選擇嵌套在所述最高級定義中的附加定義;根據(jù)所述選擇的定義限定的是一個對象還是一個關(guān)系,為所述實例空間,產(chǎn)生一個由所述附加定義所描述的適當(dāng)實例;以及繼續(xù)進(jìn)行所述附加定義的選擇以及如所述附加定義所描述的適當(dāng)實例的產(chǎn)生,直到為所述實例空間產(chǎn)生了嵌套在所述最高級定義中的所有定義的實例為止。16.如權(quán)利要求15所述的一種或多種計算機可讀媒體,其中當(dāng)所述選擇的定義限定了一個關(guān)系時,使所述一個或多個處理器產(chǎn)生一個如所述附加定義描述的適當(dāng)實例的所述系統(tǒng)指令進(jìn)一步使所述一個或多個處理器根據(jù)包含在所定義的關(guān)系中的許多源實例和許多目標(biāo)實例,識別許多要創(chuàng)建的關(guān)系實例;創(chuàng)建所標(biāo)識的數(shù)量的關(guān)系實例;以及為每個所創(chuàng)建的關(guān)系實例,將源和目標(biāo)實例與所述關(guān)系實例相聯(lián)系。17.如權(quán)利要求16所述的一種或多種計算機可讀媒體,所述選擇的定義限定了一個包含關(guān)系,該包含關(guān)系描述了一個實例可以包含在另一個實例中。18.如權(quán)利要求16所述的一種或多種計算機可讀媒體,所述選擇的定義限定了一個通信關(guān)系,該通信關(guān)系描述了在獨立部署的軟件元素之間的交互關(guān)系。19.如權(quán)利要求16所述的一種或多種計算機可讀媒體,所述選擇的定義限定了一個引用關(guān)系,該引用關(guān)系用于捕獲實例間的從屬關(guān)系。20.如權(quán)利要求16所述的一種或多種計算機可讀媒體,所述選擇的定義限定了一個宿主關(guān)系,該宿主關(guān)系將一個主機和一個或多個其客機成員實例相聯(lián)系。21.如權(quán)利要求16所述的一種或多種計算機可讀媒體,所述選擇的定義限定了一個授權(quán)關(guān)系,該授權(quán)關(guān)系將兩個系統(tǒng)的通信端點相聯(lián)系。22.如權(quán)利要求15所述的一種或多種計算機可讀媒體,其中當(dāng)所述選擇的定義限定了一個關(guān)系時,使所述一個或多個處理器產(chǎn)生一個如所述附加定義描述的適當(dāng)實例的所述系統(tǒng)指令進(jìn)一步使所述一個或多個處理器識別在所選擇的定義中標(biāo)識的所述對象的最小出現(xiàn)次數(shù);根據(jù)所標(biāo)識的最小出現(xiàn)次數(shù)和已經(jīng)產(chǎn)生了所選定義的多少個實例,識別要產(chǎn)生的所選定義的實例的數(shù)量;以及產(chǎn)生所識別數(shù)量的所選定義的實例。23.如權(quán)利要求15所述的一種或多種計算機可讀媒體,其中其中當(dāng)所述選擇的定義限定了一個對象時,使所述一個或多個處理器產(chǎn)生一個如所述附加定義描述的適當(dāng)實例的所述系統(tǒng)指令進(jìn)一步使所述一個或多個處理器觸發(fā)一個事件,該事件允許一監(jiān)聽器創(chuàng)建由所述附加信息描述的所述適當(dāng)實例。24.如權(quán)利要求15所述的一種或多種計算機可讀媒體,其中中當(dāng)所述選擇的定義限定了一個關(guān)系時,使所述一個或多個處理器產(chǎn)生一個如所述附加定義描述的適當(dāng)實例的所述系統(tǒng)指令進(jìn)一步使所述一個或多個處理器觸發(fā)一個事件,該事件允許一監(jiān)聽器創(chuàng)建由所述附加信息描述的所述適當(dāng)實例。25.如權(quán)利要求15所述的一種或多種計算機可讀媒體,其中在開始在所述數(shù)據(jù)中心中部署所述系統(tǒng)之前,執(zhí)行所述指令。26.一種或多種計算機可讀媒體,其上存儲了多條指令,當(dāng)一個或多個處理器執(zhí)行該指令時,能夠使所述一個或多個處理器識別一個實例空間中的一個或多個信息流,所述實例空間描述了為了用于數(shù)據(jù)中心的環(huán)境中而設(shè)計的系統(tǒng);為一個或多個信息流中的至少一個信息流的每一個識別所述信息流的一個或多個輸入值,所述輸入值從所述實例空間中的其它實例中獲得;以及至少部分地根據(jù)所述輸入值,產(chǎn)生所述信息流的輸出值。27.如權(quán)利要求26所述的一種或多種計算機可讀媒體,其中使所述一個或多個處理器識別所述信息流的一個或多個輸入值的所述指令進(jìn)一步使所述一個或多個處理器識別是否已經(jīng)指定了輸入值;如果已經(jīng)指定了輸入值,那么從其它的實例中獲得所述輸入值;如果至少一個所述輸入值還沒有被指定,那么對于每一個還沒有被指定的所述輸入值識別設(shè)定所述輸入值的一個其它的信息流;識別所述其它信息流的一個或多個輸入值,所述輸入值從所述實例空間的其它實例中獲得;以及至少部分地根據(jù)所述輸入值,產(chǎn)生所述其它信息流的一個輸出值。28.如權(quán)利要求26所述的一種或多種計算機可讀媒體,其中使所述一個或多個處理器至少部分地根據(jù)所述輸入值產(chǎn)生所述其它信息流的所述輸出值的所述指令進(jìn)一步使所述一個或多個處理器識別與所述信息流相關(guān)的一組指令,所述指令可以被執(zhí)行以產(chǎn)生一個結(jié)果;執(zhí)行所識別的指令組;以及用所產(chǎn)生的結(jié)果作為所述信息流的所述輸出值。29.如權(quán)利要求26所述的一種或多種計算機可讀媒體,所述系統(tǒng)包括一個部署在所述環(huán)境中的應(yīng)用程序。30.如權(quán)利要求26所述的一種或多種計算機可讀媒體,所述環(huán)境包括一數(shù)據(jù)中心的一硬件描述。31.如權(quán)利要求26所述的一種或多種計算機可讀媒體,其中在開始在所述環(huán)境中部署所述系統(tǒng)之前,執(zhí)行所述指令。32.一種或多種計算機可讀媒體,其上存儲了多個指令,當(dāng)一個或多個處理器執(zhí)行該指令時,能夠使所述一個或多個處理器識別一個實例空間中的一個或多個約束條件,所述實例空間描述了一個為用于一數(shù)據(jù)中心的環(huán)境中而設(shè)計的系統(tǒng);檢查是否滿足了所述一個或多個約束條件;以及對于所述一個或多個約束條件,返回表示所述約束條件是否滿足的一個值。33.如權(quán)利要求32所述的一種或多種計算機可讀媒體,所述一個或多個約束條件包括設(shè)定約束條件、關(guān)系約束條件以及對象約束條件。34.如權(quán)利要求32所述的一種或多種計算機可讀媒體,其中使所述一個或多個處理器檢查是否滿足所述一個或多個約束條件的所述指令進(jìn)一步使所述一個或多個處理器為所述約束條件的其中之一識別與所述信息流相關(guān)的一組指令,所述指令可以被執(zhí)行以產(chǎn)生一個結(jié)果;執(zhí)行所識別的指令組;以及用所產(chǎn)生的結(jié)果作為表示所述約束條件是否滿足的所述返回值。35.如權(quán)利要求32所述的一種或多種計算機可讀媒體,其中使所述一個或多個處理器檢查是否滿足所述一個或多個約束條件的所述指令進(jìn)一步使所述一個或多個處理器為所述約束條件的其中之一識別所述約束條件的目標(biāo)實例的角色和對象定義;檢查所述約束條件的所述角色和所述對象定義是否與所述目標(biāo)實例的角色和對象定義相匹配;以及根據(jù)所述約束條件的所述角色和所述對象定義是否與所述目標(biāo)實例的角色和對象定義相匹配,產(chǎn)生表示所述約束條件是否滿足的所述返回值。36.如權(quán)利要求35所述的一種或多種計算機可讀媒體,其中使所述一個或多個處理器檢查是否滿足所述一個或多個約束條件的所述指令進(jìn)一步使所述一個或多個處理器為所述約束條件的其中之一識別所述約束條件的所述目標(biāo)實例的第二角色和第二對象定義;檢查所述約束條件的所述第二角色和所述第二對象定義是否與所述目標(biāo)實例的所述角色和所述對象定義相匹配;以及根據(jù)所述約束條件的所述角色和所述對象定義是否與所述目標(biāo)實例的所述角色和所述對象定義以及所述目標(biāo)實例的所述第二角色和所述第二對象定義相匹配,產(chǎn)生表示所述約束條件是否滿足的所述返回值。37.如權(quán)利要求35所述的一種或多種計算機可讀媒體,其中使所述一個或多個處理器檢查是否滿足所述一個或多個約束條件的所述指令進(jìn)一步使所述一個或多個處理器為所述約束條件的其中之一評估所述目標(biāo)實例的一個或多個嵌套約束條件;接收所述嵌套約束條件的一個或多個返回值,所述一個或多個返回值表示所述一個或多個嵌套約束條件是否滿足;以及根據(jù)所述嵌套約束條件的所述一個或多個返回值,產(chǎn)生表示所述約束條件是否滿足的返回值。38.如權(quán)利要求32所述的一種或多種計算機可讀媒體,其中使所述一個或多個處理器為每個所述一個或多個約束條件返回一個表示所述約束條件是否滿足的值的所述指令,進(jìn)一步使所述一個或多個處理器為所述約束條件的其中之一如果將返回的值表示所述約束條件沒有滿足,那么檢查是否產(chǎn)生了所述約束條件的一個錯誤消息;以及如果產(chǎn)生了所述錯誤消息,那么產(chǎn)生包括標(biāo)識所述約束條件的信息的所述錯誤消息。39.如權(quán)利要求32所述的一種或多種計算機可讀媒體,其中使所述一個或多個處理器檢查是否滿足所述一個或多個約束條件的所述指令進(jìn)一步使所述一個或多個處理器為所述約束條件的其中之一初始化一個匹配計數(shù)變量;識別所述約束條件的所述目標(biāo)實例參與的一個或多個關(guān)系實例;為所述一個或多個關(guān)系實例中的每一個,評估所述關(guān)系實例是否滿足所述約束條件;對于滿足所述約束條件的所述一個或多個關(guān)系實例中的每一個,增加所述匹配計數(shù)變量;以及根據(jù)評估了所述一個或多個關(guān)系實例后的所述匹配計數(shù)變量的值,產(chǎn)生表示所述約束條件是否滿足的返回值。40.如權(quán)利要求39所述的一種或多種計算機可讀媒體,其中使所述一個或多個處理器為每個所述一個或多個關(guān)系實例評估所述關(guān)系實例是否滿足所述約束條件所述指令,進(jìn)一步使所述一個或多個處理器為所述約束條件的其中之一檢查所述約束條件的一關(guān)系定義是否與所述關(guān)系實例的一關(guān)系定義相匹配;檢查所述約束條件的一指向是否與所述關(guān)系實例的一指向相匹配;檢查是否所述關(guān)系實例的所有的嵌套約束條件都滿足;以及如果所述約束條件的所述關(guān)系定義與所述關(guān)系實例的所述關(guān)系定義相匹配,所述約束條件的所述指向與所述關(guān)系實例的所述指向相匹配以及所述關(guān)系實例的所有的嵌套約束條件都滿足,那么就返回一個表示所述約束條件滿足的值。41.如權(quán)利要求39所述的一種或多種計算機可讀媒體,其中使所述一個或多個處理器為每個所述一個或多個關(guān)系實例評估所述關(guān)系實例是否滿足所述約束條件所述指令,進(jìn)一步使所述一個或多個處理器為所述約束條件的其中之一檢查所述約束條件的一目標(biāo)對象是否與所述關(guān)系實例的另一方實例相匹配;如果所述約束條件的所述關(guān)系定義與所述關(guān)系實例的所述關(guān)系定義相匹配,所述約束條件的所述指向與所述關(guān)系實例的所述指向相匹配,所述關(guān)系實例的所有的嵌套約束條件都滿足以及所述約束條件的所述目標(biāo)對象與所述關(guān)系實例的所述另一方實例相匹配,那么就返回一個表示所述約束條件滿足的值。42.如權(quán)利要求39所述的一種或多種計算機可讀媒體,其中使所述一個或多個處理器根據(jù)評估所述一個或多個關(guān)系實例后的所述匹配計數(shù)變量的值,產(chǎn)生表示所述約束條件是否滿足的所述返回值的所述指令,進(jìn)一步使所述一個或多個處理器為所述約束條件的其中之一檢查所述匹配計數(shù)變量是否至少是所述約束條件的一最小值并且不大于所述約束條件的一最大值;以及如果所述匹配計數(shù)變量至少是所述約束條件的所述最小值并且不大于所述約束條件的所述最大值,那么產(chǎn)生表示滿足所述約束條件的所述返回值,否則產(chǎn)生表示所述約束條件不滿足的返回值。43.如權(quán)利要求32所述的一種或多種計算機可讀媒體,其中在將所述系統(tǒng)配置到所述系統(tǒng)中之前,執(zhí)行所述指令。全文摘要根據(jù)系統(tǒng)設(shè)計期間的驗證的一個某些的方面,要接收將被設(shè)計的系統(tǒng)的描述和環(huán)境的描述。這些描述都用于在設(shè)計系統(tǒng)時以及在配置系統(tǒng)之前對照環(huán)境來驗證系統(tǒng)。文檔編號G06Q50/00GK1570860SQ200410032700公開日2005年1月26日申請日期2004年3月5日優(yōu)先權(quán)日2003年3月6日發(fā)明者G·奧斯萊德,K·格里利希,R·門辛,B·塔巴拉,R·V·維蘭德申請人:微軟公司