用层关系图验证代码

若要确保代码与其设计不冲突,你可以在 Visual Studio Ultimate 和 Visual Studio Premium 中使用层关系图验证代码。 这可帮助你:

  • 查找代码中的依赖项和层关系图上的依赖项之间的冲突。

  • 查找建议的更改可能会影响的依赖项。

    例如,可以编辑层关系图来显示潜在的体系结构更改,然后对代码进行验证以查看受影响的依赖项。

  • 将代码重构或迁移到其他设计。

    查找在将代码移动到其他体系结构时需要工作的代码或依赖项。

你可以从 Visual Studio 中打开的层关系图或从命令提示符手动验证代码。 你还可以在运行本地生成或 Team Foundation Build 时自动验证代码。 请观看第 9 频道视频:使用层关系图设计并验证你的体系结构

重要

如果你需要使用 Team Foundation Build 运行层验证,则还必须在生成服务器上安装 Visual Studio Ultimate。

要求

  • Visual Studio Ultimate 或 Visual Studio Premium

  • Team Foundation Build 服务器上的 Visual Studio Ultimate,用于使用 Team Foundation Build 自动验证代码

  • 一个具有建模项目和层关系图的解决方案。 该层关系图必须链接到要验证的 Visual C# .NET 或 Visual Basic .NET 项目中的项。 请参阅从代码创建层关系图

  • 查看项是否支持验证

  • 包括其他 .NET 程序集和项目以进行验证

  • 手动验证代码

  • 自动验证代码

  • 层验证问题疑难解答

  • 了解和纠正层验证错误

查看项是否支持验证

你可以将层链接到网站、Office 文档、纯文本文件和项目中跨多个应用共享的文件,但验证过程不包含这些内容。 如果引用的项目或程序集链接到单独的层,而且这些层之间没有依赖关系出现,则将不会出现验证错误。 除非代码使用此类引用,否则这些引用不被视为依赖项。

  1. 在层关系图上,选择一个或多个层,右键单击所选的层,然后单击**“查看链接”**。

  2. 在**“层资源管理器”中,查看“支持验证”**列。 如果该值为 false,则项不支持验证。

包括其他 .NET 程序集和项目以进行验证

当你将项目拖到层关系图上时,对相应的 .NET 程序集或项目的引用将自动添加到建模项目中的**“层引用”**文件夹中。 此文件夹包含对验证过程中分析的程序集和项目的引用。 你也可以包含要验证的其他 .NET 程序集和项目,而无需将它们手动拖到层关系图上。

  1. 在**“解决方案资源管理器”中,右键单击建模项目或“层引用”文件夹,然后单击“添加引用”**。

  2. 在**“添加引用”对话框中,选择所需程序集或项目,然后单击“确定”**。

手动验证代码

如果你有已链接到解决方案项的打开的层关系图,则可以从关系图运行**“验证”**快捷命令。 你还可以使用命令提示符运行 msbuild 命令,并将 /p:ValidateArchitecture 自定义属性设置为 True。 例如,在对代码进行更改时,请定期执行层验证以便能够提前捕获依赖项冲突。

从打开的层关系图中验证代码

  1. 右击关系图图面,再单击**“验证体系结构”**。

    备注

    默认情况下,层关系图 (.layerdiagram) 文件的“生成操作”属性设置为“验证”,以便在验证过程中包括关系图。

    **“错误列表”**窗口会报告发生的任何错误。 有关验证错误的详细信息,请参阅了解和纠正层验证错误。

  2. 若要查看每个错误的根源,请在**“错误列表”**窗口中双击相应错误。

    备注

    Visual Studio 可能会显示依赖项关系图,而不是显示错误的根源。若代码所依赖的程序集不是由层关系图指定的,或代码缺少层关系图所指定的依赖项,则会出现此情况。检查依赖项关系图或代码,以确定此依赖关系是否应存在。有关依赖项关系图的详细信息,请参阅在依赖项关系图上映射代码间的依赖关系

  3. 若要管理错误,请参阅管理验证错误。

在命令提示符处验证代码

  1. 打开 Visual Studio 命令提示。

  2. 选择以下选项之一:

    • 若要对照解决方案中的特定建模项目验证代码,请使用下面的自定义属性运行 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 的详细信息,请参阅 MSBuildMSBuild 任务

有关验证错误的详细信息,请参阅了解和纠正层验证错误。

管理验证错误

在开发过程中,你可能需要在验证期间禁止显示报告的某些冲突。 例如,你可能希望禁止显示你已解决或与特定情形不相关的错误。 禁止显示错误时,最好在 Team Foundation 中记录工作项。

为验证错误创建工作项

  • 在**“错误列表”窗口中,右击错误,指向“创建工作项”**,然后单击要创建的工作项类型。

使用以下任务来管理**“错误列表”**窗口中的验证错误:

请执行这些步骤

禁止在验证过程中显示选定的错误

右击一个或多个所选错误,指向“管理验证错误”,再单击“禁止显示错误”

禁止显示的错误在显示时均带有删除线格式。 在你下次运行验证时,这些错误将不会显示。

系统会在相应层关系图文件的 .suppressions 文件中对禁止显示的错误进行跟踪。

停止禁止显示选定的错误

右击所选的禁止显示的一个或多个错误,指向“管理验证错误”,然后单击“停止禁止显示错误”

在你下次运行验证时,这些所选的禁止显示的错误将会显示。

“错误列表”窗口中还原所有禁止显示的错误

“错误列表”窗口中的任意位置右击,指向“管理验证错误”,然后单击“显示所有禁止显示的错误”

“错误列表”窗口中隐藏所有禁止显示的错误

“错误列表”窗口中的任意位置右击,指向“管理验证错误”,然后单击“隐藏所有禁止显示的错误”

自动验证代码

每次运行本地生成时,都可以执行层验证。 如果你的团队使用 Team Foundation Build,则可使用能够通过创建自定义 MSBuild 任务指定的封闭签入来执行层验证,并使用生成报告来收集验证错误。若要创建封闭签入生成,请参阅使用封闭签入生成过程以验证更改

在本地生成期间自动验证代码

  • 使用文本编辑器打开建模项目 (.modelproj) 文件,然后包括以下属性:
<ValidateArchitecture>true</ValidateArchitecture>

- 或 -

  1. 在**“解决方案资源管理器”中,右击包含层关系图或关系图的建模项目,再单击“属性”**。

  2. 在**“属性”窗口中,将建模项目的“验证体系结构”属性设置为“True”**。

    这将在验证过程中包括建模项目。

  3. 在**“解决方案资源管理器”**中,单击要用于验证的层关系图 (.layerdiagram) 文件。

  4. 在**“属性”窗口中,确保关系图的“生成操作”属性设置为“验证”**。

    这将在验证过程中包括层关系图。

若要管理“错误列表”窗口中的错误,请参阅管理验证错误。

在 Team Foundation Build 期间自动验证代码

  1. 在**“团队资源管理器”中,双击生成定义,再单击“进程”**。

  2. 在**“生成过程参数”下,展开“编译”,并在“MSBuild 参数”**参数中键入以下内容:

    /p:ValidateArchitecture=true

有关验证错误的详细信息,请参阅了解和纠正层验证错误。 有关 Team Foundation Build 的详细信息,请参阅:

层验证问题疑难解答

下表描述了层验证问题及其解决方法。 这些问题不同于代码与设计发生冲突而导致出现的错误。 有关这些错误的详细信息,请参阅了解并纠正层验证错误。

问题

可能的原因

解决方法

验证错误不按预期发生。

在解决方案资源管理器中,从同一建模项目中的其他层关系图复制的层关系图上,验证不起作用。 以这种方式复制的层关系图包含与原始层关系图相同的引用。

  1. 向建模项目中添加一个新的层关系图。

  2. 将源层关系图中的元素复制到新关系图。

了解和解决层验证错误

在对照层关系图验证代码时,如果代码与设计发生冲突,则会出现验证错误。 例如,以下情况可能导致发生验证错误:

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

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

若要解决这些错误,请更新代码,直至验证过程中不出现其他错误为止。 可以反复执行此任务。

以下各节描述这些错误中使用的语法,解释了这些错误的含义,并提供了纠正或管理这些错误的方法。

语法

描述

ArtifactN(ArtifactTypeN)

ArtifactN 是与层关系图上的层关联的项目。

ArtifactTypeN 是 ArtifactN 的类型,例如“类”“方法”,例如:

MySolution.MyProject.MyClass.MyMethod(Method)

NamespaceNameN

命名空间的名称。

LayerNameN

层在层关系图上的名称。

DependencyType

Artifact1 和 Artifact2 之间的依赖关系的类型。 例如,Artifact1 与 Artifact2 具有“调用”关系。

错误语法

错误说明

AV0001:无效的依赖关系:Artifact1(ArtifactType1) --> Artifact2(ArtifactType2)

   层:LayerName1、LayerName2 | 依赖关系:DependencyType

LayerName1 中的 Artifact1 不应依赖于 LayerName2 中的 Artifact2,原因是 LayerName1 不直接依赖于 LayerName2。

AV1001:无效的命名空间:Artifact

   层:LayerName | 必需的命名空间:NamespaceName1 | 当前的命名空间:NamespaceName2

LayerName 要求其关联的项目必须属于 NamespaceName1。 Artifact 位于 NamespaceName2 中,但不在 NamespaceName1 中。

AV1002:依赖于禁止的命名空间:Artifact1(ArtifactType1) | Artifact2(ArtifactType2)

   层:LayerName | 禁止的命名空间:NamespaceName | 依赖关系:DependencyType

LayerName 要求其关联的项目必须不依赖于 NamespaceName。 Artifact1 不能依赖于 Artifact2,原因是 Artifact2 位于 NamespaceName 中。

AV1003:在禁止的命名空间中:Artifact(ArtifactType)

   层:LayerName | 禁止的命名空间:NamespaceName

LayerName 要求其关联的项目不能属于 NamespaceName。 Artifact 属于 NamespaceName。

AV3001:缺少链接:找不到层“LayerName”链接到的“Artifact”。 是否缺少程序集引用?

找不到 LayerName 链接到的项目。 例如,由于建模项目缺少对包含某个类的程序集的引用,因此可能缺少指向该类的链接。

AV9001: 体系结构分析遇到了内部错误。 结果可能不完整。 有关详细信息,请参阅详细的生成事件日志或输出窗口。

有关更多详细信息,请参阅生成事件日志或输出窗口。

请参见

概念

在开发过程中验证系统