层关系图:指南
在 Visual Studio 旗舰版中,使用层关系图可以从高层面描述应用程序结构,以及验证代码是否与此高层面设计相符。 若要确保代码与设计保持一致,您可以将层验证作为生成过程的一部分包括在内。
层关系图类似于传统的体系结构示意图,标识了设计的主要组件或功能单元及其相互依赖关系。 关系图上的每个节点称为一层,表示由命名空间、项目或其他项组成的一个逻辑组。 可以绘制设计中应存在的依赖项。 与传统的体系结构示意图不同的是,在层关系图中,您可以验证源代码中的实际依赖关系与您已指定的计划依赖关系是否相符。 通过使验证成为在 Team Foundation Server 上进行的定期生成过程的一部分,您可以确保程序代码在将来系统体系结构更改时能继续符合该体系结构。
有关层关系图上的元素及其属性的信息,请参见层关系图:参考。
如何使用层关系图设计或更新应用程序
下面的步骤概述如何在开发过程中使用层关系图。 本主题后面的部分将对每一步骤进行详细介绍。 如果您正在开发新设计,请忽略引用现有代码的步骤。
提示
这些步骤的显示顺序大致就是执行顺序。 您可能希望重叠执行任务或重新排列步骤顺序以符合自己的情况,以及在每个项目迭代开始时重新执行这些步骤。
为整个应用程序或其内部的某个层创建层关系图。
定义层以表示应用程序的主功能区域或组件。 根据层功能命名这些层,例如“演示”或“服务”。 如果您具有一个 Visual Studio 解决方案,则可以将每个层与一个项目集合(如项目、命名空间、文件等)相关联。
在各层之间发现现有依赖项。
编辑层和依赖项以显示您希望代码反映的更新的设计。
通过创建表示主体体系结构块或组件的层,以及定义显示各个层如何利用其他层的依赖项设计应用程序的新区域。
编辑关系图的布局和外观以帮助您与同事进行讨论。
对照层关系图验证代码以突出显示代码与您需要的体系结构之间的冲突。
更新代码使其符合新体系结构。 以迭代方式开发和重构代码,直到此验证不再显示任何冲突。
在生成过程中包含层验证以确保代码将持续符合您的设计。
创建层关系图
层关系图必须在建模项目内部创建。 可以将新的层关系图添加到现有建模项目中,也可以在解决方案中为新层关系图创建新的建模。
向建模项目中添加新层关系图
在**“体系结构”菜单上,单击“新建关系图”**。
在**“模板”下单击“层关系图”**。
命名该关系图
在**“添加到建模项目”**中,浏览到解决方案中的一个现有建模项目,并选择该项目。
- 或 -
单击**“新建建模项目”**,向解决方案中添加一个新建模项目。
提示
层关系图必须存在于建模项目内。 不过,您可以将其链接到存在于解决方案中任何位置的项目。
您还可以在相同的建模项目内复制现有的层关系图。
提示
不要将现有层关系图从一个建模项目添加、拖动或复制到另一个建模项目或解决方案中的其他位置。 一个以这种方式复制的层关系图将具有与原始关系图相同的引用,即使您修改该关系图也是如此。 这将阻止层验证正常操作,并可能导致出现其他问题,如尝试打开该关系图时元素缺失或出现其他错误。
若要复制层关系图,请按下面的步骤操作:
复制现有层关系图
向建模项目中添加一个新的层关系图。
将源层关系图中的元素复制到新层关系图。
定义表示功能区域或组件的层
层表示项目的逻辑组,如项目、代码文件、命名空间、类和方法。 可以从 Visual Studio 解决方案中的项目创建层,也可以通过链接诸如 Word 文件或 PowerPoint 演示文稿这样的文档将规范或计划附加到层。 每个层都显示为关系图上的一个矩形,并显示链接到该层的项目数。 层可以包含描述更详细任务的嵌套层。
一般原则是,根据层功能命名层,例如“演示”或“服务”。 应将依赖关系紧密的项目放在同一层上。 应将可以分别更新或在不同的应用程序中使用的项目放在不同的层中。 若要了解有关分层模式的信息,请访问“Patterns & Practices”(模式和实践)网站,网址为 https://go.microsoft.com/fwlink/?LinkId=145794。
提示
有一些您可链接到层但不支持对照层关系图进行验证的项目类型。 若要确定项目是否支持验证,请打开“层资源管理器”以检查项目链接的“支持验证”属性。 有关更多信息,请参见管理层和项目之间的链接。
在更新不熟悉的应用程序时,您可以使用依赖项关系图来帮助浏览和理解代码。 这些关系图可帮助您发现代码中的群集和依赖关系。 您还可以使用体系结构资源管理器来浏览命名空间和类,它们通常与现有层具有很好的对应关系。 这有助于使您能够更轻松地为层分配项目。 然后,您可以使用层关系图帮助您更新代码。
有关更多信息,请参见下列主题:
使用以下任务来创建层:
若要 |
执行这些步骤 |
---|---|
为单个项目创建一个层 |
|
为所有选择的项目创建单个层 |
同时将所有选定项目拖到关系图上。 层显示在关系图上,并链接到整组项目。 |
为每个所选的项目创建一个层 |
按住 Shift 键的同时将所有项目同时拖到层关系图上。
注意
如果使用 Shift 键选择一系列项,请在选择了项目之后松开该键。将这些项目拖到关系图上时再次按住该键。
每个项目的层显示在关系图上,并链接到该项目。 |
向层中添加项目 |
将项目拖到层上。 |
创建新的未链接的层 |
在“工具箱”中,展开“层关系图”部分,然后将“层”拖到层关系图上。 若要添加多个层,请双击该工具。 完成操作后,单击“指针”工具或按 Esc 键。 - 或 - 右击层关系图,指向“添加”,然后单击“层”。 例如,可以执行此操作来表示尚未开始开发的应用程序的一部分。 在早期阶段为此类层创建占位符代码时,此做法非常有用。 |
创建嵌套的层 |
将现有层拖到另一个层上。 - 或 - 右击某个层,指向“添加”,然后单击“层”。 |
创建包含两个或更多现有层的新层 |
选择层,右击所选的层,然后单击“组”。 |
更改层的颜色 |
将其“Color”属性设置为所需的颜色。 |
指定与层关联的项目不能依赖于指定的命名空间 |
在层的“Forbidden Namespace Dependencies”属性中键入命名空间。 使用分号 (;) 分隔多个命名空间。 |
指定与层关联的项目必须不属于指定的命名空间 |
在层的“Forbidden Namespaces”属性中键入命名空间。 使用分号 (;) 分隔多个命名空间。 |
指定与层关联的项目必须属于某个指定的命名空间 |
在层的“Required Namespaces”属性中键入命名空间。 使用分号 (;) 分隔多个命名空间。 |
管理层和项目之间的链接
在层关系图上,右击一个层,然后单击**“查看链接”**。
**“层资源管理器”**将显示链接到所选层的项目。 若要查看链接到关系图上层的所有项目,请单击关系图。
使用以下任务管理这些链接:
若要
在层资源管理器中
删除层与项目之间的链接
右击项目链接,再单击“删除”。
将链接从一个层移到另一个层
将项目链接拖到关系图上的一个现有层。
- 或 -
右击项目链接,然后单击“剪切”。
在层关系图上,右击层,然后单击“粘贴”。
将链接从一个层复制到另一个层
右击项目链接,然后单击“复制”。
在层关系图上,右击层,然后单击“粘贴”。
基于现有项目链接创建一个新层
将项目链接拖到关系图上的空白区域。
验证链接的项目是否支持对照层关系图的验证。
查看项目链接的“支持验证”列。
不支持对照层关系图进行验证的项目包括 C++ 项目、网站、Office 文档和纯文本文件。 可以将此类项目链接到层,但验证过程将会忽略它们。 如果引用的项目或程序集链接到单独的层,而且这些层之间没有依赖关系出现,则将不会出现验证错误。 除非代码使用此类引用,否则这些引用不被视为依赖项。
发现各层之间的现有依赖项
只要与一个层关联的项目引用与另一个层关联的项目,就存在依赖关系。 例如,一个层中的某个类声明了一个拥有其他层中的某个类的变量。 通过反向工程处理可以发现现有的依赖关系。
提示
无法为某些种类的项目对依赖关系进行反向工程处理。 例如,对于链接到文本文件的层,将不会对源自或指向该层的依赖关系进行反向工程处理。 若要查看哪些项目具有可进行反向工程处理的依赖关系,请右击一个或多个层,然后单击“查看链接”。 在“层资源管理器”中,检查“支持验证”列。 对于此列显示“False”的项目,将不会对依赖关系进行反向工程处理。
对层之间的现有依赖关系进行反向工程处理
- 选择一个或多个层,右击所选的层,然后单击**“生成依赖项”**。
通常,您会看到一些不应存在的依赖关系。 可以编辑这些依赖关系,使它们与预期的设计对齐。
编辑层和依赖关系以显示计划的设计
若要描述您计划对系统进行的更改,您可以编辑关系图以反映更新的设计。 您也许还会考虑进行一些重构更改,以改进代码的结构,然后再扩展代码。 有关更多信息,请参见改进代码的结构。
若要 |
执行这些步骤 |
---|---|
删除不应存在的依赖项 |
单击依赖项,然后按“Delete”。 |
更改或限制依赖项的方向 |
设置其“方向”属性。 |
创建新的依赖项 |
使用“依赖项”和“双向依赖项”工具。 若要绘制多个依赖关系,请双击该工具。 完成操作后,单击“指针”工具或按 Esc 键。 |
指定与层关联的项目不能依赖于指定的命名空间 |
在层的“Forbidden Namespace Dependencies”属性中键入命名空间。 使用分号 (;) 分隔多个命名空间。 |
指定与层关联的项目必须不属于指定的命名空间 |
在层的“Forbidden Namespaces”属性中键入命名空间。 使用分号 (;) 分隔多个命名空间。 |
指定与层关联的项目必须属于某个指定的命名空间 |
在层的“Required Namespaces”属性中键入命名空间。 使用分号 (;) 分隔多个命名空间。 |
改进代码的结构
重构更改就是一些改进,它们不会影响应用程序的行为,但有助于使代码在将来能更方便地进行更改和扩展。 结构良好的代码具有很容易抽象化为一个层关系图的设计。
举例来说,如果您为代码中的每个命名空间创建一个层,然后对依赖关系进行反向工程处理,那么各层之间应存在单向依赖项的最小集。 如果您将类或方法用作层,创建更详细的关系图,那么结果也应具备相同的特性。
如果不是这样,则代码在其生命周期中将难以更改,并且不太适合使用层关系图进行验证。
设计应用程序的新区域
开始新项目的开发或新项目中的崭新领域时,您可以在开始开发代码之前绘制层和依赖项以帮助标识主要组件。
如有可能,在您的层关系图中显示可识别的体系结构模式。 例如,描述桌面应用程序的层关系图可能包括演示、域逻辑和数据存储区等层。 介绍应用程序中单个功能的层关系图可能包括模型、视图和控制器等层。 有关此类模式的更多信息,请参见 Patterns & Practices: Application Architecture。
如果您需要频繁地创建类似模式,请创建一个自定义工具。 有关更多信息,请参见如何:定义自定义建模工具箱项。
为每个层创建代码项目,例如命名空间、类或组件。 这样,您将能更轻松地理解代码并将代码项目链接到层。 创建每个项目后,将其链接到相应的层。
您不必将大多数类和其他项目链接到层,因为它们归属于您已链接到层的较大的项目,如命名空间。
为新功能创建新关系图。 通常,需要使用一个或多个层关系图来描述整个应用程序。 如果您正在设计应用程序中的新功能,则不要对现有关系图进行增补或更改, 可以创建您自己的反映新的代码部分的关系图。 新关系图中的层可能包括针对新功能的演示、域逻辑和数据库层。
构建应用程序时,系统将基于整体关系图和您的更详细的功能关系图对您的代码进行验证。
编辑演示和讨论的布局
若要帮助标识层和依赖关系或与团队成员讨论这些层和依赖关系,请通过以下方式编辑关系图的外观和布局:
更改层的大小、形状和位置。
更改层和依赖项的颜色。
- 选择一个或多个层或依赖项,右击,再单击**“属性”。 在“属性”窗口中,编辑“颜色”**属性。
基于关系图验证代码
编辑关系图之后,您可以对照代码随时手动验证关系图,也可以在每次运行本地生成时进行自动验证。 您还可以在每次使用 Team Foundation Server 进行生成时自动运行验证。
有关更多信息,请参见:
在生成过程中包括层验证
手动添加程序集或项目以进行验证
在**“解决方案资源管理器”中,右击建模项目或“层引用”文件夹,然后单击“添加引用”**。
在**“添加引用”对话框中,选择所需程序集或项目,然后单击“确定”**。
基于打开的层关系图手动验证代码
右击关系图图面,再单击**“验证体系结构”**。
提示
默认情况下,层关系图 (.layerdiagram) 文件的“生成操作”属性设置为“验证”,以便在验证过程中包括关系图。
**“错误列表”**窗口会报告发生的任何错误。 有关验证错误的更多信息,请参见了解层验证错误。
若要查看每个错误的根源,请在**“错误列表”**窗口中双击相应错误。
提示
Visual Studio 可能会显示依赖项关系图,而不是显示错误的根源。 若代码所依赖的程序集不是由层关系图指定的,或代码缺少层关系图所指定的依赖项,则会出现此情况。 检查依赖项关系图或代码,以确定此依赖关系是否应存在。 有关依赖项关系图的更多信息,请参见如何:在关系图文档中浏览和导航。
若要管理代码,请参见更新代码以符合新的体系结构。
从命令提示手动验证代码
打开 Visual Studio 命令提示。
若要打开命令提示,请单击**“开始”,依次指向“所有程序”、“Microsoft Visual Studio 2010”和“Visual Studio 工具”,再单击“Visual Studio 2010 命令提示”**。
选择以下选项之一:
若要对照解决方案中的特定建模项目验证代码,请使用下面的自定义属性运行 MSBuild。
msbuild <FilePath+ModelProjectFileName>.modelproj /p:ValidateArchitecture=true
- 或 -
浏览到包含建模项目文件 (.modelproj) 和层关系图的文件夹,然后使用下面的自定义属性运行 MSBuild:
msbuild /p:ValidateArchitecture=true
若要对照解决方案中的所有建模项目验证代码,请使用下面的自定义属性运行 MSBuild:
msbuild <FilePath+SolutionName>.sln /p:ValidateArchitecture=true
- 或 -
浏览到必须包含建模项目(包含层关系图)的解决方案文件夹,然后使用下面的自定义属性运行 MSBuild:
msbuild /p:ValidateArchitecture=true
将列出发生的任何错误。 有关 MSBuild 的更多信息,请参见 MSBuild 和 MSBuild 任务。
有关了解验证错误的更多信息,请参见了解层验证错误。
从本地生成中自动验证代码
- 使用文本编辑器打开建模项目 (.modelproj) 文件,然后包括以下属性:
<ValidateArchitecture>true</ValidateArchitecture>
- 或 -
在**“解决方案资源管理器”中,右击包含层关系图或关系图的建模项目,再单击“属性”**。
在**“属性”窗口中,将建模项目的“验证体系结构”属性设置为“True”**。
这将在验证过程中包括建模项目。
在**“解决方案资源管理器”**中,单击要用于验证的层关系图 (.layerdiagram) 文件。
在**“属性”窗口中,确保关系图的“生成操作”属性设置为“验证”**。
这将在验证过程中包括层关系图。
有关了解验证错误的更多信息,请参见了解层验证错误。 若要管理代码,请参见更新代码以符合新的体系结构。
更新代码以符合新的体系结构
通常,在您第一次对照更新后的层关系图验证代码时,将出现错误。 这些错误的原因可能有以下几种:
将项目指派给了错误的层。 在这种情况下,请移动项目。
项目(例如类)以与您的体系结构相冲突的方式使用了其他类。 在这种情况下,请重构代码以移除依赖关系。
若要解决这些错误,请更新代码,直至验证过程中不出现其他错误为止。 这通常是一个反复的过程。
提示
在您开发或重构代码时,可能需要将新项目链接到层关系图。 但此操作可能并非必要的,例如,当您具有的层表示现有命名空间,而新代码只是向这些命名空间中添加更多材料时。
在开发过程中,您可能需要在验证期间禁止显示报告的某些冲突。 例如,您可能希望禁止显示您已解决或与特定情形不相关的错误。 禁止显示错误时,最好在 Team Foundation 中记录工作项。
为验证错误创建工作项
- 在**“错误列表”窗口中,右击错误,指向“创建工作项”**,然后单击要创建的工作项类型。
使用以下任务来管理**“错误列表”**窗口中的验证错误:
若要 |
请执行这些步骤 |
---|---|
禁止在验证过程中显示选定的错误 |
右击一个或多个所选错误,指向“管理验证错误”,再单击“禁止显示错误”。 禁止显示的错误在显示时均带有删除线格式。 在您下次运行验证时,这些错误将不会显示。 系统会在相应层关系图文件的 .suppressions 文件中对禁止显示的错误进行跟踪。 |
停止禁止显示选定的错误 |
右击所选的禁止显示的一个或多个错误,指向“管理验证错误”,然后单击“停止禁止显示错误”。 在您下次运行验证时,这些所选的禁止显示的错误将会显示。 |
在“错误列表”窗口中还原所有禁止显示的错误 |
在“错误列表”窗口中的任意位置右击,指向“管理验证错误”,然后单击“显示所有禁止显示的错误”。 |
从“错误列表”窗口中隐藏所有禁止显示的错误 |
在“错误列表”窗口中的任意位置右击,指向“管理验证错误”,然后单击“隐藏所有禁止显示的错误”。 |
在生成过程中包括层验证
为确保代码中将来的更改与层关系图相符,请在解决方案的标准生成过程中包括层验证。 这样一来,只要其他团队成员生成解决方案,系统就会将代码和层关系图中依赖项之间的差异作为生成错误进行报告。
运行 Team Foundation Build 时验证代码
在**“团队资源管理器”中,双击生成定义,再单击“进程”**。
在**“生成过程参数”下,展开“编译”,并在“MSBuild 参数”**参数中键入以下内容:
/p:ValidateArchitecture=true
有关更多信息,请参见使用默认模板定义生成。