如何:导航 UML 模型

本主题介绍主要的 UML 模型类型。

模型元素、模型和模型存储区

程序集 Microsoft.VisualStudio.Uml.Interfaces.dll 中定义的类型与 UML Specification, version 2.1.2(UML 规范 2.1.2 版)中定义的类型相对应。

UML 规范中的类型在 Visual Studio 旗舰版中作为接口实现。 字母“I”附加在每个类型名称之前。 例如:IElementIClassIInteractionIOperation

IElement 除外的所有类型都从一个或多个超类型继承属性。

Ee330925.collapse_all(zh-cn,VS.110).gif关系

UML 规范中定义的属性和关系将作为 .NET 属性实现。

大多数关系都可以双向导航。 一个关系对应于一对属性,两端各为类型的一个属性。 例如,属性 IElement.Owner 和 IElement.OwnedElements 表示关系的两端。 因此,该表达式的计算结果将始终为 true:

IElement c; ... c.OwnedElements.All(x => x.Owner == c)

许多关系(如 IAssociation)也可由一个具有自己的属性的对象表示。

如果从模型中删除某个元素,则将自动删除该元素参与的任何关系,并将更新位于另一端的属性。

如果 UML 规范为某个属性指定重数 0..1,则该属性的值可能为 null。 重数的最大值大于 1 意味着 .NET 属性具有类型:IEnumerable<类型>。

有关遍历关系的更多信息,请参见如何:使用 UML API 导航关系

Ee330925.collapse_all(zh-cn,VS.110).gif所有权树

一个模型包含一个 IElement 对象树。 每个元素都具有属性 OwnedElements 和 Owner。

在大多数情况下,Owner 和 OwnedElements 属性的目标也由具有更具体的名称的其他属性引用。 例如,每个 UML 操作都由一个 UML 类所有。 因此,IOperation 具有一个名为 Class 的属性,并且在每个 IOperation 对象中 Class == Owner。

树的最顶层元素为 IModel,没有 Owner。 IModel 包含在 IModelStore 中,它在其中为 Root

创建的每个模型元素都有一个 Owner。 有关更多信息,请参见如何:创建元素和关系

类图:Model、Diagram、Shape 和 Element

形状和关系图

UML 模型中的元素可以在关系图中显示。 不同类型的关系图可以显示 IElement 的不同的子类型。

在某些情况下,一个元素可以在多个关系图中显示。 例如,一个 IUseCase 元素可以有多个 IShape,这些 IShape 可以在一个或多个关系图中显示。

各个形状以树的形式排列。 树的边缘由 ParentShape 和 ChildShapes 属性表示。 关系图是唯一没有父级的形状。 关系图图面上的形状由更小的部分组成。 例如,一个类形状具有特性和操作的隔离舱。

有关形状的更多信息,请参见如何:在关系图上显示模型

对扩展中的模型的访问

在定义为 MEF 组件的 Visual Studio 扩展中,您可以声明用于从运行扩展的上下文中导入信息的属性。

特性类型

可以访问的对象

更多信息

Microsoft.VisualStudio.ArchitectureTools.Extensibility.Presentation

.IDiagramContext

(在 Microsoft.VisualStudio.ArchitectureTools.Extensibility.dll 中)

当前焦点关系图。

如何:在建模图上定义菜单命令

Microsoft.VisualStudio.Modeling.ExtensionEnablement

.ILinkedUndoContext

(在 Microsoft.VisualStudio.Modeling.Sdk.11.0.dll)

允许您将更改组合成事务。

如何:使用事务链接模型更新

Microsoft.VisualStudio.Shell .SVsServiceProvider

(在 Microsoft.VisualStudio.Shell.Immutable.11.0.dll)

主机 Visual Studio。 可从中访问文件、项目和其他方面。

如何:使用 Visual Studio API 打开 UML 模型

Ee330925.collapse_all(zh-cn,VS.110).gif获取上下文

在扩展类中声明下面的一个或两个接口:

[Import] public IDiagramContext DiagramContext { get; set; }

Managed Extensibility Framework (MEF) 会将这些接口绑定到一些定义,从这些定义中可获取当前关系图、模型存储区、根对象等:

IDiagram diagram = this.DiagramContext.CurrentDiagram;
IClassDiagram classDiagram = diagram as IClassDiagram;
       // or diagrams of other types
IModelStore modelStore = diagram.ModelStore;
IModel model = modelStore.Root;
foreach (IDiagram diagram in modelStore.Diagrams) {...}
foreach (IElement element in modelStore.AllInstances<IUseCase>) {...}

Ee330925.collapse_all(zh-cn,VS.110).gif获取当前选定内容

// All selected shapes and their elements
foreach (IShape shape in diagram.SelectedShapes)
{  
   IDiagram selectedDiagram = shape as IDiagram;
   if (selectedDiagram != null)
   { // no shape selected - user right-clicked the diagram
     ... Context.CurrentDiagram ...
   }
   else
   {
     IElement selectedElement = shape.Element;
   ...}
// All selected shapes that display a specfic type of element
foreach (IShape<IInterface> in 
   diagram.GetSelectedShapes<IInterface>()) 
{...}

访问其他模型或关系图

您可以:

请参见

概念

扩展 UML 模型和关系图

使用 UML API 编程