本主题介绍了层模型中的元素和关系,你可以使用程序代码在 Visual Studio 旗舰版 中导航和更新层模型。
有关从用户角度来看的层关系图的详细信息,请参阅层关系图:参考和层关系图:指南。
本主题中描述的 Microsoft.VisualStudio.ArchitectureTools.Extensibility.Layer 模型是更通用 Microsoft.VisualStudio.GraphModel 模型的外观。 如果要编写菜单命令或笔势扩展,请使用 Layer 模型。 如果要编写层验证扩展,则使用 GraphModel 更为方便。
事务
更新模型时,请考虑将更改包含在一个 ILinkedUndoTransaction 中。 这会将你所做的更改分组到一个事务。 如果有任何更改失败,则将回滚整个事务。 如果用户撤消一个更改,将一起撤消所有更改。
有关详细信息,请参阅如何:使用事务链接模型更新。
using (ILinkedUndoTransaction t =
LinkedUndoContext.BeginTransaction("a name"))
{
// Make changes here ....
t.Commit(); // Don't forget this!
}
包容
层 (ILayer) 和层模型 (ILayerModel) 可以包含注释和层。
层 (ILayer) 可以包含在层模型 (ILayerModel) 中,也可以嵌套在另一个 ILayer 中。
若要创建注释或层,则对相应容器使用创建方法。
依赖关系链接
依赖关系链接由一个对象表示。 可以在任一方向导航链接:
若要创建依赖关系链接,请调用 source.CreateDependencyLink(target)。
注释
注释可以包含在层或层模型内部,也可以链接到任何层元素:
注释可以链接到任意数量的元素,也可以不链接任何元素。
若要获取附加到层元素的注释,请使用:
ILayerModel model = diagram.GetLayerModel();
IEnumerable<ILayerComment> comments =
model.Comments.Where(comment =>
comment.Links.Any(link => link.Target == layerElement));
警告
ILayer 的 Comments 属性可获取包含在 ILayer 内的注释。但不会获取链接到它的注释。
通过对相应容器调用 CreateComment() 来创建注释。
通过对注释使用 CreateLink() 来创建链接。
层元素
可包含在一个模型中的所有类型的元素都是层元素:
属性
每个 ILayerElement 都有一个名为 Properties 的字符串字典。 可以使用此字典将任意信息附加到任何层元素。
项目引用
项目引用 (ILayerArtifactReference) 表示层和项目项(例如文件、类或文件夹)之间的链接。 当用户通过将项从“解决方案资源管理器”或“体系结构资源管理器”拖动到层关系图上来创建或添加层时,同时也在创建项目。 可将任意数量的项目引用链接到一个层。
“层资源管理器”中的每一行都显示一个项目引用。 有关详细信息,请参阅从代码创建层关系图。
下面是与项目引用有关的主要类型和方法:
ILayerArtifactReference. Categories 属性指示引用的项目类型,例如类、可执行文件或程序集。 Categories 确定标识符标识目标项目的方式。
CreateArtifactReferenceAsync 从 Project 或 ProjectItem 创建项目引用。 这是一个异步操作。 因此,你通常要提供一个在创建操作完成时调用的回调。
层项目引用不应与用例关系图中的项目混淆。
形状和关系图
使用两个对象表示层模型中的每个元素:ILayerElement 和 IShape。 IShape 表示关系图上形状的位置和大小。 在层模型中,每个 ILayerElement 都有一个 IShape,层关系图上的每个 IShape 都有一个 ILayerElement。 IShape 还用于 UML 模型。 因此,并不是每一个 IShape 都具有层元素。
按同样的方式,ILayerModel 显示在一个 IDiagram 上。
在自定义命令或笔势处理程序的代码中,你可以从 DiagramContext 导入中获取当前关系图和当前选择的形状:
public class ... {
[Import]
public IDiagramContext DiagramContext { get; set; }
...
public void ... (...)
{ IDiagram diagram = this.DiagramContext.CurrentDiagram;
ILayerModel model = diagram.GetLayerModel();
if (model != null)
{ foreach (ILayer layer in model.Layers) { ... }}
foreach (IShape selected in diagram.SelectedShapes)
{ ILayerElement element = selected.GetLayerElement();
if (element != null) ... }}
IShape 和 IDiagram 也用于显示 UML 模型。 有关详细信息,请参阅如何:在关系图上显示模型。