层关系图:指南

通过在 Visual Studio 旗舰版中创建层关系图,可以概要说明应用程序的体系结构。 若要确保你的代码与此设计保持一致,请在 Visual Studio Ultimate 或 Visual Studio Premium 中使用层关系图验证代码。 还可以在生成过程中包括层验证。 请观看第 9 频道视频:使用层关系图设计并验证你的体系结构

什么是层关系图?

类似于传统的体系结构示意图,层关系图标识设计的主要组件或功能单元及其相互依赖关系。 关系图中的每个节点称为层,表示逻辑组的命名空间、项目或其他项目。 您可以绘制出您的设计中存在的依赖关系。 与传统的体系结构关系图不同的是,您可以验证源代码中的实际依赖关系符合您指定的预期依赖关系。 通过在Team Foundation Server上验证常规生成的一部分,您可以确保程序代码继续符合系统的体系结构将来的更改。 请参阅层关系图:参考

以下步骤概述了如何使用开发过程中的层关系图。 本主题中的后面几节描述了有关每个步骤的更多详细信息。 如果您正在开发新的设计,请忽略引用现有代码的步骤。

备注

这些步骤按大致顺序显示。您可能需要重叠任务、重新排序它们以符合您自己的具体情况,并在项目中的每个迭代开始时重新访问它们。

  1. 为整个应用程序或其中的一个层创建层关系图。

  2. 定义层以表示您的应用程序的主功能区或组件。 按其功能命名这些层,例如“演示文稿”或“服务”。 如果您有Visual Studio解决方案,您可以将每个图层关联到项目的集合,如项目、命名空间、文件等。

  3. 发现各层之间的当前依赖关系。

  4. 编辑层和依赖项以显示您希望代码反映的更新的设计。

  5. 通过创建层以表示主要的体系结构块或组件,并定义依赖关系以显示每个层相互使用的方式,以此设计您的应用程序的新区域。

  6. 编辑关系图的布局和外观以帮助您与同事进行讨论。

  7. 对层关系图进行代码验证以突出显示代码与您需要的体系结构之间的冲突。

  8. 更新代码以符合您的新体系结构。 以迭代方式开发和重构代码,直到此验证不再显示有冲突。

  9. 在生成过程中包括层验证以确保代码继续遵循您的设计。

创建层关系图

必须在建模项目内创建层关系图。 可以将新的层关系图添加到现有建模项目、为层关系图创建新的建模项目或在同一建模项目中复制现有层关系图。

重要

不要将现有层关系图从一个建模项目添加、拖动或复制到另一个建模项目或解决方案中的其他位置。以这种方式中复制的层关系图将具有与原始关系图相同的引用,即使您修改了关系图。这将阻止层验证正常操作,并可能导致出现其他问题,例如,尝试打开该关系图时元素缺失或出现其他错误。

请参阅从代码创建层关系图

定义表示功能区域或组件的层

层表示项目的逻辑组,如项目、代码文件、命名空间、类和方法。 可以从 Visual C# .NET 和 Visual Basic .NET 项目创建层,也可以通过链接文档(如 Word 文件或 PowerPoint 演示文稿)将规范或计划附加到层。 每一层显示为关系图上的一个矩形,并显示链接到它的项目数。 一个层可以包含描述更具体任务的嵌套的层。

一般原则是按其功能命名层,例如“演示文稿”或“服务”。 如果这些项目依赖关系紧密,则将它们放在同一层。 如果可以分别更新或在单独的应用程序中使用这些项目,请将它们放在不同的层中。 若要了解有关分层模式的信息,请访问 https://go.microsoft.com/fwlink/?LinkId=145794 上的模式和实践站点。

提示

有某些类型的可链接到层的项目,但是不支持对层关系图进行验证。要查看该项目是否支持验证,请打开层资源管理器检查项目链接的支持验证属性。请参阅发现各层之间的现有依赖关系。

在更新不熟悉的应用程序时,您可以使用依赖项关系图帮助您浏览和理解代码。 这些关系图可帮助您发现代码中的群集和依赖关系。 您还可以使用体系结构资源管理器来浏览命名空间和类,它们通常与现有层具有很好的对应关系。 这样,你将可以更轻松地为层分配项目。 然后,您可以使用层关系图帮助您更新代码。

有关详细信息,请参阅下列主题:

发现各层之间的现有依赖关系

只要与一个层关联的项目引用与另一个层关联的项目,就存在依赖关系。 例如,一个层中的某个类声明了一个拥有其他层中的某个类的变量。 您可以对它们实施反向工程来发现现有依赖关系。

备注

无法为某些种类的项目对依赖关系进行反向工程处理。例如,对于链接到文本文件的层,将不会对源自或指向该层的依赖关系进行反向工程处理。若要查看哪些项目具有可进行反向工程处理的依赖项,右键单击一个或多个层,然后单击查看链接。在“层资源管理器”中,检查“支持验证”列。对于此列显示“False”的项目,将不会对依赖关系进行反向工程处理。

为对层之间的现有依赖关系进行反向工程

  • 选择一个或多个层,用鼠标右键单击所选的层,然后单击生成依赖项

通常,您会看到一些不应存在的依赖关系。 可以编辑这些依赖关系,使它们与预期的设计对齐。

编辑层和依赖项以显示预期的设计

若要说明您准备对系统或计划的体系结构进行的更改,请使用以下步骤来编辑层关系图。 您还可以考虑进行一些重构的更改,以提高代码的结构,然后再扩展。 请参阅改进代码的结构。

执行这些步骤

删除不应存在的依赖项

单击依赖项,然后按删除

更改或限制依赖项的方向

设置其“方向”属性。

创建新的依赖项

使用“依赖项”“双向依赖项”工具。

若要绘制多个依赖关系,请双击该工具。 完成操作后,单击指针工具或按 ESC 键。

指定与层关联的项目不能依赖于指定的命名空间

在层的“Forbidden Namespace Dependencies”属性中键入命名空间。 使用分号 (;) 分隔多个命名空间。

指定与层关联的项目必须不属于指定的命名空间

在层的“Forbidden Namespaces”属性中键入命名空间。 使用分号 (;) 分隔多个命名空间。

指定与层关联的项目必须属于某个指定的命名空间

在层的“Required Namespaces”属性中键入命名空间。 使用分号 (;) 分隔多个命名空间。

改进代码的结构

重构更改的改进不会影响应用程序的行为,但有助于使代码在将来更易于更改和扩展。 结构良好的代码的设计容易抽象化为层关系图。

例如,如果您为代码中的每个命名空间创建图层,然后进行反向工程处理依赖关系,各层之间应该有单向依赖项的最小集。 如果您使用类或方法创建更详细的关系图作为您的层,则结果也将具有相同的特征。

如果不是这样,代码将会更加难以在其生命周期中更改,并且将不太适用于使用层关系图进行验证。

设计应用程序的新区域

当您启动开发新项目或新项目中的新区域时,您可以绘制层和依赖项,以帮助您在开始开发代码之前标识主要组件。

  • 如果有可能,在您的层关系图中显示可识别的体系结构模式。 例如,描述桌面应用程序的层关系图可能包括演示文稿、域逻辑和数据存储等层。 涵盖应用程序的单个功能的层关系图,可能有模型、视图和控制器等一些层。 有关此类模式的详细信息,请参阅模式和实践:应用程序体系结构

    如果您要频繁创建相似的模式,请创建一个自定义工具。 请参阅如何:定义自定义建模工具箱项

  • 为每一层如命名空间、类或组件创建代码项目。 这样,就更容易跟踪代码,并把代码项目链接到层。 当您创建每个项目时,将其链接到相应的层。

  • 如您已经链接到层的命名空间,您无需将大多数类和其他项目链接到层,因为它们归属于较大的项目。

  • 为新功能创建新关系图。 通常情况下,将有一个或多个层关系图来描述整个应用程序。 如果您正在设计应用程序的新功能,请勿添加或更改现有的关系图。 相反,创建您自己的关系图来反映代码的新部分。 新关系图中的图层可能包括演示文稿、域逻辑和新功能的数据库层。

    在生成应用程序时,将同时对整体的关系图和更详细的功能关系图验证您的代码。

编辑演示和讨论的布局

为了帮助您识别层和依赖项或与团队成员对其进行讨论,您可以按以下方式编辑关系图的外观和布局:

  • 更改图层的大小、 形状和位置。

  • 更改层的颜色和依赖项。

    • 选择一个或多个层或依赖项,单击右键,然后单击属性。 在**“属性”窗口中,编辑“颜色”**属性。

比对关系图验证代码

编辑关系图之后,您可以对照代码随时手动验证关系图,也可以在每次运行本地生成或Team Foundation Build时进行自动验证。 

请参阅:

更新代码以符合新体系结构

通常情况下,当您将验证更新后的层关系图的代码时,将出现第一次错误。 这些错误可能有几个原因:

  • 将项目指派给了错误的层。 在这种情况下,请移动项目。

  • 项目(例如类)以与你的体系结构相冲突的方式使用了其他类。 在这种情况下,请重构代码以移除依赖关系。

若要解决这些错误,请更新代码,直至验证过程中不出现其他错误为止。 这通常是一个迭代过程。 有关这些错误的更多信息,请参见用层关系图验证代码

备注

在您开发或重构代码时,您可能有新项目要链接到层关系图。但是,这可能不是必要的,例如,当您的层表示现有命名空间时,而且新代码只是向这些命名空间中添加更多的材料。

在开发过程中,你可能需要在验证期间禁止显示报告的某些冲突。 例如,你可能希望禁止显示你已解决或与特定情形不相关的错误。 禁止显示错误时,最好在 Team Foundation 中记录工作项。 若要执行此任务,请参阅用层关系图验证代码

在生成过程中包括层验证

若要确保将来更改的代码符合层关系图,请把层验证包含到您的解决方案的标准生成过程中。 在其他团队成员生成解决方案时,代码的依赖关系和层关系图之间的差异将作为生成错误进行报告。 有关如何在生成过程中包括层验证的详细信息,请参阅用层关系图验证代码

请参见

概念

层关系图:参考

从代码创建层关系图