创建新的企业级模板
在本演练中,您将创建用于创建分布式应用程序(包含后端项目、用户界面项目和实用程序库)的企业级模板。本演练适用于要了解企业级模板项目原型如何简化开发分布式应用程序流程的用户,尤其适用于要开发其自己的模板来自定义 Visual Studio 集成开发环境 (IDE) 以用于自己的项目和开发组的结构设计者。
本演练包含下列部分:
开始本演练之前
在实际开始本演练之前,了解以下各点包含的建议将对您有所帮助。
打印演练
打印本演练以简化其使用。当使用单个计算机读取并执行指令时,这样做尤其有用。您将键入或复制并粘贴大量 XML,而最简单的方法是打开并打印本演练。使本演练保持打开,但使用硬拷贝遵循这些指导。如果需要复制并粘贴 XML 块,请切换到本演练,查找并复制所需的行,然后使用“编辑”菜单上的“粘贴为 HTML”进行粘贴。
查看本主题的另一种方法是在 Visual Studio 集成开发环境 (IDE) 之外显示“帮助”。从“工具”菜单中选择“选项”。从“环境”文件夹中选择“帮助”,然后选择“帮助设置”页上的“外部帮助”。请注意,仅当重新启动集成开发环境 (IDE) 后,在“设置”页上所做的更改才会生效。
确认或安装 Internet 信息服务 (IIS)
作为本演练的组成部分,您将创建一个 XML Web services。相关说明假定您所使用的开发计算机在安装 Windows 2000 或 Windows XP 的同时安装了 IIS。尽管 IIS 并非绝对必要,但是演练中某些步骤提供了基于此组件的指南。如果无法确定是否已安装此组件,则应花点时间来进行确认。
在计算机上验证和/或安装 IIS
- 在 Windows 2000 中,单击“开始”,单击“设置”,然后单击“控制面板”。(在 Windows XP 和 Windows Server 2003 中,有多种打开“控制面板”的方式,如通过“我的电脑”或直接从“开始”菜单打开。)
- 在“控制面板”中找到“添加/删除程序”图标(这在 Windows XP 和 Windows Server 2003 中称为“添加或删除程序”),双击它以显示“添加/删除程序”对话框。
- 在对话框的左侧,单击“添加/删除 Windows 组件”。
- 在“添加/删除 Windows 组件”对话框中,查找“Internet 信息服务”。如果选定了该框,则表示已经安装了 IIS,您可以跳过第 5 步和第 6 步。如果没有选定,请选择它。
- 单击“下一步”开始安装过程。
- 安装完成之后,单击“完成”,关闭向导。
在 Windows 资源管理器中显示隐藏文件、文件夹和文件扩展名
在 Windows 资源管理器中编辑文件时,如果文件和文件夹已隐藏或文件扩展名不可见,有时很难找到正确的项。验证在 Windows 资源管理器中的设置,必要时可对其进行更改。
本演练中的模板结构
在本演练中创建的分布式应用程序的结构将随后转化为模板,该模板由围绕后端、用户界面和实用程序库生成的结构组成。创建所需工作之后,模板就可以完全起作用了。
本演练只提供使用自定义企业级模板可以为创建分布式应用程序的开发组提供哪些服务或功能的示例。但应该切记的是,对于模板和分布式应用程序,提供的选项并不局限于在本演练中的相同选项。灵活性是企业级模板概念的重要组成部分。
规划企业级模板
本演练可以分成若干个逻辑部分,每一部分又包含几个步骤。
- 规划模板的结构并命名架构。
- 创建要保存为企业级模板的应用程序结构。
- 创建策略文件并使之与应用程序结构关联。
- 将应用程序结构和策略文件转换为企业级模板。
- 使模板可在“新建项目”对话框中供用户使用。
- 自定义模板以扩展其用途。
注意 本演练使用的名称是随意采用的,但它们都符合 DAP.tdl 文件中使用的约定。有关命名约定的更多信息,请参见企业级模板中的命名约定。
在上表中未包括一个可选逻辑部分(在第四个和第五个逻辑部分之间),即,将自定义项目向导连接到模板以生成自定义的项目文件。有关更多信息,请参见演练:使用子项目向导创建模板。
规划模板的初始应用程序结构
创建用于分布式应用程序的企业级模板的过程分为两个阶段:设计满足项目需要的应用程序结构;然后在 Visual Studio IDE 中创建该结构。即使您完全更改了自己的模板的目的和实现,也应该可以利用在此显示的结构中的概念。
模板部件的结构生成和命名
预先确定用于企业级模板中的每一对象和项目的名称非常重要。本例中,根项目为 MyTemplate。在应用程序中的其他地方不小心使用其他名称(例如 etpMyProj、etpMyProject 或 MyProj)是比较常见的错误来源。显而易见,您可以选择任意名称,但考虑使用 MyTemplate 可以增强本演练的说明效果并减少混淆。
企业级模板允许您使用两种常规项目类型:企业级模板项目(.etp 文件扩展名)和语言项目(本例为 C#)。Visual Studio 将 .etp 文件扩展名追加到每一企业级模板项目的名称之后,并提供默认的目录结构和许多企业级模板项目所必需的一组文件。以下显示了在每一企业级模板项目上的 .etp 文件扩展名和在每一 C# 语言项目上的 .csproj 文件扩展名:
MyTemplate.etp
BackendProjects.etp
WebService.csproj
UIProjects.etp
WinApp.csproj
UtilityProjects.etp
UtilityLibrary.csproj
创建这一用于模板的初始应用程序结构有多种方式。第一种方式是使用静态原型。这是最简单的过程,在本演练中用于提供对于所涉及的问题的基本了解。其他方式使用子项目向导,并提供更多的灵活性。有关更多信息,请参见演练:使用子项目向导创建模板。
创建初始原型
创建模板进程中涉及到的初始部件与创建分布式应用程序相同。在创建结构并将策略文件关联到解决方案之后,您可以编辑某些文件,并将结构优化为模板,作为将来应用程序的基础。
创建初始应用程序结构
- 启动 Visual Studio。
- 在“文件”菜单上指向“新建”,然后单击“项目”。
显示出“新建项目”对话框。 - 在“项目类型”窗格中展开“其他项目”文件夹,并选择“企业级模板项目”文件夹。“模板”窗格显示若干图标。选择“企业级模板项目”。避免双击它,以便在创建项目前可以分配自定义名称。
注意 不要在左窗格中展开“企业级模板项目”文件夹并选择其中的一个子文件夹。那些文件夹包含用作构造块而不是整个模板的语言项目。
- 使用 MyTemplate 替换默认的项目名。
- 记录“位置”中的路径名。在后面的步骤中,将把该项目复制到另一个位置。单击“确定”。MyTemplate 项目现在将出现在解决方案资源管理器中。
通过添加嵌套的 .etp 项目继续创建此模板的结构。
创建嵌套的企业级模板 (.etp) 项目
- 在解决方案资源管理器中选择 MyTemplate。
- 在“文件”菜单上指向“添加项目”,然后单击“新建项目”。
出现“添加新项目”对话框。 - 选择“企业级模板项目”,然后在“模板”窗格中选择“企业级模板项目”。
- 将项目名更改为 BackendProjects,然后单击“确定”。
解决方案资源管理器中出现 BackendProjects 项目。 - 重复该过程两次,第一次将名称更改为“UIProjects”,第二次将名称更改为“UtilityProjects”。
现在即拥有了用于分布式应用程序的模板的基本结构。
创建语言项目
现在所拥有的是大量的结构,而没有什么显而易见的功能。此模板的编程功能由基于 C# 语言的三个项目提供。这些语言项目和已经创建的企业级模板项目之间最明显的差异在于:文件扩展名和在解决方案资源管理器中与其关联的标志符号。
由于您正在创建由创建分布式应用程序的开发组所要使用的模板,因此结构将会非常复杂,这也正体现了此类项目的特性。企业级模板项目 (.etp projects) 提供了实现更加复杂的结构的方法。
- 在解决方案资源管理器中选择 BackendProjects。
- 在“文件”菜单上指向“添加项目”,然后单击“新建项目”。
出现“添加新项目”对话框。 - 在“项目类型”窗格中选择“Visual C# 项目”。
- 在“模板”窗格中选择“ASP.NET Web 服务”。
- 在“位置”框中,接受或指定有效的 URL 并指定名称 WebService。单击“确定”。
WebService 项目将出现在解决方案资源管理器中。注意 正如本演练开始所示的,您应该已在计算机上安装了 Microsoft Internet 信息服务 (IIS)。如果 IIS 安装正确,系统将自动在“位置”旁边显示 http://localhost。如果在单击“确定”后出现了错误,则检查 IIS 的安装。有关安装 IIS 的更多信息,请参见 开始本演练之前。
创建 C# Windows 应用程序语言项目
- 在解决方案资源管理器中选择 UIProjects。
- 在“文件”菜单上指向“添加项目”,然后单击“新建项目”。出现“添加新项目”对话框。
- 在“项目类型”窗格中选择“Visual C# 项目”。
- 在“模板”窗格中,选择“Windows 应用程序”。将名称更改为 WinApp,然后单击“确定”。
WinApp 项目将出现在解决方案资源管理器中。
创建 C# 类库语言项目
- 在“解决方案资源管理器”中选择 UtilityProjects。
- 在“文件”菜单上指向“添加项目”,然后单击“新建项目”。出现“添加新项目”对话框。
- 在“项目类型”窗格中选择“Visual C# 项目”。
- 在“模板”窗格中,选择“类库”。将名称更改为 UtilityLibrary,然后单击“确定”。
UtilityLibrary 项目将出现在解决方案资源管理器中。
这些原型项目用作实际应用程序的基础,您(结构设计者)可以指定应用程序的设置,例如 DefaultHTMLPageLayout 或 StartupObject。您还可以指定生成配置设置,例如 WarningLevel 或 TreatWarningsAsErrors。指定这些设置的优点是它们允许开发组使用正确的默认设置开始工作。
将策略与初始应用程序结构关联
在将此应用程序结构转换成模板之前,需要将策略文件与其关联。可从头创建策略文件,在文档中对此已作了详细介绍。有关策略文件的更多信息,请参见企业级模板策略概述。然而,在多数情况下,将策略文件与应用程序关联的最迅速且最不容易出错的方法是仅重命名 DAP.tdl 文件的一个副本,并根据需要对其进行自定义。在本演练中,可采用一个简便方法,即克隆 DAP.tdl 文件,重命名该副本,然后根据需要修改它。
将策略文件与项目关联
- 如果“属性”窗口尚不可见,请在解决方案资源管理器中选择“MyTemplate”节点(不是解决方案“MyTemplate”),右击并选择“属性”。
- 在“属性”窗口中,在网格的左列中找到“策略文件”。单击“策略文件”字段右侧的空白字段,该字段中将显示省略号按钮 (...)。
- 单击该省略号按钮打开“选择一个 TDL 文件”对话框。
- 在此对话框中,选择 DAP.tdl 文件并按 Ctrl+C 复制它。
- 按 Ctrl-V 粘贴该文件的副本,该文件副本便与其他 .tdl 文件一起显示出来。
- 右击刚创建的副本并将其重命名为 MyPolicy.tdl。
- 选择 MyPolicy.tdl 并单击“打开”,将 MyPolicy.tdl 与当前应用程序关联。
- 在系统提示重新打开项目时,单击“是”。
在“属性”窗口中,当在解决方案资源管理器中选择“MyTemplate”时,“策略文件”右侧的字段现在显示 MyPolicy.tdl。
到此时,您已创建了初始应用程序结构,该结构可以转换并另存为模板,您自己的分布式应用程序项目可基于该模板。
尽管下一节进入将应用程序转换成模板的过程,但在进入这部分过程前仍然可以向原型项目添加其他代码、控件等。您在此演练中无需这样做。
将初始实现转换为模板
对于大多数项目类型,将结构(例如在本演练中开发的这一结构)转换为模板是相当简单的。但 Web 项目(包括 Asp.NET Web 服务项目)要比其他项目类型更加复杂一点。
关闭解决方案,保存所有更改,然后在继续以下步骤之前退出 Visual Studio,以避免文件共享问题。在以下步骤中,将所创建的文件和文件夹从其当前位置复制到另一个地方,那里可以更好地反映新模板后面的逻辑。
- 在 Windows 2000 中,右击“开始”,然后单击“浏览”。如果您执行的是 Windows 2000 和 Visual Studio .NET 的默认安装,则可以在 Windows 资源管理器的目录结构中,在 .../Program Files/Microsoft Visual Studio .NET 2003/EnterpriseFrameworks 之下找到“EnterpriseFrameworks”文件夹。如果在安装 Windows 2000 和 Visual Studio .NET 时没有接受默认设置,则单击 Windows 资源管理器中的“搜索”按钮,在本地驱动器上搜索“EnterpriseFrameworks”。
EnterpriseFrameworks 文件夹包含若干子文件夹,以下步骤只重点介绍其中的三个:Policy、Projects 和 ProxyProjects。
- 查找您在 Visual Studio 中创建的初始应用程序结构的位置。MyTemplate 的默认安装点应如下所示:
C:/Documents and Settings/UserName/My Documents/Visual Studio Projects/MyTemplate
- 将整个 MyTemplate 文件夹复制到以下文件夹:
C:/Program Files/Microsoft Visual Studio .NET 2003/EnterpriseFrameworks/Projects
这将复制与 MyTemplate 关联的除 WebService 项目之外的所有文件,该项目已在其他位置创建。
- 找到 Web 根,以便确定 WebService 项目文件创建的位置。如果安装到默认位置,项目将处于以下位置:
C:/Inetpub/wwwroot/WebService
- 将 WebService 文件夹复制到位于以下位置的 BackendProjects 文件夹中:
C:/Program Files/Microsoft Visual Studio .NET 2003/EnterpriseFrameworks/Projects/MyTemplate/BackendProjects
清理项目结构
与分布式应用程序不同,模板(如您正在创建的模板)并不使用显示在项目目录结构中的所有文件和文件夹。当开发小组从模板中创建分布式应用程序时,将为特定应用程序再次创建这些文件夹和文件。因此,应移除这些文件夹和文件以避免以后发生混淆。
注意 如果尚未检查本演练开始部分提及的 Windows 资源管理器设置,则在继续操作之前请先行检查,确保 Windows 资源管理器显示所有文件、文件夹和文件扩展名。有关详细信息,请参见 开始本演练之前。
- 在 MyTemplate 的 .etp 项目(BackendProjects、UIProjects 和 UtilityProjects)中,子文件夹可能包含 bin 或 obj 子文件夹。您可以选择移除这些文件夹,以及移除 BackendProjects、UIProjects 和 UtilityProjects 文件夹中的任意 *.eto 文件。尽管这些文件夹并非必要,但它们的出现不会妨碍项目的功能。
- 在名为 MyTemplate 的文件夹中,删除 *.eto、*.sln 和 *.suo 文件。同样,这是一个可选步骤,这些文件并非必要,但也没有坏处。
编辑 .etp 项目文件
需要在下列文件中进行一些少量的编辑。
- .../EnterpriseFrameworks/Projects/MyTemplate/MyTemplate.etp
- .../EnterpriseFrameworks/Projects/MyTemplate/BackendProjects/BackendProjects.etp
- .../EnterpriseFrameworks/Projects/MyTemplate/UIProjects/UIProjects.etp
- .../EnterpriseFrameworks/Projects/MyTemplate/UtilityProjects/UtilityProjects.etp
移除项目 ID
- 所有这四个 .etp 项目文件都包含一个必须移除的行。该行在 MyTemplate.etp 中出现三次,但在其余三个文件中只分别出现一次。在“记事本”或任何文本编辑器中打开每一个 .etp 文件,然后删除包含以下信息的行:
<GUIDPROJECTID>{4CB5C3A7-3FBC-4B47-ADEB-F19768CB91C3}</GUIDPROJECTID>
注意 <GUIDPROJECTID> 的值在各个 .etp 项目文件中都不相同,此处显示的只是一个示例。
除了上述所做更改之外,Web 相关的项目还需要其他修改,将 Web 项目指向驻留在您自己的项目目录结构中的副本,而不是单一的活动实例。此外,还有必要提供信息,通知企业级模板项目文件在项目初始化时提示需要 URL。
- 返回到 BackendProjects.etp 文件,并在“记事本”中打开它。以下显示了部分现有文本,其后显示为粗体的是做出更改的文本:
<Views> <ProjectExplorer> <File>http://MachineName/WebService/WebService.csproj</File> </ProjectExplorer> </Views> <References> <Reference> <FILE>http://MachineName/WebService/WebService.csproj</FILE> </Reference> </References>
<Views> <ProjectExplorer> </ProjectExplorer> </Views> <References> <Reference> </Reference> </References> <File>WebService/WebService.csproj</File> <FILE>WebService/WebService.csproj</FILE> <REQUIRESURL>1</REQUIRESURL>
向项目文件添加 UserProperty 或项目全局值
下一步是为项目文件准备信息,这些信息使策略文件 MyPolicy.tdl 能够将它们识别为 ELEMENT 节点。要完成这一任务,需要向每一项目文件的 GLOBALS 部分添加 UserProperty(在语言项目中)或项目全局值(在 .etp 项目),如下所示。
下表列出了受影响的文件和必要的附加内容。您可以使用“记事本”或任意文本编辑器来做出这些更改,但在编辑策略文件时,您应该使用 Visual Studio 的 XML 设计器,充分利用其增强的功能。
文件名 | 更改 | 详细信息 |
---|---|---|
MyTemplate.etp | 向 <GLOBALS> 节添加其他的 GLOBALENTRY 节点。 | <GLOBALS><GLOBALENTRY> <NAME>TDLFILE</NAME> <VALUE>MyPolicy.tdl</VALUE> </GLOBALENTRY> <GLOBALENTRY> <NAME>TDLELEMENTTYPE</NAME> <VALUE>etpMyTemplate</VALUE> </GLOBALENTRY> |
BackendProjects.etp | 向 <GLOBALS> 节添加其他的 GLOBALENTRY 节点。 | <GLOBALS><GLOBALENTRY> <NAME>TDLFILE</NAME> <VALUE>MyPolicy.tdl</VALUE> </GLOBALENTRY> <GLOBALENTRY> <NAME>TDLELEMENTTYPE</NAME> <VALUE>etpBackendProjects</VALUE> </GLOBALENTRY> |
UIProjects.etp | 向 <GLOBALS> 节添加其他的 GLOBALENTRY 节点。 | <GLOBALS><GLOBALENTRY> <NAME>TDLFILE</NAME> <VALUE>MyPolicy.tdl</VALUE> </GLOBALENTRY> <GLOBALENTRY> <NAME>TDLELEMENTTYPE</NAME> <VALUE>etpUIProjects</VALUE> </GLOBALENTRY> |
UtilityProjects.etp | 向 <GLOBALS> 节添加其他的 GLOBALENTRY 节点。 | <GLOBALS><GLOBALENTRY> <NAME>TDLFILE</NAME> <VALUE>MyPolicy.tdl</VALUE> </GLOBALENTRY> <GLOBALENTRY> <NAME>TDLELEMENTTYPE</NAME> <VALUE>etpUtilityProjects</VALUE> </GLOBALENTRY> |
WebService.csproj | 在 <Files></Files> 节之后以及结束 </CSHARP> 标记之前,编辑 <UserProperties> 节。 | </Files><UserProperties TDLFILE = "MyPolicy.TDL" TDLELEMENTTYPE = "WebService" /> |
WinApp.csproj | 在 <Files></Files> 节之后以及结束 </CSHARP> 标记之前,编辑 <UserProperties> 节。 | </Files><UserProperties TDLFILE = "MyPolicy.TDL" TDLELEMENTTYPE = "WinApp" /> |
UtilityLibrary.csproj | 在 <Files></Files> 节之后以及结束 </CSHARP> 标记之前,编辑 <UserProperties> 节。 | </Files><UserProperties TDLFILE = "MyPolicy.TDL" TDLELEMENTTYPE = "UtilityLibrary" /> |
字段名 | 当前值 | 新值 |
---|---|---|
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 |
TDL 节点 | 说明 |
---|---|
ID | 用于可在策略文件中其他点引用的 ELEMENT 的唯一标识符。 |
TYPE | 指定该元素是项目、项目项、引用、代码、代码变量还是 HTML 实体。指定的 TYPE 确定哪些名称可以作为策略文件的 IDENTIFIERDATA 节中名称/值对的一部分。 |
IDENTIFIERDATA | 引用在策略文件中标识为 ELEMENT 的特定项目的名称/值对。这是用于此 ELEMENT 全局标识符。例如,要查找此 ELEMENT,可以查找包含全局值或名为 TDLELEMENTTYPE 的 UserProperty(值为 etpMyTemplate)的项目。 |
ELEMENTSET | 尽管在此节点中可以包括更多信息,但 DEFAULTACTION 和 ORDER 只指定了限制用户将项目类型添加为 MyTemplate 的子节点所必需的标准。由于 DEFAULTACTION 指定 INCLUDE,而 ORDER 指定 INCLUDEEXCLUDE,此时没有显示限制。 |
PROTOTYPE | 提供此 ELEMENT 在目录结构中的相对位置。 |
解决方案资源管理器所选内容 | 元素值 |
---|---|
MyTemplateProjectn | etpMyTemplate |
BackendProjects | etpBackendProjects |
WebService | projWebService,projCSharpProject |
UIProjects | etpUIProjects |
WinApp | projWinApp,projCSharpProject |
UtilityProjects | etpUtilityProjects |
UtilityLibrary | projUtilityLibrary,projCSharpProject |
解决方案资源管理器所选内容 | 元素值 |
---|---|
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 |
ELEMENT | 规则 |
---|---|
etpMyTemplate | 只允许您此前定义为子级的企业级模板项目(BackendProjects、UIProjects 和 UtilityProjects)。 |
etpBackendProjects | 允许 WebService 项目,以及 C# 类库和 C# 空项目项目。您不希望用户添加标准的 C# Asp.NET Web 服务,原因是最终将因此具有更多的初始代码。 |
etpUIProjects | 允许 WinApp 项目,以及 C# Windows 应用程序和 C# 空项目项目。 |
etpUtilityProjects | 允许 UtilityLibrary 项目,以及 C# 类库和空项目项目。 |
projWebService | 您不希望 BackendProjects WebService 项目包含任何 Web UI 项,因此在项目中限制这些项。使用预定义的 CATEGORY 节点(最初复制自 DAP.tdl)来使 MyPolicy.tdl 中的 TDL 更加简明易读。 |
projWinApp | 允许 Windows UI 控件、公共项、Windows UI 代码项和工具箱组件。同上,使用预定义的 CATEGORY 节点(最初复制自 DAP.tdl)来使 MyPolicy.tdl 中的 TDL 更加简明易读。 |
projUtilityLibrary | 允许可在 WebService 项目中使用的相同的项,以及工具箱数据项。 |