如何:导航 UML 模型
本主题介绍主要的 UML 模型类型。
模型元素、模型和模型存储区
程序集 Microsoft.VisualStudio.Uml.Interfaces.dll 中定义的类型与 UML Specification, version 2.1.2(UML 规范 2.1.2 版)中定义的类型相对应。
UML 规范中的类型在 Visual Studio 旗舰版中作为接口实现。 字母“I”附加在每个类型名称之前。 例如:IElement、 IClass、IInteraction、IOperation。
IElement 除外的所有类型都从一个或多个超类型继承属性。
有关模型类型的摘要,请参见模型元素类型。
有关 API 的完整详细信息,请参见UML 建模扩展性的 API 参考。
关系
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 导航关系。
所有权树
一个模型包含一个 IElement 对象树。 每个元素都具有属性 OwnedElements 和 Owner。
在大多数情况下,Owner 和 OwnedElements 属性的目标也由具有更具体的名称的其他属性引用。 例如,每个 UML 操作都由一个 UML 类所有。 因此,IOperation 具有一个名为 Class 的属性,并且在每个 IOperation 对象中 Class == Owner。
树的最顶层元素为 IModel,没有 Owner。 IModel 包含在 IModelStore 中,它在其中为 Root。
创建的每个模型元素都有一个 Owner。 有关更多信息,请参见如何:创建元素和关系。
形状和关系图
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。 可从中访问文件、项目和其他方面。 |
获取上下文
在扩展类中声明下面的一个或两个接口:
[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>) {...}
获取当前选定内容
// 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>())
{...}
访问其他模型或关系图
您可以:
使用 Visual Studio 模型总线在不同模型中的元素之间创建链接。 有关更多信息,请参见如何:将 UML 模型与其他模型和工具集成。
在只读模式下加载建模项目和关系图,而不使其在 Visual Studio 用户界面中可见。 有关更多信息,请参见如何:在程序代码中读取 UML 模型。
在 Visual Studio 中打开建模项目及其关系图,然后访问相应内容。 有关更多信息,请参见如何:使用 Visual Studio API 打开 UML 模型。