若要可视化软件系统的高级逻辑体系结构,请在Visual Studio中创建 dependency 关系图。 若要确保代码与此设计保持一致,请使用依赖项关系图验证代码。 可以为 Visual C# 和Visual Basic项目创建依赖项关系图。 若要查看 Visual Studio 哪些版本支持此功能,请参阅 版本对体系结构和建模工具的支持。
通过依赖项关系图,可以将Visual Studio解决方案项组织成逻辑的抽象组,称为 layers。 可以使用层来描述这些项目执行的主要任务或系统的主要组件。
每个层可能包含描述更详细任务的其他层。 还可以指定层之间的预期或现有 依赖项 。 这些依赖项(表示为箭头)显示使用或可以使用其他层表示的功能的层。 若要维护代码的体系结构控制,请显示关系图上的预期依赖项,然后根据关系图验证代码。
创建依赖项关系图
在创建依赖项关系图之前,请确保解决方案具有建模项目。
Important
不要将现有依赖关系图添加、拖动或复制到另一个建模项目或解决方案中的其他位置。 这将保留原始关系图中的引用,即使更改关系图也是如此。 这也可以防止层验证正常工作,并且可能会在尝试打开关系图时导致其他问题,例如缺少元素或其他错误。
而是向建模项目添加新的依赖项关系图。 将源关系图中的元素复制到新关系图。 保存建模项目和新依赖项关系图。
向建模项目添加新的依赖项关系图
注释
.NET Core项目的依赖关系图从Visual Studio 2019版本16.2开始得到支持。
右键单击解决方案资源管理器中的建模项目,然后选择 Add>New Item。
在“ 添加新项 ”窗口中,选择 “依赖项验证关系图”,在窗口底部输入关系图的名称,然后选择“ 添加”。
请从代码图中拖放或复制粘贴
使用 “体系结构 ”菜单为解决方案生成代码映射。
如果只想在代码示例中强制实施依赖项,请考虑应用代码映射筛选器来删除解决方案文件夹和“测试资产”。
在生成的代码映射上,删除“外部”节点,或将其展开以显示外部程序集,具体取决于是否要强制实施命名空间依赖项。 从代码图中删除不需要的程序集。
将 依赖项验证关系图 项添加到解决方案中的依赖项验证项目。
选择代码图上的所有节点(使用 Ctrl + A,或使用橡皮带选择,方法是在单击、拖动和释放之前按 Shift 键)。
将所选元素拖放或复制并粘贴到新的依赖项验证关系图。
这显示了当前的应用体系结构。 决定希望体系结构是什么,并相应地修改依赖项关系图。
从工件创建层
可以从Visual Studio解决方案项(如项目、代码文件、命名空间、类和方法)创建层。 这会自动在层和项之间创建链接,包括在层验证过程中。
可以将层链接到不支持验证的项目,例如Word文档或PowerPoint演示文稿。 这样,便可以将层与规范或计划相关联。 还可以将层链接到跨多个应用共享的项目中的文件,但验证过程不包括这些层,这些层以泛型名称(如“第 1 层”和“第 2 层”)显示。
若要查看链接项是否支持验证,请打开 “层资源管理器” 并检查该项的 “支持验证 ”属性。 请参阅 “管理链接到工件”。
| 目的 | 按照以下步骤作 |
|---|---|
| 为单个工件创建层 |
重要: 将二进制文件拖到依赖项关系图不会自动添加对建模项目的引用。 手动将要验证的二进制文件添加到建模项目。 将二进制文件添加到建模项目
|
| 为所有选定的项目创建单个层 | 同时将所有项目拖到依赖项关系图。 图中的一个层出现,并链接到所有的工件。 |
| 为每个所选项目创建一个层 | 按住 Shift 键,同时将所有项目拖动到依赖项关系图。 注意: 如果使用 SHIFT 键选择一系列项目,请在选择项目后释放该键。 再次拖动构件到关系图时按住不放。 每个工件的层显示在关系图上,并链接到每个工件。 |
| 向层添加工件 | 将工件拖到层。 |
| 创建新的未链接层 | 在 工具箱中,展开 “依赖项关系图 ”部分,然后将 层 拖到依赖项关系图。 若要添加多个层,请双击该工具。 完成后,选择 “指针 ”工具或按 ESC 键。 - 或 - 打开依赖项关系图的快捷菜单,选择 “添加”,然后选择“ 层”。 |
| 创建嵌套层 | 将现有层拖到另一层。 - 或 - 打开层的快捷菜单,选择 “添加”,然后选择“ 图层”。 |
| 创建包含两个或多个现有层的新层 | 选择图层,打开所选内容的快捷菜单,然后选择 成组。 |
| 更改层的颜色 | 将其 Color 属性设置为所需颜色。 |
| 指定与层关联的项目不应属于指定的命名空间 | 在层的 “禁止命名空间” 属性中键入命名空间。 使用分号 (;) 分隔命名空间。 |
| 指定与层关联的项目不能依赖于指定的命名空间 | 在层的 “禁止命名空间依赖项 ”属性中键入命名空间。 使用分号 (;) 分隔命名空间。 |
| 指定与层关联的项目必须属于指定命名空间之一 | 在层的 必需命名空间 属性中键入命名空间。 使用分号 (;) 分隔命名空间。 |
层上的数字指示链接到该层的项目数。 但是,读取此数字时,请记住:
如果层链接到包含其他项目的项目,但该层不直接链接到其他项目,则数字仅包含链接的项目。 在层验证期间包含其他工件以供分析。
例如,如果层链接到单个命名空间,则链接的项目数为 1,即使命名空间包含类也是如此。 如果该层还具有命名空间中每个类的链接,则该数字将包括链接类。
如果层包含链接到项目的其他层,则容器层也会链接到这些项目,即使容器层上的数字不包括这些项目。
管理层和工件之间的链接
在依赖项关系图上,打开层的快捷菜单,然后选择 “查看链接”。
层资源管理器 显示所选层的项目链接。
使用以下任务管理这些链接:
| 目的 | 在层资源管理器中 |
|---|---|
| 删除层与工件之间的链接 | 打开项目链接的快捷菜单,然后选择“ 删除”。 |
| 将链接从一个层移到另一层 | 将工件链接拖到图表上的现有层。 - 或 - 1.打开项目链接的快捷菜单,然后选择“ 剪切”。 2. 在依赖项关系图上,打开层的快捷菜单,然后选择“ 粘贴”。 |
| 将链接从一个层复制到另一层 | 1.打开项目链接的快捷菜单,然后选择“ 复制”。 2. 在依赖项关系图上,打开层的快捷菜单,然后选择“ 粘贴”。 |
| 从现有工件链接创建新层 | 将工件链接拖到图表上的空白区域。 |
| 验证链接的项目是否支持对依赖项关系图进行验证。 | 查看工件链接的支持验证列。 |
反向工程现有依赖项
只要与一个层关联的项目具有对与另一层关联的项目的引用,就存在依赖项。 例如,一个层中的类声明一个变量,该变量在另一层中具有类。 您可以对链接到图层的工件进行现有依赖项的反向工程。
注释
某些类型的工件无法对依赖项进行反向工程。 例如,不会对从或到链接到文本文件的层的依赖关系进行反向工程。 若要查看哪些项目具有可反向工程的依赖项,请打开一个或多个层的快捷菜单,然后选择 “查看链接”。 在 层资源管理器中,检查 “支持验证 ”列。 对于此列中显示为 False 的工件,不会对其依赖项进行反向工程。
选择一个或多个层,打开所选层的快捷菜单,然后选择“ 生成依赖项”。
如果看到一些不应存在的依赖项,可以编辑这些依赖项,使其与预期设计保持一致。
编辑层和依赖项以显示预期设计
若要描述你计划对系统或预期体系结构所做的更改,请编辑依赖项关系图:
| 目的 | 执行这些步骤 |
|---|---|
| 更改或限制依赖项的方向 | 设置 其 Direction 属性。 |
| 创建新的依赖项 | 使用 依赖关系 和 双向依赖项 工具。 若要绘制多个依赖项,请双击该工具。 完成后,选择 “指针 ”工具或按 ESC 键。 |
| 指定与层关联的项目不能依赖于指定的命名空间 | 在层的 “禁止命名空间依赖项 ”属性中键入命名空间。 使用分号 (;) 分隔命名空间。 |
| 指定与层关联的项目不得属于指定的命名空间 | 在层的 “禁止命名空间” 属性中键入命名空间。 使用分号 (;) 分隔命名空间。 |
| 指定与层关联的项目必须属于指定命名空间之一 | 在层的 必需命名空间 属性中键入命名空间。 使用分号 (;) 分隔命名空间。 |
更改元素在关系图上的显示方式
可以通过编辑层的属性来更改层的大小、形状、颜色和位置或依赖项的颜色。
发现代码图上的模式和依赖项
创建依赖项关系图时,还可以创建 代码映射。 这些关系图有助于在浏览代码时发现模式和依赖项。 使用解决方案资源管理器、类视图或对象浏览器浏览程序集、命名空间和类 - 它们通常与现有层相对应。 有关代码映射的详细信息,请参阅: