VS.NET 2003 創(chuàng)建新的企業(yè)級(jí)模板

2010-08-28 10:49:18來(lái)源:西部e網(wǎng)作者:

在本演練中,您將創(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

  1. 在 Windows 2000 中,單擊“開(kāi)始”,單擊“設(shè)置”,然后單擊“控制面板”。(在 Windows XP 和 Windows Server 2003 中,有多種打開(kāi)“控制面板”的方式,如通過(guò)“我的電腦”或直接從“開(kāi)始”菜單打開(kāi)。)
  2. 在“控制面板”中找到“添加/刪除程序”圖標(biāo)(這在 Windows XP 和 Windows Server 2003 中稱為“添加或刪除程序”),雙擊它以顯示“添加/刪除程序”對(duì)話框。
  3. 在對(duì)話框的左側(cè),單擊“添加/刪除 Windows 組件”。
  4. 在“添加/刪除 Windows 組件”對(duì)話框中,查找“Internet 信息服務(wù)”。如果選定了該框,則表示已經(jīng)安裝了 IIS,您可以跳過(guò)第 5 步和第 6 步。如果沒(méi)有選定,請(qǐng)選擇它。
  5. 單擊“下一步”開(kāi)始安裝過(guò)程。
  6. 安裝完成之后,單擊“完成”,關(guān)閉向?qū)А?

在 Windows 資源管理器中顯示隱藏文件、文件夾和文件擴(kuò)展名

在 Windows 資源管理器中編輯文件時(shí),如果文件和文件夾已隱藏或文件擴(kuò)展名不可見(jiàn),有時(shí)很難找到正確的項(xiàng)。驗(yàn)證在 Windows 資源管理器中的設(shè)置,必要時(shí)可對(duì)其進(jìn)行更改。

顯示隱藏文件、文件夾和文件擴(kuò)展名

  1. 轉(zhuǎn)到 Windows 資源管理器的“工具”菜單并單擊“文件夾選項(xiàng)”,然后單擊“查看”。
  2. 找到“隱藏文件和文件夾”,然后選擇“顯示隱藏文件和文件夾”。
  3. 找到“隱藏已知文件類型的擴(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)

  1. 啟動(dòng) Visual Studio。
  2. 在“文件”菜單上指向“新建”,然后單擊“項(xiàng)目”。
    顯示出“新建項(xiàng)目”對(duì)話框。
  3. 在“項(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)目。
  4. 使用 MyTemplate 替換默認(rèn)的項(xiàng)目名。
  5. 記錄“位置”中的路徑名。在后面的步驟中,將把該項(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)目

  1. 在解決方案資源管理器中選擇 MyTemplate
  2. 在“文件”菜單上指向“添加項(xiàng)目”,然后單擊“新建項(xiàng)目”。
    出現(xiàn)“添加新項(xiàng)目”對(duì)話框。
  3. 選擇“企業(yè)級(jí)模板項(xiàng)目”,然后在“模板”窗格中選擇“企業(yè)級(jí)模板項(xiàng)目”。
  4. 將項(xiàng)目名更改為 BackendProjects,然后單擊“確定”。
    解決方案資源管理器中出現(xiàn) BackendProjects 項(xiàng)目。
  5. 重復(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)目

  1. 在解決方案資源管理器中選擇 BackendProjects。
  2. 在“文件”菜單上指向“添加項(xiàng)目”,然后單擊“新建項(xiàng)目”。
    出現(xiàn)“添加新項(xiàng)目”對(duì)話框。
  3. 在“項(xiàng)目類型”窗格中選擇“Visual C# 項(xiàng)目”。
  4. 在“模板”窗格中選擇“ASP.NET Web 服務(wù)”。
  5. 在“位置”框中,接受或指定有效的 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)目

  1. 在解決方案資源管理器中選擇 UIProjects
  2. 在“文件”菜單上指向“添加項(xiàng)目”,然后單擊“新建項(xiàng)目”。出現(xiàn)“添加新項(xiàng)目”對(duì)話框。
  3. 在“項(xiàng)目類型”窗格中選擇“Visual C# 項(xiàng)目”。
  4. 在“模板”窗格中,選擇“Windows 應(yīng)用程序”。將名稱更改為 WinApp,然后單擊“確定”。
    WinApp 項(xiàng)目將出現(xiàn)在解決方案資源管理器中。

創(chuàng)建 C# 類庫(kù)語(yǔ)言項(xiàng)目

  1. 在“解決方案資源管理器”中選擇 UtilityProjects
  2. 在“文件”菜單上指向“添加項(xiàng)目”,然后單擊“新建項(xiàng)目”。出現(xiàn)“添加新項(xiàng)目”對(duì)話框。
  3. 在“項(xiàng)目類型”窗格中選擇“Visual C# 項(xiàng)目”。
  4. 在“模板”窗格中,選擇“類庫(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)

  1. 如果“屬性”窗口尚不可見(jiàn),請(qǐng)?jiān)诮鉀Q方案資源管理器中選擇“MyTemplate”節(jié)點(diǎn)(不是解決方案“MyTemplate”),右擊并選擇“屬性”。
  2. 在“屬性”窗口中,在網(wǎng)格的左列中找到“策略文件”。單擊“策略文件”字段右側(cè)的空白字段,該字段中將顯示省略號(hào)按鈕 (...)。
  3. 單擊該省略號(hào)按鈕打開(kāi)“選擇一個(gè) TDL 文件”對(duì)話框。
  4. 在此對(duì)話框中,選擇 DAP.tdl 文件并按 Ctrl+C 復(fù)制它。
  5. Ctrl-V 粘貼該文件的副本,該文件副本便與其他 .tdl 文件一起顯示出來(lái)。
  6. 右擊剛創(chuàng)建的副本并將其重命名為 MyPolicy.tdl。
  7. 選擇 MyPolicy.tdl 并單擊“打開(kāi)”,將 MyPolicy.tdl 與當(dāng)前應(yīng)用程序關(guān)聯(lián)。
  8. 在系統(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

組織文件夾和文件

  1. 查找您在 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 
  2. 將整個(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)建。

  3. 找到 Web 根,以便確定 WebService 項(xiàng)目文件創(chuàng)建的位置。如果安裝到默認(rèn)位置,項(xiàng)目將處于以下位置:
    C:\Inetpub\wwwroot\WebService 
  4. 將 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)始本演練之前

移除不必要的文件夾和文件

  1. 在 MyTemplate 的 .etp 項(xiàng)目(BackendProjects、UIProjects 和 UtilityProjects)中,子文件夾可能包含 bin 或 obj 子文件夾。您可以選擇移除這些文件夾,以及移除 BackendProjects、UIProjects 和 UtilityProjects 文件夾中的任意 *.eto 文件。盡管這些文件夾并非必要,但它們的出現(xiàn)不會(huì)妨礙項(xiàng)目的功能。
  2. 在名為 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>

</GLOBALS>

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>

</GLOBALS>

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>

</GLOBALS>

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>

</GLOBALS>

WebService.csproj 在 <Files></Files> 節(jié)之后以及結(jié)束 </CSHARP> 標(biāo)記之前,編輯 <UserProperties> 節(jié)。
    </Files>
    <UserProperties
        TDLFILE = "MyPolicy.TDL"
        TDLELEMENTTYPE = "WebService"
    />

</CSHARP>

WinApp.csproj 在 <Files></Files> 節(jié)之后以及結(jié)束 </CSHARP> 標(biāo)記之前,編輯 <UserProperties> 節(jié)。
    </Files>
    <UserProperties
        TDLFILE = "MyPolicy.TDL"
        TDLELEMENTTYPE = "WinApp"
    />

</CSHARP>

UtilityLibrary.csproj 在 <Files></Files> 節(jié)之后以及結(jié)束 </CSHARP> 標(biāo)記之前,編輯 <UserProperties> 節(jié)。
    </Files>
    <UserProperties
        TDLFILE = "MyPolicy.TDL"
        TDLELEMENTTYPE = "UtilityLibrary"
    />

</CSHARP>

新模板現(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 文件

  1. 在 ..\EnterpriseFrameworks\ProxyProjects 中,創(chuàng)建名為 UserProjects.vsdir 的 ProxyProjectsCSharp.vsdir 的副本。由于 Visual Studio 搜索帶有 .vsdir 文件擴(kuò)展名的所有文件,因此名稱并不重要,但使用便于記憶的名稱將大有幫助。
  2. 編輯文件(使用“記事本”或任何其他文本編輯器)刪除除第一行之外的所有內(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
  3. 每一字段都使用豎線字符間隔。修改以下字段以匹配在表中指定的新值。
    字段名 當(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)的名稱是 MyTemplateProjectnn 是 Visual Studio 分配的順序號(hào))。通過(guò)在 SortPriority 中指定 0,您的圖標(biāo)將第一個(gè)出現(xiàn)在可用模板的列表中。數(shù)字較大,其圖標(biāo)越置于列表中的較低位置。

  4. 保存文件更改并關(guān)閉文件。

測(cè)試到目前為止所做的工作。啟動(dòng) Visual Studio 并創(chuàng)建一個(gè)新項(xiàng)目。如果您遇到錯(cuò)誤或者只是想再次檢查到目前為止所完成的工作,請(qǐng)參見(jiàn)企業(yè)級(jí)模板演練文件組 1

使用模板創(chuàng)建新項(xiàng)目

  1. 在“新建項(xiàng)目”對(duì)話框中,選擇位于企業(yè)級(jí)模板項(xiàng)目之下的 MyTemplate,命名 MyTemplate 項(xiàng)目,記錄“位置”中的路徑名,然后單擊“確定”。

    隨后在項(xiàng)目創(chuàng)建期間,系統(tǒng)將提示您輸入用于 WebService 項(xiàng)目的 URL 位置。

  2. 關(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

  1. 在 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ī)文本編輯器效率更高。

  2. 在 MyPolicy.tdl 文件的起始處附近,查找 <POLICYMODE> 標(biāo)記,并將屬性從 PERMISSIVE 更改 RESTRICTIVE。
  3. 您可以移除和 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
  4. 確定一個(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é)果

  1. 轉(zhuǎn)至“文件”菜單,選擇“新建”,然后單擊“項(xiàng)目”。顯示出“新建項(xiàng)目”對(duì)話框。
  2. 在“項(xiàng)目類型”窗格中,展開(kāi)“其他項(xiàng)目”,然后單擊“企業(yè)級(jí)模板項(xiàng)目”。
  3. 在“模板”窗格中,選擇“MyTemplate”,接受默認(rèn)的項(xiàng)目名,然后單擊“確定”。如果策略文件中有輸入錯(cuò)誤,則會(huì)在重新加載時(shí)在任務(wù)列表中出現(xiàn)錯(cuò)誤信息。仔細(xì)閱讀錯(cuò)誤信息,然后打開(kāi)策略文件進(jìn)行必要的編輯。解決所有的加載錯(cuò)誤之后,就可以檢查更改的結(jié)果了。
  4. 在“解決方案資源管理器”中選擇頂級(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)。

  5. 在解決方案資源管理器中選擇其他每一節(jié)點(diǎn)。注意“元素”字段中的以下內(nèi)容:
    解決方案資源管理器所選內(nèi)容 元素值
    MyTemplateProjectn etpMyTemplate
    BackendProjects etpBackendProjects
    WebService projWebService, projCSharpProject
    UIProjects etpUIProjects
    WinApp projWinApp, projCSharpProject
    UtilityProjects etpUtilityProjects
    UtilityLibrary projUtilityLibrary, projCSharpProject
  6. 如果選擇語(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)

  1. 在 MyPolicy.tdl 中,定位 etpMyTemplate ELEMENT 的 ELEMENTSET 節(jié)點(diǎn)。
  2. 修改 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)

  1. 使用以下所示內(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í)施的約束。

  2. 使用以下所示內(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>
  3. 使用以下所示內(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)

  1. 使用以下所示內(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)部分。
  2. 使用以下所示內(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>
  3. 使用以下所示內(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)容。

查看策略的效果

  1. 在“解決方案資源管理器”中,右擊“解決方案”節(jié)點(diǎn),指向“添加”,然后單擊“新建項(xiàng)目”。您將會(huì)在“添加新項(xiàng)目”對(duì)話框中看到可用項(xiàng)目的完整集合。單擊“取消”關(guān)閉對(duì)話框。
  2. 重復(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)容。

關(guān)鍵詞:VS.NET

贊助商鏈接: