在本演練中,您將創(chuàng)建用于創(chuàng)建分布式應(yīng)用程序(包含后端項(xiàng)目、用戶界面項(xiàng)目和實(shí)用程序庫(kù))的企業(yè)級(jí)模板。本演練適用于要了解企業(yè)級(jí)模板項(xiàng)目原型如何簡(jiǎn)化開(kāi)發(fā)分布式應(yīng)用程序流程的用戶,尤其適用于要開(kāi)發(fā)其自己的模板來(lái)自定義 Visual Studio 集成開(kāi)發(fā)環(huán)境 (IDE) 以用于自己的項(xiàng)目和開(kāi)發(fā)組的結(jié)構(gòu)設(shè)計(jì)者。
本演練包含下列部分:
開(kāi)始本演練之前
規(guī)劃模板的初始應(yīng)用程序結(jié)構(gòu)
創(chuàng)建初始原型
將策略與初始應(yīng)用程序結(jié)構(gòu)關(guān)聯(lián)
將初始實(shí)現(xiàn)轉(zhuǎn)換為模板
使模板可供用戶使用
自定義策略文件
使用 ELEMENTSET 節(jié)點(diǎn)應(yīng)用策略
開(kāi)始本演練之前
在實(shí)際開(kāi)始本演練之前,了解以下各點(diǎn)包含的建議將對(duì)您有所幫助。
打印演練
打印本演練以簡(jiǎn)化其使用。當(dāng)使用單個(gè)計(jì)算機(jī)讀取并執(zhí)行指令時(shí),這樣做尤其有用。您將鍵入或復(fù)制并粘貼大量 XML,而最簡(jiǎn)單的方法是打開(kāi)并打印本演練。使本演練保持打開(kāi),但使用硬拷貝遵循這些指導(dǎo)。如果需要復(fù)制并粘貼 XML 塊,請(qǐng)切換到本演練,查找并復(fù)制所需的行,然后使用“編輯”菜單上的“粘貼為 HTML”進(jìn)行粘貼。
查看本主題的另一種方法是在 Visual Studio 集成開(kāi)發(fā)環(huán)境 (IDE) 之外顯示“幫助”。從“工具”菜單中選擇“選項(xiàng)”。從“環(huán)境”文件夾中選擇“幫助”,然后選擇“幫助設(shè)置”頁(yè)上的“外部幫助”。請(qǐng)注意,僅當(dāng)重新啟動(dòng)集成開(kāi)發(fā)環(huán)境 (IDE) 后,在“設(shè)置”頁(yè)上所做的更改才會(huì)生效。
確認(rèn)或安裝 Internet 信息服務(wù) (IIS)
作為本演練的組成部分,您將創(chuàng)建一個(gè) XML Web services。相關(guān)說(shuō)明假定您所使用的開(kāi)發(fā)計(jì)算機(jī)在安裝 Windows 2000 或 Windows XP 的同時(shí)安裝了 IIS。盡管 IIS 并非絕對(duì)必要,但是演練中某些步驟提供了基于此組件的指南。如果無(wú)法確定是否已安裝此組件,則應(yīng)花點(diǎn)時(shí)間來(lái)進(jìn)行確認(rèn)。
在計(jì)算機(jī)上驗(yàn)證和/或安裝 IIS
- 在 Windows 2000 中,單擊“開(kāi)始”,單擊“設(shè)置”,然后單擊“控制面板”。(在 Windows XP 和 Windows Server 2003 中,有多種打開(kāi)“控制面板”的方式,如通過(guò)“我的電腦”或直接從“開(kāi)始”菜單打開(kāi)。)
- 在“控制面板”中找到“添加/刪除程序”圖標(biāo)(這在 Windows XP 和 Windows Server 2003 中稱為“添加或刪除程序”),雙擊它以顯示“添加/刪除程序”對(duì)話框。
- 在對(duì)話框的左側(cè),單擊“添加/刪除 Windows 組件”。
- 在“添加/刪除 Windows 組件”對(duì)話框中,查找“Internet 信息服務(wù)”。如果選定了該框,則表示已經(jīng)安裝了 IIS,您可以跳過(guò)第 5 步和第 6 步。如果沒(méi)有選定,請(qǐng)選擇它。
- 單擊“下一步”開(kāi)始安裝過(guò)程。
- 安裝完成之后,單擊“完成”,關(guān)閉向?qū)А?
在 Windows 資源管理器中顯示隱藏文件、文件夾和文件擴(kuò)展名
在 Windows 資源管理器中編輯文件時(shí),如果文件和文件夾已隱藏或文件擴(kuò)展名不可見(jiàn),有時(shí)很難找到正確的項(xiàng)。驗(yàn)證在 Windows 資源管理器中的設(shè)置,必要時(shí)可對(duì)其進(jìn)行更改。
顯示隱藏文件、文件夾和文件擴(kuò)展名
- 轉(zhuǎn)到 Windows 資源管理器的“工具”菜單并單擊“文件夾選項(xiàng)”,然后單擊“查看”。
- 找到“隱藏文件和文件夾”,然后選擇“顯示隱藏文件和文件夾”。
- 找到“隱藏已知文件類型的擴(kuò)展名”并清除此復(fù)選框。
本演練中的模板結(jié)構(gòu)
在本演練中創(chuàng)建的分布式應(yīng)用程序的結(jié)構(gòu)將隨后轉(zhuǎn)化為模板,該模板由圍繞后端、用戶界面和實(shí)用程序庫(kù)生成的結(jié)構(gòu)組成。創(chuàng)建所需工作之后,模板就可以完全起作用了。
本演練只提供使用自定義企業(yè)級(jí)模板可以為創(chuàng)建分布式應(yīng)用程序的開(kāi)發(fā)組提供哪些服務(wù)或功能的示例。但應(yīng)該切記的是,對(duì)于模板和分布式應(yīng)用程序,提供的選項(xiàng)并不局限于在本演練中的相同選項(xiàng)。靈活性是企業(yè)級(jí)模板概念的重要組成部分。
規(guī)劃企業(yè)級(jí)模板
本演練可以分成若干個(gè)邏輯部分,每一部分又包含幾個(gè)步驟。
- 規(guī)劃模板的結(jié)構(gòu)并命名架構(gòu)。
- 創(chuàng)建要保存為企業(yè)級(jí)模板的應(yīng)用程序結(jié)構(gòu)。
- 創(chuàng)建策略文件并使之與應(yīng)用程序結(jié)構(gòu)關(guān)聯(lián)。
- 將應(yīng)用程序結(jié)構(gòu)和策略文件轉(zhuǎn)換為企業(yè)級(jí)模板。
- 使模板可在“新建項(xiàng)目”對(duì)話框中供用戶使用。
- 自定義模板以擴(kuò)展其用途。
注意 本演練使用的名稱是隨意采用的,但它們都符合 DAP.tdl 文件中使用的約定。有關(guān)命名約定的更多信息,請(qǐng)參見(jiàn)企業(yè)級(jí)模板中的命名約定。
在上表中未包括一個(gè)可選邏輯部分(在第四個(gè)和第五個(gè)邏輯部分之間),即,將自定義項(xiàng)目向?qū)нB接到模板以生成自定義的項(xiàng)目文件。有關(guān)更多信息,請(qǐng)參見(jiàn)演練:使用子項(xiàng)目向?qū)?chuàng)建模板。
規(guī)劃模板的初始應(yīng)用程序結(jié)構(gòu)
創(chuàng)建用于分布式應(yīng)用程序的企業(yè)級(jí)模板的過(guò)程分為兩個(gè)階段:設(shè)計(jì)滿足項(xiàng)目需要的應(yīng)用程序結(jié)構(gòu);然后在 Visual Studio IDE 中創(chuàng)建該結(jié)構(gòu)。即使您完全更改了自己的模板的目的和實(shí)現(xiàn),也應(yīng)該可以利用在此顯示的結(jié)構(gòu)中的概念。
模板部件的結(jié)構(gòu)生成和命名
預(yù)先確定用于企業(yè)級(jí)模板中的每一對(duì)象和項(xiàng)目的名稱非常重要。本例中,根項(xiàng)目為 MyTemplate。在應(yīng)用程序中的其他地方不小心使用其他名稱(例如 etpMyProj、etpMyProject 或 MyProj)是比較常見(jiàn)的錯(cuò)誤來(lái)源。顯而易見(jiàn),您可以選擇任意名稱,但考慮使用 MyTemplate 可以增強(qiáng)本演練的說(shuō)明效果并減少混淆。
企業(yè)級(jí)模板允許您使用兩種常規(guī)項(xiàng)目類型:企業(yè)級(jí)模板項(xiàng)目(.etp 文件擴(kuò)展名)和語(yǔ)言項(xiàng)目(本例為 C#)。Visual Studio 將 .etp 文件擴(kuò)展名追加到每一企業(yè)級(jí)模板項(xiàng)目的名稱之后,并提供默認(rèn)的目錄結(jié)構(gòu)和許多企業(yè)級(jí)模板項(xiàng)目所必需的一組文件。以下顯示了在每一企業(yè)級(jí)模板項(xiàng)目上的 .etp 文件擴(kuò)展名和在每一 C# 語(yǔ)言項(xiàng)目上的 .csproj 文件擴(kuò)展名:
MyTemplate.etp
BackendProjects.etp
WebService.csproj
UIProjects.etp
WinApp.csproj
UtilityProjects.etp
UtilityLibrary.csproj
創(chuàng)建這一用于模板的初始應(yīng)用程序結(jié)構(gòu)有多種方式。第一種方式是使用靜態(tài)原型。這是最簡(jiǎn)單的過(guò)程,在本演練中用于提供對(duì)于所涉及的問(wèn)題的基本了解。其他方式使用子項(xiàng)目向?qū)В⑻峁└嗟撵`活性。有關(guān)更多信息,請(qǐng)參見(jiàn)演練:使用子項(xiàng)目向?qū)?chuàng)建模板。
創(chuàng)建初始原型
創(chuàng)建模板進(jìn)程中涉及到的初始部件與創(chuàng)建分布式應(yīng)用程序相同。在創(chuàng)建結(jié)構(gòu)并將策略文件關(guān)聯(lián)到解決方案之后,您可以編輯某些文件,并將結(jié)構(gòu)優(yōu)化為模板,作為將來(lái)應(yīng)用程序的基礎(chǔ)。
創(chuàng)建初始應(yīng)用程序結(jié)構(gòu)
- 啟動(dòng) Visual Studio。
- 在“文件”菜單上指向“新建”,然后單擊“項(xiàng)目”。
顯示出“新建項(xiàng)目”對(duì)話框。 - 在“項(xiàng)目類型”窗格中展開(kāi)“其他項(xiàng)目”文件夾,并選擇“企業(yè)級(jí)模板項(xiàng)目”文件夾!澳0濉贝案耧@示若干圖標(biāo)。選擇“企業(yè)級(jí)模板項(xiàng)目”。避免雙擊它,以便在創(chuàng)建項(xiàng)目前可以分配自定義名稱。
注意 不要在左窗格中展開(kāi)“企業(yè)級(jí)模板項(xiàng)目”文件夾并選擇其中的一個(gè)子文件夾。那些文件夾包含用作構(gòu)造塊而不是整個(gè)模板的語(yǔ)言項(xiàng)目。
- 使用 MyTemplate 替換默認(rèn)的項(xiàng)目名。
- 記錄“位置”中的路徑名。在后面的步驟中,將把該項(xiàng)目復(fù)制到另一個(gè)位置。單擊“確定”。MyTemplate 項(xiàng)目現(xiàn)在將出現(xiàn)在解決方案資源管理器中。
通過(guò)添加嵌套的 .etp 項(xiàng)目繼續(xù)創(chuàng)建此模板的結(jié)構(gòu)。
創(chuàng)建嵌套的企業(yè)級(jí)模板 (.etp) 項(xiàng)目
- 在解決方案資源管理器中選擇 MyTemplate。
- 在“文件”菜單上指向“添加項(xiàng)目”,然后單擊“新建項(xiàng)目”。
出現(xiàn)“添加新項(xiàng)目”對(duì)話框。 - 選擇“企業(yè)級(jí)模板項(xiàng)目”,然后在“模板”窗格中選擇“企業(yè)級(jí)模板項(xiàng)目”。
- 將項(xiàng)目名更改為 BackendProjects,然后單擊“確定”。
解決方案資源管理器中出現(xiàn) BackendProjects 項(xiàng)目。 - 重復(fù)該過(guò)程兩次,第一次將名稱更改為“UIProjects”,第二次將名稱更改為“UtilityProjects”。
現(xiàn)在即擁有了用于分布式應(yīng)用程序的模板的基本結(jié)構(gòu)。
創(chuàng)建語(yǔ)言項(xiàng)目
現(xiàn)在所擁有的是大量的結(jié)構(gòu),而沒(méi)有什么顯而易見(jiàn)的功能。此模板的編程功能由基于 C# 語(yǔ)言的三個(gè)項(xiàng)目提供。這些語(yǔ)言項(xiàng)目和已經(jīng)創(chuàng)建的企業(yè)級(jí)模板項(xiàng)目之間最明顯的差異在于:文件擴(kuò)展名和在解決方案資源管理器中與其關(guān)聯(lián)的標(biāo)志符號(hào)。
由于您正在創(chuàng)建由創(chuàng)建分布式應(yīng)用程序的開(kāi)發(fā)組所要使用的模板,因此結(jié)構(gòu)將會(huì)非常復(fù)雜,這也正體現(xiàn)了此類項(xiàng)目的特性。企業(yè)級(jí)模板項(xiàng)目 (.etp projects) 提供了實(shí)現(xiàn)更加復(fù)雜的結(jié)構(gòu)的方法。
創(chuàng)建 ASP.NET Web 服務(wù)語(yǔ)言項(xiàng)目
- 在解決方案資源管理器中選擇 BackendProjects。
- 在“文件”菜單上指向“添加項(xiàng)目”,然后單擊“新建項(xiàng)目”。
出現(xiàn)“添加新項(xiàng)目”對(duì)話框。 - 在“項(xiàng)目類型”窗格中選擇“Visual C# 項(xiàng)目”。
- 在“模板”窗格中選擇“ASP.NET Web 服務(wù)”。
- 在“位置”框中,接受或指定有效的 URL 并指定名稱 WebService。單擊“確定”。
WebService 項(xiàng)目將出現(xiàn)在解決方案資源管理器中。注意 正如本演練開(kāi)始所示的,您應(yīng)該已在計(jì)算機(jī)上安裝了 Microsoft Internet 信息服務(wù) (IIS)。如果 IIS 安裝正確,系統(tǒng)將自動(dòng)在“位置”旁邊顯示 http://localhost。如果在單擊“確定”后出現(xiàn)了錯(cuò)誤,則檢查 IIS 的安裝。有關(guān)安裝 IIS 的更多信息,請(qǐng)參見(jiàn)開(kāi)始本演練之前。
創(chuàng)建 C# Windows 應(yīng)用程序語(yǔ)言項(xiàng)目
- 在解決方案資源管理器中選擇 UIProjects。
- 在“文件”菜單上指向“添加項(xiàng)目”,然后單擊“新建項(xiàng)目”。出現(xiàn)“添加新項(xiàng)目”對(duì)話框。
- 在“項(xiàng)目類型”窗格中選擇“Visual C# 項(xiàng)目”。
- 在“模板”窗格中,選擇“Windows 應(yīng)用程序”。將名稱更改為 WinApp,然后單擊“確定”。
WinApp 項(xiàng)目將出現(xiàn)在解決方案資源管理器中。
創(chuàng)建 C# 類庫(kù)語(yǔ)言項(xiàng)目
- 在“解決方案資源管理器”中選擇 UtilityProjects。
- 在“文件”菜單上指向“添加項(xiàng)目”,然后單擊“新建項(xiàng)目”。出現(xiàn)“添加新項(xiàng)目”對(duì)話框。
- 在“項(xiàng)目類型”窗格中選擇“Visual C# 項(xiàng)目”。
- 在“模板”窗格中,選擇“類庫(kù)”。將名稱更改為 UtilityLibrary,然后單擊“確定”。
UtilityLibrary 項(xiàng)目將出現(xiàn)在解決方案資源管理器中。
這些原型項(xiàng)目用作實(shí)際應(yīng)用程序的基礎(chǔ),您(結(jié)構(gòu)設(shè)計(jì)者)可以指定應(yīng)用程序的設(shè)置,例如 DefaultHTMLPageLayout 或 StartupObject。您還可以指定生成配置設(shè)置,例如 WarningLevel 或 TreatWarningsAsErrors。指定這些設(shè)置的優(yōu)點(diǎn)是它們?cè)试S開(kāi)發(fā)組使用正確的默認(rèn)設(shè)置開(kāi)始工作。
將策略與初始應(yīng)用程序結(jié)構(gòu)關(guān)聯(lián)
在將此應(yīng)用程序結(jié)構(gòu)轉(zhuǎn)換成模板之前,需要將策略文件與其關(guān)聯(lián)?蓮念^創(chuàng)建策略文件,在文檔中對(duì)此已作了詳細(xì)介紹。有關(guān)策略文件的更多信息,請(qǐng)參見(jiàn)企業(yè)級(jí)模板策略概述。然而,在多數(shù)情況下,將策略文件與應(yīng)用程序關(guān)聯(lián)的最迅速且最不容易出錯(cuò)的方法是僅重命名 DAP.tdl 文件的一個(gè)副本,并根據(jù)需要對(duì)其進(jìn)行自定義。在本演練中,可采用一個(gè)簡(jiǎn)便方法,即克隆 DAP.tdl 文件,重命名該副本,然后根據(jù)需要修改它。
將策略文件與項(xiàng)目關(guān)聯(lián)
- 如果“屬性”窗口尚不可見(jiàn),請(qǐng)?jiān)诮鉀Q方案資源管理器中選擇“MyTemplate”節(jié)點(diǎn)(不是解決方案“MyTemplate”),右擊并選擇“屬性”。
- 在“屬性”窗口中,在網(wǎng)格的左列中找到“策略文件”。單擊“策略文件”字段右側(cè)的空白字段,該字段中將顯示省略號(hào)按鈕 (...)。
- 單擊該省略號(hào)按鈕打開(kāi)“選擇一個(gè) TDL 文件”對(duì)話框。
- 在此對(duì)話框中,選擇 DAP.tdl 文件并按 Ctrl+C 復(fù)制它。
- 按 Ctrl-V 粘貼該文件的副本,該文件副本便與其他 .tdl 文件一起顯示出來(lái)。
- 右擊剛創(chuàng)建的副本并將其重命名為 MyPolicy.tdl。
- 選擇 MyPolicy.tdl 并單擊“打開(kāi)”,將 MyPolicy.tdl 與當(dāng)前應(yīng)用程序關(guān)聯(lián)。
- 在系統(tǒng)提示重新打開(kāi)項(xiàng)目時(shí),單擊“是”。
在“屬性”窗口中,當(dāng)在解決方案資源管理器中選擇“MyTemplate”時(shí),“策略文件”右側(cè)的字段現(xiàn)在顯示 MyPolicy.tdl。
到此時(shí),您已創(chuàng)建了初始應(yīng)用程序結(jié)構(gòu),該結(jié)構(gòu)可以轉(zhuǎn)換并另存為模板,您自己的分布式應(yīng)用程序項(xiàng)目可基于該模板。
盡管下一節(jié)進(jìn)入將應(yīng)用程序轉(zhuǎn)換成模板的過(guò)程,但在進(jìn)入這部分過(guò)程前仍然可以向原型項(xiàng)目添加其他代碼、控件等。您在此演練中無(wú)需這樣做。
將初始實(shí)現(xiàn)轉(zhuǎn)換為模板
對(duì)于大多數(shù)項(xiàng)目類型,將結(jié)構(gòu)(例如在本演練中開(kāi)發(fā)的這一結(jié)構(gòu))轉(zhuǎn)換為模板是相當(dāng)簡(jiǎn)單的。但 Web 項(xiàng)目(包括 ASP.NET Web 服務(wù)項(xiàng)目)要比其他項(xiàng)目類型更加復(fù)雜一點(diǎn)。
關(guān)閉解決方案,保存所有更改,然后在繼續(xù)以下步驟之前退出 Visual Studio,以避免文件共享問(wèn)題。在以下步驟中,將所創(chuàng)建的文件和文件夾從其當(dāng)前位置復(fù)制到另一個(gè)地方,那里可以更好地反映新模板后面的邏輯。
定位模板項(xiàng)目文件夾和文件
- 在 Windows 2000 中,右擊“開(kāi)始”,然后單擊“瀏覽”。如果您執(zhí)行的是 Windows 2000 和 Visual Studio .NET 的默認(rèn)安裝,則可以在 Windows 資源管理器的目錄結(jié)構(gòu)中,在 ...\Program Files\Microsoft Visual Studio .NET 2003\EnterpriseFrameworks 之下找到“EnterpriseFrameworks”文件夾。如果在安裝 Windows 2000 和 Visual Studio .NET 時(shí)沒(méi)有接受默認(rèn)設(shè)置,則單擊 Windows 資源管理器中的“搜索”按鈕,在本地驅(qū)動(dòng)器上搜索“EnterpriseFrameworks”。
EnterpriseFrameworks 文件夾包含若干子文件夾,以下步驟只重點(diǎn)介紹其中的三個(gè):Policy、Projects 和 ProxyProjects。
組織文件夾和文件
- 查找您在 Visual Studio 中創(chuàng)建的初始應(yīng)用程序結(jié)構(gòu)的位置。MyTemplate 的默認(rèn)安裝點(diǎn)應(yīng)如下所示:
C:\Documents and Settings\UserName\My Documents\Visual Studio Projects\MyTemplate
- 將整個(gè) MyTemplate 文件夾復(fù)制到以下文件夾:
C:\Program Files\Microsoft Visual Studio .NET 2003\EnterpriseFrameworks\Projects
這將復(fù)制與 MyTemplate 關(guān)聯(lián)的除 WebService 項(xiàng)目之外的所有文件,該項(xiàng)目已在其他位置創(chuàng)建。
- 找到 Web 根,以便確定 WebService 項(xiàng)目文件創(chuàng)建的位置。如果安裝到默認(rèn)位置,項(xiàng)目將處于以下位置:
C:\Inetpub\wwwroot\WebService
- 將 WebService 文件夾復(fù)制到位于以下位置的 BackendProjects 文件夾中:
C:\Program Files\Microsoft Visual Studio .NET 2003\EnterpriseFrameworks\Projects\MyTemplate\BackendProjects
清理項(xiàng)目結(jié)構(gòu)
與分布式應(yīng)用程序不同,模板(如您正在創(chuàng)建的模板)并不使用顯示在項(xiàng)目目錄結(jié)構(gòu)中的所有文件和文件夾。當(dāng)開(kāi)發(fā)小組從模板中創(chuàng)建分布式應(yīng)用程序時(shí),將為特定應(yīng)用程序再次創(chuàng)建這些文件夾和文件。因此,應(yīng)移除這些文件夾和文件以避免以后發(fā)生混淆。
注意 如果尚未檢查本演練開(kāi)始部分提及的 Windows 資源管理器設(shè)置,則在繼續(xù)操作之前請(qǐng)先行檢查,確保 Windows 資源管理器顯示所有文件、文件夾和文件擴(kuò)展名。有關(guān)詳細(xì)信息,請(qǐng)參見(jiàn)開(kāi)始本演練之前。
移除不必要的文件夾和文件
- 在 MyTemplate 的 .etp 項(xiàng)目(BackendProjects、UIProjects 和 UtilityProjects)中,子文件夾可能包含 bin 或 obj 子文件夾。您可以選擇移除這些文件夾,以及移除 BackendProjects、UIProjects 和 UtilityProjects 文件夾中的任意 *.eto 文件。盡管這些文件夾并非必要,但它們的出現(xiàn)不會(huì)妨礙項(xiàng)目的功能。
- 在名為 MyTemplate 的文件夾中,刪除 *.eto、*.sln 和 *.suo 文件。同樣,這是一個(gè)可選步驟,這些文件并非必要,但也沒(méi)有壞處。
編輯 .etp 項(xiàng)目文件
需要在下列文件中進(jìn)行一些少量的編輯。
- ...\EnterpriseFrameworks\Projects\MyTemplate\MyTemplate.etp
- ...\EnterpriseFrameworks\Projects\MyTemplate\BackendProjects\BackendProjects.etp
- ...\EnterpriseFrameworks\Projects\MyTemplate\UIProjects\UIProjects.etp
- ...\EnterpriseFrameworks\Projects\MyTemplate\UtilityProjects\UtilityProjects.etp
移除項(xiàng)目 ID
- 所有這四個(gè) .etp 項(xiàng)目文件都包含一個(gè)必須移除的行。該行在 MyTemplate.etp 中出現(xiàn)三次,但在其余三個(gè)文件中只分別出現(xiàn)一次。在“記事本”或任何文本編輯器中打開(kāi)每一個(gè) .etp 文件,然后刪除包含以下信息的行:
<GUIDPROJECTID>{4CB5C3A7-3FBC-4B47-ADEB-F19768CB91C3}</GUIDPROJECTID>
注意 <GUIDPROJECTID> 的值在各個(gè) .etp 項(xiàng)目文件中都不相同,此處顯示的只是一個(gè)示例。
除了上述所做更改之外,Web 相關(guān)的項(xiàng)目還需要其他修改,將 Web 項(xiàng)目指向駐留在您自己的項(xiàng)目目錄結(jié)構(gòu)中的副本,而不是單一的活動(dòng)實(shí)例。此外,還有必要提供信息,通知企業(yè)級(jí)模板項(xiàng)目文件在項(xiàng)目初始化時(shí)提示需要 URL。
將 Web 項(xiàng)目修改為提示需要 URL
- 返回到 BackendProjects.etp 文件,并在“記事本”中打開(kāi)它。以下顯示了部分現(xiàn)有文本,其后顯示為粗體的是做出更改的文本:
<Views> <ProjectExplorer> <File>http://MachineName/WebService/WebService.csproj</File> </ProjectExplorer> </Views> <References> <Reference> <FILE>http://MachineName/WebService/WebService.csproj</FILE> </Reference> </References>
更改文件,即按照如下所示進(jìn)行編輯并添加行:
<Views> <ProjectExplorer>
<File>WebService\WebService.csproj</File>
</ProjectExplorer> </Views> <References> <Reference><FILE>WebService\WebService.csproj</FILE>
<REQUIRESURL>1</REQUIRESURL>
</Reference> </References>保存并關(guān)閉文件。
向項(xiàng)目文件添加 UserProperty 或項(xiàng)目全局值
下一步是為項(xiàng)目文件準(zhǔn)備信息,這些信息使策略文件 MyPolicy.tdl 能夠?qū)⑺鼈冏R(shí)別為 ELEMENT 節(jié)點(diǎn)。要完成這一任務(wù),需要向每一項(xiàng)目文件的 GLOBALS 部分添加 UserProperty(在語(yǔ)言項(xiàng)目中)或項(xiàng)目全局值(在 .etp 項(xiàng)目),如下所示。
下表列出了受影響的文件和必要的附加內(nèi)容。您可以使用“記事本”或任意文本編輯器來(lái)做出這些更改,但在編輯策略文件時(shí),您應(yīng)該使用 Visual Studio 的 XML 設(shè)計(jì)器,充分利用其增強(qiáng)的功能。
文件名 | 更改 | 詳細(xì)信息 |
---|---|---|
MyTemplate.etp | 向 <GLOBALS> 節(jié)添加其他的 GLOBALENTRY 節(jié)點(diǎn)。 | <GLOBALS><GLOBALENTRY> <NAME>TDLFILE</NAME> <VALUE>MyPolicy.tdl</VALUE> </GLOBALENTRY> <GLOBALENTRY> <NAME>TDLELEMENTTYPE</NAME> <VALUE>etpMyTemplate</VALUE> </GLOBALENTRY> |
BackendProjects.etp | 向 <GLOBALS> 節(jié)添加其他的 GLOBALENTRY 節(jié)點(diǎn)。 | <GLOBALS><GLOBALENTRY> <NAME>TDLFILE</NAME> <VALUE>MyPolicy.tdl</VALUE> </GLOBALENTRY> <GLOBALENTRY> <NAME>TDLELEMENTTYPE</NAME> <VALUE>etpBackendProjects</VALUE> </GLOBALENTRY> |
UIProjects.etp | 向 <GLOBALS> 節(jié)添加其他的 GLOBALENTRY 節(jié)點(diǎn)。 | <GLOBALS><GLOBALENTRY> <NAME>TDLFILE</NAME> <VALUE>MyPolicy.tdl</VALUE> </GLOBALENTRY> <GLOBALENTRY> <NAME>TDLELEMENTTYPE</NAME> <VALUE>etpUIProjects</VALUE> </GLOBALENTRY> |
UtilityProjects.etp | 向 <GLOBALS> 節(jié)添加其他的 GLOBALENTRY 節(jié)點(diǎn)。 | <GLOBALS><GLOBALENTRY> <NAME>TDLFILE</NAME> <VALUE>MyPolicy.tdl</VALUE> </GLOBALENTRY> <GLOBALENTRY> <NAME>TDLELEMENTTYPE</NAME> <VALUE>etpUtilityProjects</VALUE> </GLOBALENTRY> |
WebService.csproj | 在 <Files></Files> 節(jié)之后以及結(jié)束 </CSHARP> 標(biāo)記之前,編輯 <UserProperties> 節(jié)。 | </Files><UserProperties TDLFILE = "MyPolicy.TDL" TDLELEMENTTYPE = "WebService" /> |
WinApp.csproj | 在 <Files></Files> 節(jié)之后以及結(jié)束 </CSHARP> 標(biāo)記之前,編輯 <UserProperties> 節(jié)。 | </Files><UserProperties TDLFILE = "MyPolicy.TDL" TDLELEMENTTYPE = "WinApp" /> |
UtilityLibrary.csproj | 在 <Files></Files> 節(jié)之后以及結(jié)束 </CSHARP> 標(biāo)記之前,編輯 <UserProperties> 節(jié)。 | </Files><UserProperties TDLFILE = "MyPolicy.TDL" TDLELEMENTTYPE = "UtilityLibrary" /> |
新模板現(xiàn)在已經(jīng)就位。下一步就是使模板可用于從中創(chuàng)建應(yīng)用程序。您首先需要讓 Visual Studio 了解模板的存在,然后將其圖標(biāo)顯示在“添加新項(xiàng)目”對(duì)話框中,并使用 Visual Studio .NET 附帶的用于企業(yè)級(jí)模板的圖標(biāo)。
使模板可供用戶使用
使模板成為可見(jiàn)的以便它可以為其他項(xiàng)目輕松地發(fā)現(xiàn)和使用,這一點(diǎn)非常重要。通過(guò)創(chuàng)建和編輯較少的文件,您的圖標(biāo)就可成為“添加新項(xiàng)目”對(duì)話框的一部分。
創(chuàng)建 .vsdir 文件
Visual Studio .NET 使用 .vsdir 文件來(lái)標(biāo)識(shí)要顯示在“添加新項(xiàng)目”對(duì)話框中的項(xiàng)目。.vsdir 文件中的每一行指示一個(gè)標(biāo)識(shí)有效的 Visual Studio 項(xiàng)目的文件,包括該文件的相對(duì)路徑。這些項(xiàng)目文件通常使用 .etp 擴(kuò)展名,但它們還可使用其他擴(kuò)展名,例如 .vsz(用于向?qū)В┗?.csproj(用于 Visual C# .NET 項(xiàng)目)。
有關(guān) .vsdir 文件(特別是 ProxyProjects.vsdir)的更多信息,請(qǐng)參見(jiàn) VSDir 文件和使自定義企業(yè)級(jí)模板成為新項(xiàng)目創(chuàng)建過(guò)程的默認(rèn)模板的相應(yīng)部分。
創(chuàng)建 .vsdir 文件
- 在 ..\EnterpriseFrameworks\ProxyProjects 中,創(chuàng)建名為 UserProjects.vsdir 的 ProxyProjectsCSharp.vsdir 的副本。由于 Visual Studio 搜索帶有 .vsdir 文件擴(kuò)展名的所有文件,因此名稱并不重要,但使用便于記憶的名稱將大有幫助。
- 編輯文件(使用“記事本”或任何其他文本編輯器)刪除除第一行之外的所有內(nèi)容,該行如下所示:
..\Projects\CSharp Simple Distributed Application\CSharp Simple Distributed Application.etp|{AE77B8D0-6BDC-11d2-B354-0000F81F0C06}|#5000|2|#5001|{AE77B8D0-6BDC-11d2-B354-0000F81F0C06}|121|0|Project
- 每一字段都使用豎線字符間隔。修改以下字段以匹配在表中指定的新值。
字段名 當(dāng)前值 新值 RelPathName ..\Projects\CSharp Simple Distributed Application\CSharp Simple Distributed Application.etp
..\Projects\MyTemplate\MyTemplate.etp
LocalizedName #5000
MyTemplate
SortPriority 2
0
Description #5001
An example user-created template
SuggestedBaseName Project
MyTemplateProject
.vsdir 文件中的行現(xiàn)在應(yīng)該類似于如下所示:
..\Projects\MyTemplate\MyTemplate.etp|{AE77B8D0-6BDC-11d2-B354-0000F81F0C06}|MyTemplate|0|An example user-created template|{AE77B8D0-6BDC-11d2-B354-0000F81F0C06}|125|0|MyTemplateProject
本行指向 MyTemplate.etp 文件的“新建項(xiàng)目”對(duì)話框,標(biāo)記 MyTemplate 圖標(biāo),為其提供顯示為“用戶創(chuàng)建的模板示例”的說(shuō)明,并為從此模板創(chuàng)建的任意項(xiàng)目分配一個(gè)默認(rèn)名稱。這一默認(rèn)的名稱是 MyTemplateProjectn(n 是 Visual Studio 分配的順序號(hào))。通過(guò)在 SortPriority 中指定 0,您的圖標(biāo)將第一個(gè)出現(xiàn)在可用模板的列表中。數(shù)字較大,其圖標(biāo)越置于列表中的較低位置。
- 保存文件更改并關(guān)閉文件。
測(cè)試到目前為止所做的工作。啟動(dòng) Visual Studio 并創(chuàng)建一個(gè)新項(xiàng)目。如果您遇到錯(cuò)誤或者只是想再次檢查到目前為止所完成的工作,請(qǐng)參見(jiàn)企業(yè)級(jí)模板演練文件組 1。
使用模板創(chuàng)建新項(xiàng)目
- 在“新建項(xiàng)目”對(duì)話框中,選擇位于企業(yè)級(jí)模板項(xiàng)目之下的 MyTemplate,命名 MyTemplate 項(xiàng)目,記錄“位置”中的路徑名,然后單擊“確定”。
隨后在項(xiàng)目創(chuàng)建期間,系統(tǒng)將提示您輸入用于 WebService 項(xiàng)目的 URL 位置。
- 關(guān)閉該解決方案,保存所有更改。
自定義策略文件
如果您是用于您自己的公司或客戶的分布式應(yīng)用程序的結(jié)構(gòu)設(shè)計(jì)者,則可能對(duì)于新的開(kāi)發(fā)人員在您的開(kāi)發(fā)環(huán)境中開(kāi)始編寫代碼和在做出選擇時(shí)所體現(xiàn)的認(rèn)知難度感到無(wú)法樂(lè)觀。演練的這一部分將說(shuō)明如何向開(kāi)發(fā)組以及您的客戶提供明智的指導(dǎo)。通過(guò)在模板中實(shí)現(xiàn)策略,您可以大大降低開(kāi)發(fā)人員在嘗試選擇最恰當(dāng)?shù)目丶葘?duì)象時(shí)所花費(fèi)的時(shí)間。
在 MyTemplate 中完成什么策略
通常,您可以使用策略來(lái)降低使用 MyTemplate 開(kāi)發(fā)分布式應(yīng)用程序的總擁有成本。完成這一目標(biāo)的方法之一是提供指南,使開(kāi)發(fā)人員不必選擇哪些項(xiàng)目類型可以在您所需的結(jié)構(gòu)中使用,而哪些根本就不用考慮。有關(guān)策略的更多概念性信息,請(qǐng)參見(jiàn)使用企業(yè)級(jí)模板創(chuàng)建分布式應(yīng)用程序的優(yōu)點(diǎn)中的相應(yīng)部分。
通過(guò)確定適用于 MyTemplate 的項(xiàng)目類型,您可以提高工作效率,同時(shí)不會(huì)使開(kāi)發(fā)人員失去對(duì)于項(xiàng)目的良好控制感覺(jué)。
將 ELEMENT 節(jié)點(diǎn)添加到策略文件
在可以使用策略為使用 MyTemplate 的開(kāi)發(fā)組提供指南之前,您需要準(zhǔn)備策略文件 (MyPolicy.tdl)。這涉及到向在新項(xiàng)目中標(biāo)識(shí)項(xiàng)目的文件添加 ELEMENT 節(jié)點(diǎn)。
回憶對(duì)集成 TDLELEMENTTYPE 的每一項(xiàng)目 (每一 .etp 和 .csproj 文件)做出的最后更改。每一項(xiàng)目都不相同,原因在于這是您自己的特定實(shí)體,而不是一般的實(shí)體。例如,UtilityLibrary 是類庫(kù)的一個(gè)實(shí)例,該類庫(kù)已被重命名并且是 MyTemplate 中一個(gè)唯一的部分。由于已經(jīng)向每一項(xiàng)目文件添加了必要的標(biāo)識(shí) (TDLELEMENTTYPE),您現(xiàn)在就可以編輯 MyPolicy.tdl 文件并將每一項(xiàng)目標(biāo)識(shí)為 ELEMENT 節(jié)點(diǎn)。
創(chuàng)建標(biāo)識(shí)頂級(jí)節(jié)點(diǎn)的 ELEMENT
- 在 Visual Studio 中,單擊“文件”菜單,然后指向“打開(kāi)”,再單擊“文件”。
在“打開(kāi)文件”對(duì)話框中,定位到“Policy”文件夾 (C:\Program Files\Microsoft Visual Studio .NET 2003\EnterpriseFrameworks\Policy) 并打開(kāi) MyPolicy.tdl。在 Visual Studio 的 XML 設(shè)計(jì)器中打開(kāi)文件可以利用其增強(qiáng)的功能,并且比使用常規(guī)文本編輯器效率更高。
- 在 MyPolicy.tdl 文件的起始處附近,查找 <POLICYMODE> 標(biāo)記,并將屬性從 PERMISSIVE 更改 RESTRICTIVE。
- 您可以移除和 DAP.tdl 文件有關(guān)的不必要的 ELEMENT 定義。搜索以下元素定義,并將每個(gè)定義連同開(kāi)始的 <ELEMENT> 標(biāo)記和結(jié)束的 </ELEMENT> 標(biāo)記之間的內(nèi)容一同刪除:
- etpDistributedApplicationSimple
- etpDistributedApplicationFull
- etpBusinessFacade
- etpBusinessRules
- etpDataAccess
- etpSystem
- etpWebService
- etpWebUI
- etpWinUI
- projBusinessFacade
- projBusinessRules
- projDataAccess
- projSystem
- projWebService
- projWebUI
- projWinUI
- 確定一個(gè)方便的位置,將編輯信息插入到 MyPolicy.tdl 文件中。在文件的起始處是一個(gè) ELEMENT 定義示例。滾動(dòng)到示例的末尾,將以下 TDL 行添加到 MyPolicy.tdl。您可能希望逐個(gè)字符鍵入這些行,但為了簡(jiǎn)化流程,您可以從此文檔復(fù)制這些行,并將其粘貼到 MyPolicy.tdl。粘貼這些行時(shí),使用“編輯”菜單上的“粘貼為 HTML”命令。
注意 在插入點(diǎn)添加注釋很有幫助,在日后可以方便地找到相應(yīng)位置。
<ELEMENT> <ID>
etpMyTemplate
</ID> <IDENTIFIERS> <IDENTIFIER> <TYPE>PROJECT
</TYPE> <IDENTIFIERDATA> <NAME>GLOBAL:TDLELEMENTTYPE
</NAME> <VALUE>etpMyTemplate
</VALUE> </IDENTIFIERDATA> </IDENTIFIER> </IDENTIFIERS> <ELEMENTSET> <DEFAULTACTION>INCLUDE
</DEFAULTACTION> <ORDER>INCLUDEEXCLUDE
</ORDER> </ELEMENTSET> <PROTOTYPES> <PROTOTYPE>[EF]\Projects\MyTemplate\MyTemplate.etp
</PROTOTYPE> </PROTOTYPES> </ELEMENT>注意 粗體項(xiàng)專門應(yīng)用于此 ELEMENT。
這些 TDL 行將指定以下內(nèi)容:
TDL 節(jié)點(diǎn) | 說(shuō)明 |
---|---|
ID | 用于可在策略文件中其他點(diǎn)引用的 ELEMENT 的唯一標(biāo)識(shí)符。 |
TYPE | 指定該元素是項(xiàng)目、項(xiàng)目項(xiàng)、引用、代碼、代碼變量還是 HTML 實(shí)體。指定的 TYPE 確定哪些名稱可以作為策略文件的 IDENTIFIERDATA 節(jié)中名稱/值對(duì)的一部分。 |
IDENTIFIERDATA | 引用在策略文件中標(biāo)識(shí)為 ELEMENT 的特定項(xiàng)目的名稱/值對(duì)。這是用于此 ELEMENT 全局標(biāo)識(shí)符。例如,要查找此 ELEMENT,可以查找包含全局值或名為 TDLELEMENTTYPE 的 UserProperty(值為 etpMyTemplate)的項(xiàng)目。 |
ELEMENTSET | 盡管在此節(jié)點(diǎn)中可以包括更多信息,但 DEFAULTACTION 和 ORDER 只指定了限制用戶將項(xiàng)目類型添加為 MyTemplate 的子節(jié)點(diǎn)所必需的標(biāo)準(zhǔn)。由于 DEFAULTACTION 指定 INCLUDE,而 ORDER 指定 INCLUDEEXCLUDE,此時(shí)沒(méi)有顯示限制。 |
PROTOTYPE | 提供此 ELEMENT 在目錄結(jié)構(gòu)中的相對(duì)位置。 |
這為您必需提供給其余項(xiàng)目的信息提供了一種模式。這些信息創(chuàng)建項(xiàng)目文件和策略文件之間的關(guān)聯(lián)。建立了關(guān)聯(lián)后,可以為使用此模板創(chuàng)建應(yīng)用程序的開(kāi)發(fā)人員提供指南。有關(guān)更多信息,請(qǐng)參見(jiàn) TDL 中的 ELEMENTS 和 ELEMENT 節(jié)點(diǎn)。
創(chuàng)建標(biāo)識(shí)其余企業(yè)級(jí)模板 (.etp) 項(xiàng)目的 ELEMENT 節(jié)點(diǎn)
- 重復(fù)上述過(guò)程,將每一個(gè)剩余的 .etp 項(xiàng)目(BackendProjects、UIProjects 和 UtilityProjects)標(biāo)識(shí)為 MyPolicy.tdl 中的 ELEMENT 節(jié)點(diǎn)。對(duì)這些 .etp 項(xiàng)目使用您在 etpMyTemplate(項(xiàng)目全局)中所用的同類標(biāo)識(shí),然后指向適當(dāng)?shù)脑汀?
<ELEMENT> <ID>etpBackendProjects</ID> <IDENTIFIERS> <IDENTIFIER> <TYPE>PROJECT</TYPE> <IDENTIFIERDATA> <NAME>GLOBAL:TDLELEMENTTYPE</NAME> <VALUE>etpBackendProjects</VALUE> </IDENTIFIERDATA> </IDENTIFIER> </IDENTIFIERS> <ELEMENTSET> <DEFAULTACTION>INCLUDE</DEFAULTACTION> <ORDER>INCLUDEEXCLUDE</ORDER> </ELEMENTSET> <PROTOTYPES> <PROTOTYPE> [EF]\Projects\MyTemplate\BackendProjects\BackendProjects.etp </PROTOTYPE> </PROTOTYPES> </ELEMENT> <ELEMENT> <ID>etpUIProjects</ID> <IDENTIFIERS> <IDENTIFIER> <TYPE>PROJECT</TYPE> <IDENTIFIERDATA> <NAME>GLOBAL:TDLELEMENTTYPE</NAME> <VALUE>etpUIProjects</VALUE> </IDENTIFIERDATA> </IDENTIFIER> </IDENTIFIERS> <ELEMENTSET> <DEFAULTACTION>INCLUDE</DEFAULTACTION> <ORDER>INCLUDEEXCLUDE</ORDER> </ELEMENTSET> <PROTOTYPES> <PROTOTYPE> [EF]\Projects\MyTemplate\UIProjects\UIProjects.etp </PROTOTYPE> </PROTOTYPES> </ELEMENT> <ELEMENT> <ID>etpUtilityProjects</ID> <IDENTIFIERS> <IDENTIFIER> <TYPE>PROJECT</TYPE> <IDENTIFIERDATA> <NAME>GLOBAL:TDLELEMENTTYPE</NAME> <VALUE>etpUtilityProjects</VALUE> </IDENTIFIERDATA> </IDENTIFIER> </IDENTIFIERS> <ELEMENTSET> <DEFAULTACTION>INCLUDE</DEFAULTACTION> <ORDER>INCLUDEEXCLUDE</ORDER> </ELEMENTSET> <PROTOTYPES> <PROTOTYPE> [EF]\Projects\MyTemplate\UtilityProjects\UtilityProjects.etp </PROTOTYPE> </PROTOTYPES> </ELEMENT>
創(chuàng)建標(biāo)識(shí)每個(gè) Visual C# 項(xiàng)目 (.csproj) 的 ELEMENT 節(jié)點(diǎn)
接下來(lái),為三個(gè)語(yǔ)言項(xiàng)目提供 ELEMENT 定義:WebService、WinApp 和 UtilityLibrary。
注意 由于元素名稱在策略文件中必須是唯一的,請(qǐng)從 MyPolicy.tdl 刪除現(xiàn)有的“projWebService”的 ELEMENT 定義(您將要?jiǎng)?chuàng)建自己的 projWebService 元素定義)。
要減少出錯(cuò)的可能性,您可以從此文檔復(fù)制一些行,并將其粘貼到 MyPolicy.tdl,但您也可以復(fù)制并修改現(xiàn)有的 ELEMENT 定義,例如 projBusinessFacade。
注意 粘貼這些行時(shí),請(qǐng)使用“編輯”菜單上的“粘貼為 HTML”。
這三個(gè)語(yǔ)言項(xiàng)目的 ELEMENT 定義應(yīng)該如下所示。
<ELEMENT> <ID>projWebService</ID> <IDENTIFIERS> <IDENTIFIER> <TYPE>PROJECT</TYPE> <IDENTIFIERDATA> <NAME>GLOBAL:TDLELEMENTTYPE</NAME> <VALUE>WebService</VALUE> </IDENTIFIERDATA> </IDENTIFIER> </IDENTIFIERS> <PROTOTYPES> <PROTOTYPE> [EF]\Projects\MyTemplate\BackendProjects\WebService\WebService.csproj </PROTOTYPE> </PROTOTYPES> <ELEMENTSET> <DEFAULTACTION>INCLUDE</DEFAULTACTION> <ORDER>INCLUDEEXCLUDE</ORDER> </ELEMENTSET> </ELEMENT> <ELEMENT> <ID>projWinApp</ID> <IDENTIFIERS> <IDENTIFIER> <TYPE>PROJECT</TYPE> <IDENTIFIERDATA> <NAME>GLOBAL:TDLELEMENTTYPE</NAME> <VALUE>WinApp</VALUE> </IDENTIFIERDATA> </IDENTIFIER> </IDENTIFIERS> <PROTOTYPES> <PROTOTYPE> [EF]\Projects\MyTemplate\UIProjects\WinApp\WinApp.csproj </PROTOTYPE> </PROTOTYPES> <ELEMENTSET> <DEFAULTACTION>INCLUDE</DEFAULTACTION> <ORDER>INCLUDEEXCLUDE</ORDER> </ELEMENTSET> </ELEMENT> <ELEMENT> <ID>projUtilityLibrary</ID> <IDENTIFIERS> <IDENTIFIER> <TYPE>PROJECT</TYPE> <IDENTIFIERDATA> <NAME>GLOBAL:TDLELEMENTTYPE</NAME> <VALUE>UtilityLibrary</VALUE> </IDENTIFIERDATA> </IDENTIFIER> </IDENTIFIERS> <PROTOTYPES> <PROTOTYPE> [EF]\Projects\MyTemplate\UtilityProjects\UtilityLibrary\UtilityLibrary.csproj </PROTOTYPE> </PROTOTYPES> <ELEMENTSET> <DEFAULTACTION>INCLUDE</DEFAULTACTION> <ORDER>INCLUDEEXCLUDE</ORDER> </ELEMENTSET> </ELEMENT>
注意您還在使用同一類型的標(biāo)識(shí)(項(xiàng)目全局)并指向每一用例中的語(yǔ)言項(xiàng)目原型。
繼續(xù)進(jìn)行之前,關(guān)閉并保存 MyPolicy.tdl。
驗(yàn)證 MyPolicy.tdl 的更改
現(xiàn)在可以驗(yàn)證對(duì)于 MyPolicy.tdl 所做的更改是否顯示在 Visual Studio 集成開(kāi)發(fā)環(huán)境 (IDE) 中。請(qǐng)記住,您尚未設(shè)置任何策略,但已將項(xiàng)目標(biāo)識(shí)為 ELEMENT 節(jié)點(diǎn)。驗(yàn)證這些標(biāo)識(shí)后,可以在 MyPolicy.tdl 中進(jìn)行一些調(diào)整,為使用 MyTemplate 的開(kāi)發(fā)組提供實(shí)際的指南。
檢查策略文件的更改結(jié)果
- 轉(zhuǎn)至“文件”菜單,選擇“新建”,然后單擊“項(xiàng)目”。顯示出“新建項(xiàng)目”對(duì)話框。
- 在“項(xiàng)目類型”窗格中,展開(kāi)“其他項(xiàng)目”,然后單擊“企業(yè)級(jí)模板項(xiàng)目”。
- 在“模板”窗格中,選擇“MyTemplate”,接受默認(rèn)的項(xiàng)目名,然后單擊“確定”。如果策略文件中有輸入錯(cuò)誤,則會(huì)在重新加載時(shí)在任務(wù)列表中出現(xiàn)錯(cuò)誤信息。仔細(xì)閱讀錯(cuò)誤信息,然后打開(kāi)策略文件進(jìn)行必要的編輯。解決所有的加載錯(cuò)誤之后,就可以檢查更改的結(jié)果了。
- 在“解決方案資源管理器”中選擇頂級(jí)項(xiàng)目,然后在“屬性”窗口中檢查。
“元素”屬性具有的值與在上述 MyPolicy.tdl 中為 ELEMENT 提供的 ID 相匹配。展開(kāi) Elements 和 Instances 節(jié)點(diǎn)。注意,當(dāng)前選擇與 ELEMENT etpMyTemplate 的標(biāo)識(shí)匹配,使用的標(biāo)識(shí)是 GLOBAL:TDLELEMENTTYPE。在 Instances 部分,所選項(xiàng)是名為 MyTemplateProjectn.etp 的項(xiàng)目,其中 n 是由 Visual Studio 分配給最新的 MyTemplateProject.etp 的順序號(hào)。
- 在解決方案資源管理器中選擇其他每一節(jié)點(diǎn)。注意“元素”字段中的以下內(nèi)容:
解決方案資源管理器所選內(nèi)容 元素值 MyTemplateProjectn etpMyTemplate BackendProjects etpBackendProjects WebService projWebService, projCSharpProject UIProjects etpUIProjects WinApp projWinApp, projCSharpProject UtilityProjects etpUtilityProjects UtilityLibrary projUtilityLibrary, projCSharpProject - 如果選擇語(yǔ)言項(xiàng)目(項(xiàng)目項(xiàng))中的節(jié)點(diǎn),將會(huì)看到 MyPolicy.tdl(從 DAP.tdl 文件復(fù)制并重命名)中的其他定義,這些定義標(biāo)識(shí)每個(gè)文件類型,并將其與適當(dāng) ELEMENT 關(guān)聯(lián),如下所示。
解決方案資源管理器所選內(nèi)容 元素值 WebService\AssemblyInfo.cs projItemCSharpFile WebService\Global.asax ProjItemGlobalApplicationClass WebService\Service1.asmx projItemWebService WebService\Web.Config projItemWebConfigFile WinApp\AssemblyInfo.cs projItemCSharpFile WinApp\Form1.cs projItemCsharpFile, codeWinForm, codeComponent UtilityLibrary\AssemblyInfo.cs projItemCSharpFile UtilityLibrary\Class1.cs projItemCSharpFile 注意 Form1.cs 映射到多個(gè) ELEMENT 節(jié)點(diǎn)。它是一個(gè) Visual C# 文件,并且包含 Windows 窗體。由于 WindowsForm 類是從自定義控件 (Custom Control) 類中派生,因此它也被標(biāo)識(shí)為自定義控件 (Custom Control)。
您現(xiàn)在可以添加一些限制,例如在模板中的各個(gè)位置可以添加哪些內(nèi)容。通過(guò)向 MyPolicy.tdl 中的 ELEMENTSET 定義中添加信息即可完成這一目的。
如果要再次檢查到目前為止所做的工作,請(qǐng)參見(jiàn)企業(yè)級(jí)模板演練文件組 2。
使用 ELEMENTSET 節(jié)點(diǎn)應(yīng)用策略
為確保提供給開(kāi)發(fā)組的模板以最有效的方式優(yōu)化,并且沒(méi)有為開(kāi)發(fā)人員附加執(zhí)行任務(wù)的限制,在此時(shí)進(jìn)行規(guī)劃就愈加體現(xiàn)其重要性了。構(gòu)建一個(gè)類似如下的表,這樣可有助于確定您的策略要建立哪些類型的規(guī)則。
策略規(guī)劃表
ELEMENT | 規(guī)則 |
---|---|
etpMyTemplate | 只允許您此前定義為子級(jí)的企業(yè)級(jí)模板項(xiàng)目(BackendProjects、UIProjects 和 UtilityProjects)。 |
etpBackendProjects | 允許 WebService 項(xiàng)目,以及 C# 類庫(kù)和 C# 空項(xiàng)目項(xiàng)目。您不希望用戶添加標(biāo)準(zhǔn)的 C# ASP.NET Web 服務(wù),原因是最終將因此具有更多的初始代碼。 |
etpUIProjects | 允許 WinApp 項(xiàng)目,以及 C# Windows 應(yīng)用程序和 C# 空項(xiàng)目項(xiàng)目。 |
etpUtilityProjects | 允許 UtilityLibrary 項(xiàng)目,以及 C# 類庫(kù)和空項(xiàng)目項(xiàng)目。 |
projWebService | 您不希望 BackendProjects WebService 項(xiàng)目包含任何 Web UI 項(xiàng),因此在項(xiàng)目中限制這些項(xiàng)。使用預(yù)定義的 CATEGORY 節(jié)點(diǎn)(最初復(fù)制自 DAP.tdl)來(lái)使 MyPolicy.tdl 中的 TDL 更加簡(jiǎn)明易讀。 |
projWinApp | 允許 Windows UI 控件、公共項(xiàng)、Windows UI 代碼項(xiàng)和工具箱組件。同上,使用預(yù)定義的 CATEGORY 節(jié)點(diǎn)(最初復(fù)制自 DAP.tdl)來(lái)使 MyPolicy.tdl 中的 TDL 更加簡(jiǎn)明易讀。 |
projUtilityLibrary | 允許可在 WebService 項(xiàng)目中使用的相同的項(xiàng),以及工具箱數(shù)據(jù)項(xiàng)。 |
模板描述語(yǔ)言使用 ELEMENTSET 作為其主要的機(jī)制之一來(lái)允許項(xiàng)目和項(xiàng)目項(xiàng)供人使用(或限制使用)。結(jié)構(gòu)設(shè)計(jì)者可以進(jìn)行挑選以減少不必要的選項(xiàng)。如上表所示,允許在此特定模板的結(jié)構(gòu)中使用的項(xiàng)目類型已經(jīng)非常明確了,因此您可以默認(rèn)排除所有的項(xiàng)目類型。然后,可以按照名稱包括明確要提供給模板用戶使用的項(xiàng)目類型。有關(guān) ELEMENTSET 節(jié)點(diǎn)的更多信息,請(qǐng)參見(jiàn) TDL 中的 ELEMENTSET 節(jié)點(diǎn)。
更新 etpMyTemplate 的 ELEMENTSET 節(jié)點(diǎn)
要更新 ELEMENT etpMyTemplate 的 ELEMENTSET 定義,可編輯 ELEMENTSET 來(lái)最初排除所有項(xiàng)目類型,方法是將 DEFAULTACTION 設(shè)置為 EXCLUDE。通過(guò)將 ORDER 設(shè)置為 INCLUDEEXCLUDE,包含在 ELEMENTSET 中的 INCLUDE 標(biāo)記中的項(xiàng)目類型將會(huì)得到評(píng)估和批準(zhǔn)。最后,為指定要允許作為子級(jí)的項(xiàng)目,需要在 INCLUDE 節(jié)點(diǎn)中對(duì)其逐個(gè)進(jìn)行標(biāo)識(shí)。
更新 etpMyTemplate 的 ELEMENTSET 節(jié)點(diǎn)
- 在 MyPolicy.tdl 中,定位 etpMyTemplate ELEMENT 的 ELEMENTSET 節(jié)點(diǎn)。
- 修改 ELEMENTSET 定義,將 DEFAULTACTION 設(shè)置為 EXCLUDE,以允許在規(guī)劃表中指定的三個(gè) .etp 項(xiàng)目作為 etpMyTemplate 的子級(jí)。對(duì) ELEMENTSET 節(jié)點(diǎn)的更改應(yīng)與以下內(nèi)容一致。
<ELEMENTSET> <DEFAULTACTION>
EXCLUDE
</DEFAULTACTION> <ORDER>INCLUDEEXCLUDE</ORDER><INCLUDE>etpBackendProjects</INCLUDE>
<INCLUDE>etpUIProjects</INCLUDE>
<INCLUDE>etpUtilityProjects</INCLUDE>
</ELEMENTSET>
更新嵌套在 etpMyTemplate 下的 ELEMENT 節(jié)點(diǎn)的 ELEMENTSET 節(jié)點(diǎn)
通過(guò)編輯屬于 etpMyTemplate 的 ELEMENTSET 節(jié)點(diǎn),策略文件現(xiàn)在已符合上述策略規(guī)劃表的第一行中列出的規(guī)則。現(xiàn)在可以更新已包含在 etpMyTemplate 的子級(jí)中的三個(gè) ELEMENT 節(jié)點(diǎn)的 ELEMENTSET 節(jié)點(diǎn):
- etpBackendProjects
- etpUIProjects
- etpUtilityProjects
更新 ELEMENTSET 節(jié)點(diǎn),通過(guò)默認(rèn)設(shè)置排除所有的項(xiàng)目類型,只允許在規(guī)劃表的相應(yīng)行中指定的項(xiàng)目類型作為這三個(gè) ELEMENT 節(jié)點(diǎn)的子級(jí)。下列過(guò)程提供 TDL 行,這些 TDL 行通過(guò)將 DEFAULTACTION 設(shè)置為 EXCLUDE 并添加適當(dāng)?shù)?INCLUDE 節(jié)點(diǎn)來(lái)進(jìn)行這些更新。
更新三個(gè)剩余 .etp 項(xiàng)目的 ELEMENTSET 節(jié)點(diǎn)
- 使用以下所示內(nèi)容替換現(xiàn)有的 etpBackendProjects ELEMENTSET:
<ELEMENTSET> <DEFAULTACTION>EXCLUDE</DEFAULTACTION> <ORDER>INCLUDEEXCLUDE</ORDER> <INCLUDE>projWebService</INCLUDE> <INCLUDE>projCSharpProject</INCLUDE> <INCLUDE>projCSharpEmptyProject</INCLUDE> </ELEMENTSET>
此 ELEMENTSET 的基本原理和屬于頂級(jí)節(jié)點(diǎn) (etpMyTemplate) 的 ELEMENTSET 的基本原理完全相同。使用 EXCLUDE 作為默認(rèn)設(shè)置可以大大簡(jiǎn)化所要實(shí)施的約束。
- 使用以下所示內(nèi)容替換現(xiàn)有的 etpUIProjects ELEMENTSET:
<ELEMENTSET> <DEFAULTACTION>EXCLUDE</DEFAULTACTION> <ORDER>INCLUDEEXCLUDE</ORDER> <INCLUDE>projWinApp</INCLUDE> <INCLUDE>projCSharpWinApp</INCLUDE> <INCLUDE>projCSharpProject</INCLUDE> <INCLUDE>projCSharpEmptyProject</INCLUDE> </ELEMENTSET>
- 使用以下所示內(nèi)容替換現(xiàn)有 etpUtilityProjects ELEMENTSET:
<ELEMENTSET> <DEFAULTACTION>EXCLUDE</DEFAULTACTION> <ORDER>INCLUDEEXCLUDE</ORDER> <INCLUDE>projUtilityLibrary</INCLUDE> <INCLUDE>projCSharpClassLibrary</INCLUDE> <INCLUDE>projCSharpProject</INCLUDE> <INCLUDE>projCSharpEmptyProject</INCLUDE> </ELEMENTSET>
更新其余的 ELEMENTSET 節(jié)點(diǎn)
其余的 ELEMENT 節(jié)點(diǎn)都是語(yǔ)言項(xiàng)目。盡管模板的結(jié)構(gòu)由企業(yè)級(jí)模板項(xiàng)目(.etp 文件)提供,但實(shí)際的工作是在語(yǔ)言項(xiàng)目中完成的。這些項(xiàng)目的 ELEMENTSET 定義差別較大。當(dāng)開(kāi)發(fā)組成員從模板創(chuàng)建應(yīng)用程序時(shí),必須向他們提供各種控件、工具等等。
可以列出要提供開(kāi)發(fā)組使用的每一項(xiàng),方法是在 ELEMENTSET 中 INCLUDE 標(biāo)記內(nèi)放置每一項(xiàng)的正確名稱,但由于存在如此之多的項(xiàng)目項(xiàng),這將會(huì)花費(fèi)大量的時(shí)間。另外有一種方法,使用您在創(chuàng)建 MyPolicy.tdl 時(shí)所復(fù)制的 DAP.tdl 文件的功能。MyPolicy.tdl 已經(jīng)包含各個(gè) CATEGORY 節(jié)點(diǎn),這些節(jié)點(diǎn)由幾乎可以引用所有所需功能的邏輯組構(gòu)成。通過(guò)在以下步驟中搜索 INCLUDE 節(jié)點(diǎn)中顯示的類別名的文件,您可以找到 CATEGORY 的定義。
更新 ELEMENTSET 節(jié)點(diǎn),按照默認(rèn)設(shè)置排除所有的項(xiàng)目項(xiàng),然后包括所需的類別。下列過(guò)程提供 TDL 行,這些 TDL 行通過(guò)將 DEFAULTACTION 設(shè)置為 EXCLUDE 并添加適當(dāng)?shù)?INCLUDE 節(jié)點(diǎn)來(lái)進(jìn)行這些更新。
更新語(yǔ)言項(xiàng)目的 ELEMENTSET 節(jié)點(diǎn)
- 使用以下所示內(nèi)容替換 projWebService ELEMENTSET:
<ELEMENTSET> <DEFAULTACTION>EXCLUDE</DEFAULTACTION> <ORDER>INCLUDEEXCLUDE</ORDER> <INCLUDE>catVBCommonProjectItems</INCLUDE> <INCLUDE>catCommonProjectItems</INCLUDE> <INCLUDE>catCSCommonProjectItems</INCLUDE> <INCLUDE>catComponentCodeItems</INCLUDE> <INCLUDE>catWebConfigurationProjectItems</INCLUDE> <INCLUDE>projItemWebService</INCLUDE> <INCLUDE>projItemGlobalApplicationClass</INCLUDE> <INCLUDE>codeWebService</INCLUDE> <INCLUDE>refSystem.Web</INCLUDE> <INCLUDE>refSystem.Web.Services</INCLUDE> </ELEMENTSET>
注意 為了在 Visual Studio 任務(wù)列表中避免出現(xiàn)策略提醒,INCLUDE 節(jié)點(diǎn)指定了 ASP.NET Web 服務(wù)項(xiàng)目(Web.config 和全局應(yīng)用程序類項(xiàng))的標(biāo)準(zhǔn)部分。
- 使用以下所示內(nèi)容替換 projWinApp ELEMENTSET:
<ELEMENTSET> <DEFAULTACTION>EXCLUDE</DEFAULTACTION> <ORDER>INCLUDEEXCLUDE</ORDER> <INCLUDE>catVBCommonProjectItems</INCLUDE> <INCLUDE>catWinUIProjectItems</INCLUDE> <INCLUDE>catCommonProjectItems</INCLUDE> <INCLUDE>catCSCommonProjectItems</INCLUDE> <INCLUDE>catWinCodeItems</INCLUDE> <INCLUDE>catDataCodeItems</INCLUDE> <INCLUDE>catComponentCodeItems</INCLUDE> <INCLUDE>refSystem.Windows.Forms</INCLUDE> </ELEMENTSET>
- 使用以下所示內(nèi)容替換 projUtilityLibrary ELEMENTSET:
<ELEMENTSET> <DEFAULTACTION>EXCLUDE</DEFAULTACTION> <ORDER>INCLUDEEXCLUDE</ORDER> <INCLUDE>catVBCommonProjectItems</INCLUDE> <INCLUDE>catCommonProjectItems</INCLUDE> <INCLUDE>catCSCommonProjectItems</INCLUDE> <INCLUDE>catComponentCodeItems</INCLUDE> <INCLUDE>catWebConfigurationProjectItems</INCLUDE> <INCLUDE>projItemWebService</INCLUDE> <INCLUDE>projItemGlobalApplicationClass</INCLUDE> <INCLUDE>codeWebService</INCLUDE> </ELEMENTSET>
將這些更改保存到 MyPolicy.tdl,然后關(guān)閉當(dāng)前項(xiàng)目并重新打開(kāi) MyTemplate 項(xiàng)目。這將允許您輕松檢查可能發(fā)生的鍵入錯(cuò)誤。檢查任務(wù)列表中是否有錯(cuò)誤,如有必要?jiǎng)t進(jìn)行更正。
如果遇到錯(cuò)誤或者只是想復(fù)查您的工作,請(qǐng)參見(jiàn)企業(yè)級(jí)模板演練文件組 3。
檢查策略的效果
您可以查看剛剛應(yīng)用到新模板的策略對(duì)“添加新項(xiàng)目”對(duì)話框有何影響。在對(duì)節(jié)點(diǎn)應(yīng)用策略的前后比較此對(duì)話框的內(nèi)容。
查看策略的效果
- 在“解決方案資源管理器”中,右擊“解決方案”節(jié)點(diǎn),指向“添加”,然后單擊“新建項(xiàng)目”。您將會(huì)在“添加新項(xiàng)目”對(duì)話框中看到可用項(xiàng)目的完整集合。單擊“取消”關(guān)閉對(duì)話框。
- 重復(fù)該過(guò)程,在“解決方案資源管理器”中選擇各個(gè)項(xiàng)目節(jié)點(diǎn),檢查在“添加新項(xiàng)目”對(duì)話框中可用的項(xiàng)目。注意項(xiàng)目集現(xiàn)已受到限制。隨后,在定義 WebService 的構(gòu)造塊時(shí),將看到 WebService 項(xiàng)目可用。
即使已經(jīng)通過(guò)策略表示您允許在開(kāi)發(fā)人員在使用 MyTemplate 時(shí)將新的模板和語(yǔ)言項(xiàng)目添加到所編寫的任意應(yīng)用程序中,但 Visual Studio IDE 仍然無(wú)法意識(shí)到這些項(xiàng)目的存在。盡管您可以在解決方案資源管理器中看到這些項(xiàng)的圖形表示,但對(duì)于要添加到現(xiàn)有應(yīng)用程序的構(gòu)造塊來(lái)說(shuō),您需要對(duì) .vsdir 文件做一些更改并添加一些內(nèi)容。