为开发小组创建可重用的项目和项模板

添加人:iyond六级(3292分)   添加时间:2007-03-29    阅读次数:1898  收藏此教程

经过几年与客户一起构建基于 Microsoft® .NET Framework 的应用程序的实践后,我经常听到对 Visual Studio® .NET 的普遍功能需求:“如果我们能够创建自己的项目类型和项类型,以便组织内的所有开发人员都可以访问它们,那该多好啊。”许多组织希望为项目(如 Web 站点)或项目中的项(如默认 Web 页或窗体)创建共享模板。Visual Studio 2005 引入了一个新模型,用于为项目和项定义模板和初学者工具包,从而不仅使这个愿望成为可能,而且相对简单。我还将讨论如何使用、创建和自定义这些模板。

在过去,虽然用户能够创建项目或项模板,但需要具备神秘的文本文件格式、JavaScript 文件和文件夹命名约定等许多内部知识,以及一点“魔法”才能完成。通过新模型,用户可以为要包括在模板中的项创建一个简单的 ZIP 文件,以及创建一个描述模板及其内容的 XML 元数据文件。这个新模型支持创建项模板,如 Web 页、C# 或 Visual Basic® 代码文件,或者配置文件。它还支持单项目模板(如 Web 站点、类库或智能客户端应用程序)以及多项目解决方案。实际上,大多数用于在 Visual Studio 2005 中创建新解决方案的内置项目和项模板都基于这个相同的模板机制。

使用现有模板


了解这些模板的工作方式的最简单方法是,首先查看如何使用已经创建的模板。在 Visual Studio 2005 中,您可以配置搜索模板的位置,这些位置可以使用任何通用命名约定 (UNC) 路径。在 Options 对话框的 Projects and Solutions 设置节点下,您可以配置特定于用户的搜索项目或项模板的位置(参见图 1)。这些设置的默认值指向 My Documents 文件夹中的模板文件夹。默认情况下,Visual Studio 2005 附带的模板位于 Visual Studio 安装目录下,并包括在项目安装对话框中。


图 1 模板位置选项


通过将包含适当元数据文件的 ZIP 文件放到用户配置的模板位置中,新的项目或项模板将出现在各自的对话框中。本文随附的示例代码包括示例项目项和项目模板,您可以将它们复制到这些目录中进行测试。添加 ZIP 文件之后,启动 Visual Studio 2005,选择 File | New | Project,然后您将注意到新的项目模板已经包括在对话框的 My Templates 部分下(参见图 2)。选择该项目模板将新建一个项目,该项目包含 ZIP 文件中包含的所有项。


图 2 模板出现在 New Project 对话框中


能够以这种方式使用模板可以获得几个好处。首先,由于用户位置是可配置的,开发组可以在为该组部署模板的公共服务器上定义文件共享。组内的所有开发人员都可以配置他们的环境,以便为模板维护该文件共享。当新模板部署到服务器(通过将 ZIP 文件复制到共享)后,所有开发人员可以立即从 Visual Studio 中访问该模板。初始部署后,对模板的更改可以在一个地方完成,而不必将其部署到每个开发人员的工作站。

此外,由于模板是作为真正的模板使用,因此它保持不变并且可以重复用于创建新项目。这是对旧式的“复制和粘贴”方法的一个巨大改进,在旧式方法中,一个开发人员创建文件或项目之后,还要将它传递给另一个开发人员。如果没有精心管理,原始模板很快就会丢失或者被修改,并且无法回到已知的正确配置。由于项目和项模板位置是独立配置的,组织可以选择只集中项目模板,并且允许开发人员创建自己的项模板。

除模板外,Visual Studio 2005 还包括一个初学者工具包概念。初学者工具包通过社区站点提供了大量的示例用法,您可以从社区站点下载模板。在 New Project 对话框中,其中一个选项是 Search Online Templates。选择该选项允许您通过关键字在线搜索初学者工具包。找到一个初学者工具包后,您可以选择下载并将其安装到适当的目录中,以便随后可以将它用作模板来添加项或项目。顾名思义,初学者工具包通常用作学习工具或示例,以帮助传递知识或者为较大的项目提供起点。

 

创建模板


使用模板是一个很好的起点,但大多数开发人员希望了解如何创建自己的模板。Visual Studio 2005 使得在 IDE 中正确创建自己的模板非常容易。一旦创建了模板,您就可以扩展并更改它们。

最易于创建的模板类型是项模板。为此,只需打开包括要用作模板的文件的项目,然后选择 File | Export Template 运行如图 3 所示的 Export Template Wizard 即可。


图 3 导出项模板


该向导将提示您指明要导出的项,以及要包括的任何程序集引用。添加引用可让您确保添加项时模板所依赖的程序集包括在项目中。例如,如果项模板使用 System.Data.SqlXml 程序集来访问 SQL Server® XML 功能,则在添加模板时,确保该程序集被项目引用非常重要。向导中可供选择的引用包括:用于当前项目类型的默认程序集引用,以及在运行向导之前添加到当前项目中的任何引用。

除程序集引用之外,导出向导还是智能的 — 足可以导出要导出的项所需的资源文件。例如,如果一个 ASP.NET Web 页是要导出的项,则该页的 C# 或 Visual Basic 代码隐藏文件和资源文件也会被导出,并且在使用该模板创建新项时,也会将它们包括在内。该向导还会编辑这些文件以便为类名和命名空间添加占位符,这样,在将它们添加到新项目时,它们可以使用不同的名称并显示在正确的代码命名空间中。例如,在您添加模板时,并不是有一个始终名为 BusinessObjectClass 的类,而是用户可以为新的代码文件指定名称,该名称将用作模板中的类名。

在为项模板选择参数(包括名称、描述以及在显示模板时使用的图标)时,您可以选择安装该模板。在导出模板时,它会在您的 My Documents\Visual Studio 2005\My Exported Templates 文件夹中创建。默认情况下,该文件夹中的模板不包括在 New Item 或 New Project 对话框中。为了使模板可用,必须安装 — 将其复制到模板的已配置目录中。选中复选框以安装模板仅仅意味着,除了导出的模板文件夹之外,还需要将 ZIP 文件复制到为模板配置的文件夹中。

不安装模板使您可以直接编辑元数据,或者在将模板安装到适当的文件夹中之前,将其他文件添加到 ZIP 文件中。例如,如果您创建了一个母版页模板以便在 Web 站点中使用,则可能希望包括一个 CSS 文件(该文件包括母版页上使用的样式),以确保在选择该母版页模板时,所使用的样式也包括在内。在本例中,您此时还不希望安装该模板,直到有机会将样式表文件添加到 ZIP 文件中,然后更新元数据文件以便在安装模板时包括该样式表。在本文后面,我将讨论自定义模板所需的步骤。

创建项目模板的工作方式与不需要程序集引用的异常的工作方式大致相同,因为它们是从当前的项目配置推断出来的。项目模板和项模板之间的主要区别是,项目模板提供创建新项目的方法,而项模板只能添加到现有项目中。然而,在运行向导时,这两个模板类型都允许将多个项添加到一个项目中。

 

自定义模板


正如您看到的那样,在 Visual Studio 2005 中创建项目或项模板变得极其简单。但是,与许多向导一样,创建的默认模板可能不是您恰好需要的模板。幸运的是,由于模板的设计涉及到一个 ZIP 文件和元数据文件,因此在创建后用新功能扩展模板并不困难。

模板元数据文件是一个 XML 文件,它描述模板并指明要与项目或项一起包含的文件和资源。图 4 显示一个通过使用向导导出项模板而创建的示例元数据文件。

首先要注意该元数据的一般结构,它包括一个 VSTemplate 根节点和两个子节点:TemplateData 和 TemplateContent。VSTemplate 节点仅充当其他两项的包装,并指明模板的类型。由于文件中的 XML 命名空间声明,根据模板文件的架构,在 Visual Studio 2005 中编辑此文件的任何开发人员都将自动获得所允许项的智能感知® 支持。

TemplateData 元素包含的信息用于为 New Project 或 New Item 对话框中的模板提供详细信息。正如您期待的那样,名称、描述和图标元素都在对话框中直接显示。DefaultName 元素用作为新项或新项目提供的默认名称的根。ProjectType 元素指明可以包括项的项目的类型,并且影响对话框中的位置。图 4中显示的示例将导致该项模板仅能用于 C# Web 项目。

图 5 显示其他一些可以用在元数据文件的 TemplateData 部分中的可选元素,以及曾经提到过的项的选项。

TemplateContent 元素是您为项模板定义文件和引用的地方。TemplateContent 元素引用项或项目随附的任何程序集,通常不需要编辑,因为您可以在导出向导中指定这些程序集。

ZIP 文件中要包含在项目中的每一项在调出时都带有一个 ProjectItem 元素。除了标识源文件之外,ProjectItem 元素的属性还允许您指明项是否包含子类型、文件中的参数是否应该替换,以及目标文件名是否与源文件名不同。子类型属性可以包含 Form 或 Component 之类的值,这些值可以暗示 Visual Studio 当设计器开启时,如何在正确的设计器中显示项。

替换参数允许 New Item 向导动态创建命名空间、类名和类似的项,因此模板并不是完全静态的。如果没有为该属性指定 true,则模板文件将完全以 ZIP 文件中的方式出现在新项目中。

TargetFileName 属性允许您为文件名指定一个常量或参数化值,以显示在新项目中。这允许您重用模板文件在同一个项目中创建项的多个实例。例如,一个类文件可以通过不同的 TargetFileName 属性添加到同一个项目中两次。在添加项时,将根据相同的模板文件在项目中添加两个新类。在模板中允许这种类型的重用使得管理创建模板时所涉及的文件容易得多。

在创建项目模板时,其过程与用于创建项模板的过程非常类似,但在元数据文件中略有差异。首先,由于这是一个项目,因此所有 ProjectItem 元素都包括在 Project 元素下,该元素指明项目文件名以及在命名项目文件时是否应该替换参数。图 6 显示了一个简化的项目模板文件。

请注意,除了标识项目信息的 Project 元素之外,该示例还使用 Folder 元素来指出 ZIP 文件包含了一个含有所指出的项目项的文件夹。在使用模板时,该文件夹将包括在项目结构中。项目模板还为 TemplateData 部分提供了其他选项,以影响用户与 New Project 对话框的交互。图 7 显示了这些项。

Web 项目的配置方式略有不同,因为它们使用其他向导创建项目。Web 项目使用 Web 作为项目类型,使用语言作为 ProjectSubType,而不是使用一种语言作为项目类型(如 Visual Basic),然后使用另一种语言作为 ProjectSubType(如 Windows)。

 

多个项目的模板


除了能够为单个项目配置模板,创建一个完整的解决方案作为模板或起始点通常很有用。例如,开发小组可能不会只需要单个 Web 项目作为新 Web 解决方案的起始点,因为他们可能希望包括业务对象和数据访问项目。一种解决方案是,为每个项目创建一个模板,并允许开发人员单独添加所需的每个项目。然而,另一种能够提供更强一致性、更简单的方法是,为整个解决方案创建一个模板,并为开发人员提供开始所需的所有项目。

多项目模板仍然只涉及一个 ZIP 文件,但它们包含一个主元数据文件,以及针对解决方案中的每个项目的单独元数据文件。项目元数据文件与前面讨论的没有什么区别,但解决方案模板文件现在通过 TemplateData 元素及其子元素为向导提供模板数据,并通过 TemplateContent 元素及其子元素提供指向其他项目元数据文件的指针。图 8 中的简化示例显示一个包括以下三个项目的解决方案元数据文件:Web 站点、业务逻辑层和数据访问层。


图 9 解决方案文件夹


请注意,模板的类型是 ProjectGroup,模板内容只是一组指向其他项目模板的链接。您可以为项目指定一个友好的名称,这就是它们在解决方案资源管理器中的命名方式。其他项目的路径基于 ZIP 文件中项的文件夹结构。图 8中的示例模板元数据所使用的 ZIP 文件与图 9 类似。解决方案中的每个项目都有自己的文件夹和 vstemplate 元数据文件,并且示例中的链接根据 ZIP 文件中的文件夹结构提供项目模板文件的相对路径。

 

提供指南


除了提供模板之外,提供有关如何使用模板的指南或额外信息通常也很有帮助。一种方法是提供良好注释的模板代码文件,但是这要求用户深入模板代码来了解如何使用它。Visual Studio 2005 模板提供了一个更好的机制,它不仅提供用户需要的文档,还确保在模板中添加某个项或项目之后可以用文档描述这些模板。

在项目模板和项模板中,ProjectItem 元素可以应用几个属性,以允许对用户显示项。OpenInEditor 的布尔属性允许项目中的项根据它的文件类型在默认的编辑器中打开。例如,项目中包括的一个 OpenInEditor 设置为 true 的 XML 文件将在 XML 编辑器中打开。OpenInWebBrowser 属性允许文本或 HTML 文件在 Web 浏览器窗口中打开。这是随模板发布帮助或指南的一个简单方法。只需创建一个提供指南的 HTML 文件,并将其包含在模板中即可。用户只要使用您的模板就可以查看您的帮助文件,因此您可以确保他们在安装后拥有正确使用模板文件所需的信息。

除了能在浏览器或编辑器窗口中打开文件之外,在您打开多个项时,还可以控制项的显示顺序。您应该在 ProjectItem 元素上使用 OpenOrder 属性,以便控制项在 Visual Studio 中的显示顺序。为 OpenOrder 提供的数值越低,优先级就越高,项的显示位置就越靠前。

 

参数替换


目前为止,在许多示例中,参数替换用于允许动态创建项和项目的名称和命名空间。参数替换涉及到在元数据文件或随附的源文件中使用占位符,以指明特定参数值应插入的位置。当您从模板创建新的项或项目时,Visual Studio 会为占位符插入实际值。您可以使用几个内置参数;还可以添加要传递给向导的自己的参数进行替换。

要发生参数替换,必须在 Project 元素或 ProjectItem 元素上将 ReplaceParameters 属性设置为 true。参数替换主要在两个位置上使用。当向导处理项目文件和随附的项时,对于 ReplaceParameters 设置为 true 的每一项,向导都会搜索值字典,以查看它是否包含与文件中的参数相匹配的已知键。匹配的参数将由存储的值替换。图 10 显示可用于元数据文件和源文件的内置参数。

自定义参数也可以添加到模板中,并且随后也可以用在项模板和元数据文件中。要添加自定义参数,在元数据文件的 TemplateContent 元素内添加一个 CustomParameters 部分。对于要添加的每个参数,可以指定一个带有名称和值的 CustomParameter 元素(参见图 11)。为了在源文件中使用相同的命名约定,因此在该文件中使用 $parametername$ 语法命名值。

 

扩展向导


如果所有可扩展性和参数替换均无法满足您的需要,并且您确实需要编写一些代码来提供模板所需的动态数据,则可以编写一个向导扩展并在模板元数据中配置它。例如,您在这种情况中可能需要这种扩展:在一个模板中有多个项,并且需要能够在运行时包括或排除其中一些项。通过向导扩展,您可以通过自己的代码来扩展标准的 New Project 或 New Item 向导,并决定要包括或排除哪些项,以及是否在项目文件中添加动态自定义参数进行替换。

为了创建自己的向导扩展,您需要用所选的托管语言创建一个 .NET 库项目,并添加对 Microsoft.VisualStudio.TemplateWizardInterface.dll 的引用和 EnvDTE.dll 程序集。在库项目中创建一个类,并实现 Microsoft.VisualStudio.TemplateWizardInterface.IWizard 接口。以下代码列出 IWizard 接口成员:

public interface IWizard
{
    void BeforeOpeningFile(EnvDTE.ProjectItem projectItem) ;
    void ProjectFinishedGenerating(EnvDTE.Project project);    
    void ProjectItemFinishedGenerating(EnvDTE.ProjectItem projectItem);
    void RunFinished();
    void RunStarted(object automationObject, 
        Dictionary replacementsDictionary,
        WizardRunKind runKind, 
        object[] customParameters);
    bool ShouldAddProjectItem(string filePath);
}

前三个方法为已经添加和可能打开的项提供了对 IDE 可扩展性模型的访问。RunFinished 和 RunStarted 方法提供了运行初始化和清理代码的手段。RunStarted 是一个公共方法,它可以提供实现并编写设置 ShouldAddProjectItem 方法所使用的标志的逻辑;这些标志将确定是否应该将模板中的某一项添加到项目中。

为了配置扩展,您必须在模板元数据文件中修改 VSTemplate 元素,以添加一个为自定义向导扩展定义程序集信息的 WizardExtension 元素。图 12 中的简化模板文件显示该配置的工作方式。当向导运行时,系统将加载向导扩展,并在适当时候调用它的方法以增加向导处理。

 

小结


Visual Studio 2005 极大地改进了模板功能,通过这些功能,您可以轻松创建可重用的动态模板,以便为项目和项目中的项提供健壮的起始点。使用简单的 ZIP 文件和 XML 元数据文件可以直接自定义模板。此外,Visual Studio 中的导出功能使得启动模板就像打开一个现有项目那么简单。可下载的示例中提供了本文所讨论的项的几个简单图解以供使用。有关向模板元文件添加自定义的其他详细信息,请参阅 MSDN® Library 中的“Visual Studio Template Schema Reference”。

1页 第1上一页1下一页
相关的教程: 模板 Microsoft Visual Studio2005 IDE
收藏此教程

当前平均分: 2.0(1 次打分)

-5-4-3-2-1012345
评论主题
您的大名
您的评论
验证码 点击换一个验证码
知识库搜索: