用层关系图验证代码
若要,以确保代码不冲突与其设计中,可以验证与层关系图的代码在最终的 Visual Studio 和 Visual Studio premium。 这可帮助您:
查找冲突在您的代码的依赖项之间,并在层的依赖项关系图。
查找建议的更改可能会影响的依赖项。
例如,可以编辑层关系图来显示潜在的体系结构更改,然后对代码进行验证以查看受影响的依赖项。
将代码重构或迁移到其他设计。
查找需工作的代码或依赖项,当您将代码移动到不同的结构时。
您可以手动验证代码从 Visual Studio 中打开的层关系图或从命令提示。 运行时,本地生成或 Team Foundation build 时,可以自动来验证代码。 请参见 视频的通道 9:使用层关系图,设计并验证您的体系结构。
要求
最终的 Visual Studio 或 Visual Studio premium
具有层关系图的建模项目的解决方案。 必须与 Visual c# .NET 的项目链接此层关系图或 Visual Basic .NET 预期要验证。 请参见 从代码中创建层关系图。
若要
请参见项目是否支持验证
包括其他 .NET 程序集和项目以进行验证
手动验证代码
自动验证代码
疑难解答层验证问题
了解和解决层验证错误
请参见项目是否支持验证
在层关系图上,选择一个或多个层,右击您的选择,然后单击 查看链接。
在**“层资源管理器”中,查看“支持验证”**列。 如果该值为 false,则项目不支持验证。
您可以将网站,Office 文档和纯文本文件。层,但是,验证过程不包括它们。 不会出现验证错误。引用链接到单独层的项目或程序集,而没有依赖关系出现在这些层之间。 除非代码使用此类引用,否则这些引用不被视为依赖项。
包括其他 .NET 程序集和项目以进行验证
当您拖动时将层的项关系图,对对应的 .NET 程序集或项目的引用将自动添加到建模项目的 层引用 文件夹。 此文件夹包含对验证期间分析的程序集和项目。 可以包括其他 .NET 程序集和项目以进行验证,而无需手动将它们拖到层关系图上。
在 解决方案资源管理器,右击建模项目或 层引用 文件夹,然后单击 添加引用。
在**“添加引用”对话框中,选择所需程序集或项目,然后单击“确定”**。
手动验证代码
如果您有解决方案项链接的打开的层关系图,可以运行从关系图的 验证 快捷键命令。 也可以使用命令提示运行与 /p:ValidateArchitecture 自定义特性的 msbuild 命令设置为 True。 例如,在中,通过代码进行更改,请定期执行层验证,以便您可以提前捕获依赖项冲突。
从打开的层关系图中验证代码
右击关系图图面,再单击**“验证体系结构”**。
备注
默认情况下,层关系图 (.layerdiagram) 文件的“生成操作”属性设置为“验证”,以便在验证过程中包括关系图。
**“错误列表”**窗口会报告发生的任何错误。 有关验证错误的更多信息,请参见 了解和解决层验证错误。
若要查看每个错误的根源,请在**“错误列表”**窗口中双击相应错误。
备注
Visual Studio 可能会显示依赖项关系图,而不是显示错误的根源。若代码所依赖的程序集不是由层关系图指定的,或代码缺少层关系图所指定的依赖项,则会出现此情况。检查依赖项关系图或代码,以确定此依赖关系是否应存在。有关依赖项关系图的更多信息,请参见在依赖项关系图上可视化代码依赖项。
若要管理代码,请参见 管理验证错误。
验证代码在命令提示
打开 Visual Studio 命令提示。
选择以下选项之一:
若要对照解决方案中的特定建模项目验证代码,请使用下面的自定义属性运行 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 任务。
有关验证错误的更多信息,请参见 了解和解决层验证错误。
管理验证错误
在开发过程中,您可能需要在验证期间禁止显示报告的某些冲突。 例如,您可能希望禁止显示您已解决或与特定情形不相关的错误。 禁止显示错误时,最好在 Team Foundation 中记录工作项。
为验证错误创建工作项
- 在**“错误列表”窗口中,右击错误,指向“创建工作项”**,然后单击要创建的工作项类型。
使用以下任务来管理**“错误列表”**窗口中的验证错误:
若要 |
请执行这些步骤 |
---|---|
禁止在验证过程中显示选定的错误 |
右击一个或多个所选错误,指向“管理验证错误”,再单击“禁止显示错误”。 禁止显示的错误在显示时均带有删除线格式。 在您下次运行验证时,这些错误将不会显示。 系统会在相应层关系图文件的 .suppressions 文件中对禁止显示的错误进行跟踪。 |
停止禁止显示选定的错误 |
右击所选的禁止显示的一个或多个错误,指向“管理验证错误”,然后单击“停止禁止显示错误”。 在您下次运行验证时,这些所选的禁止显示的错误将会显示。 |
在“错误列表”窗口中还原所有禁止显示的错误 |
在“错误列表”窗口中的任意位置右击,指向“管理验证错误”,然后单击“显示所有禁止显示的错误”。 |
从“错误列表”窗口中隐藏所有禁止显示的错误 |
在“错误列表”窗口中的任意位置右击,指向“管理验证错误”,然后单击“隐藏所有禁止显示的错误”。 |
自动验证代码
您可以每次测试运行本地生成的层验证。 如果您的团队使用 Team Foundation build,才能执行层验证与封闭签入,则可以通过创建自定义 MSBuild 任务指定,并使用生成报告来收集验证错误。若要创建封闭签入生成 定义封闭签入生成过程以验证更改,请参见。
在本地生成期间自动验证代码,
- 使用文本编辑器打开建模项目 (.modelproj) 文件,然后包括以下属性:
<ValidateArchitecture>true</ValidateArchitecture>
- 或 -
在**“解决方案资源管理器”中,右击包含层关系图或关系图的建模项目,再单击“属性”**。
在**“属性”窗口中,将建模项目的“验证体系结构”属性设置为“True”**。
这将在验证过程中包括建模项目。
在**“解决方案资源管理器”**中,单击要用于验证的层关系图 (.layerdiagram) 文件。
在**“属性”窗口中,确保关系图的“生成操作”属性设置为“验证”**。
这将在验证过程中包括层关系图。
若要管理在"错误列表"窗口,请参见 管理验证错误。
在 Team Foundation build 期间,自动验证代码
在**“团队资源管理器”中,双击生成定义,再单击“进程”**。
在**“生成过程参数”下,展开“编译”,并在“MSBuild 参数”**参数中键入以下内容:
/p:ValidateArchitecture=true
有关验证错误的更多信息,请参见 了解和解决层验证错误。 有关 Team Foundation Build 的更多信息,请参见:
疑难解答层验证问题
下表描述了层验证问题及其解决方法。 这些问题不同于代码与设计发生冲突而导致出现的错误。 有关这些错误的更多信息,请参见 了解和解决层验证错误。
问题 |
可能的原因 |
解决方法 |
---|---|---|
验证错误不按预期发生。 |
在解决方案资源管理器中,从同一建模项目中的其他层关系图复制的层关系图上,验证不起作用。 以这种方式复制的层关系图包含与原始层关系图相同的引用。 |
|
了解的和解决层验证错误
在对照层关系图验证代码时,验证错误,则代码会与设计发生冲突。 例如,以下情况可能会导致验证错误:
将项目指派给了错误的层。 在这种情况下,请移动项目。
项目(例如类)以与您的体系结构相冲突的方式使用了其他类。 在这种情况下,请重构代码以移除依赖关系。
若要解决这些错误,请更新代码,直至验证过程中不出现其他错误为止。 可以反复执行此任务。
以下各节描述在这些错误的语法,解释这些错误的含义,并且提供了可执行解决或管理它们。
语法 |
描述 |
---|---|
项目 N(项目类型 N) |
项目 N 是与层关系图上的层关联的项目。 项目类型 N 是项目 N 的类型,例如“类”或“方法”,例如: MySolution.MyProject.MyClass.MyMethod(Method) |
命名空间名称 N |
命名空间的名称。 |
层名称 N |
层在层关系图上的名称。 |
依赖关系类型 |
项目 1 和项目 2 之间的依赖项关系的类型。 例如,项目 1 与项目 2 具有“调用”关系。 |
语法错误 |
错误说明 |
---|---|
AV0001: 无效的依赖项: 项目 1(项目类型 1) --> 项目 2(项目类型 2) 层: 层名称 1, 层名称 2 | 依赖项: 依赖关系类型 |
层名称 1 中的项目 1 不应依赖于层名称 2 中的项目 2 ,原因是层名称 1 不直接依赖于层名称 2。 |
AV1001: 无效的命名空间: 项目 层: 层名称 | 必需的命名空间: 命名空间名称 1 | 当前的命名空间: 命名空间名称 2 |
层名称要求其关联的项目必须属于命名空间名称 1。 项目位于命名空间名称 2 中,但不在命名空间名称 1 中。 |
AV1002: 依赖于禁止的命名空间: 项目 1(项目类型 1) | 项目 2(项目类型 2) 层: 层名称 | 禁止的命名空间: 命名空间名称 | 依赖项: 依赖关系类型 |
层名称要求其关联的项目必须不依赖于命名空间名称。 项目 1 不能依赖于项目 2,原因是项目 2 位于命名空间名称中。 |
AV1003: 在禁止的命名空间中: 项目(项目类型) 层: 层名称 | 禁止的命名空间: 命名空间名称 |
层名称要求其关联的项目不能属于命名空间名称。 项目属于命名空间名称。 |
AV3001: 缺少链接: 找不到层“层名称”链接到的“项目”。 是否缺少程序集引用? |
找不到层名称链接到的项目。 例如,由于建模项目缺少对包含某个类的程序集的引用,因此可能缺少指向该类的链接。 |
AV9001: 体系结构分析遇到了内部错误。 结果可能不完整。 有关详细信息,请参见详细的生成事件日志或输出窗口。 |
有关更多详细信息参见生成事件日志或输出窗口。 |