如何定义域特定语言

若要定义域特定语言 (DSL),则从模板创建一个 Visual Studio 解决方案。 解决方案的关键部分是 DSL 定义关系图,在 DslDefinition.dsl 存储。 DSL 定义 DSL 的类和形状。 在您修改和添加到这些元素之后,可以将程序代码更详细地自定义 DSL。

如果您不熟悉 DSL,我们建议您通过 DSL Tools Lab工作,则可以解决此站点找到: Visualizaton and Modeling SDK

主题内容

选择模板解决方案

定义的 DSL 模式

模型元素类

关系图上的形状

引用和连接

包含的形状列表:形状隔离舱

另一个形状边界的端口

泳道

属性类型

自定义 DSL

疑难解答

选择模板解决方案

若要定义 DSL,必须安装以下组件:

Visual Studio

https://go.microsoft.com/fwlink/?linkid=185579

Visual Studio SDK

https://go.microsoft.com/fwlink/?linkid=185580

Visual Studio 可视化和建模 SDK

https://go.microsoft.com/fwlink/?LinkID=186128

使用域特定语言项目模板,创建一个新的域特定语言,将创建一个新的 Visual Studio 解决方案。

创建 DSL 解决方案

  1. 域特定语言 模板创建一个解决方案,可以找到在 新项目 对话框的 其他项类型/扩展性 下。

    “创建 DSL”对话框

    当您单击 时, 域特定语言向导 打开并显示模板 DSL 解决方案列表。

  2. 单击每个模板查看说明。 选择非常相似的解决方案希望创建。

    每个 DSL 模板定义了一个基本的工作 DSL。 您将编辑此 DSL 适合拥有要求。

    单击每个示例有关更多信息。

    • 选择 任务流 创建具有泳道的 DSL。 泳道是关系图的垂直或水平分区。

    • 选择 组件模型 创建具有端口的 DSL。 端口很小的形状在较大的形状边缘。

    • 选择 类图 定义具有形状隔离舱的 DSL。 形状隔离舱包含列表项。

    • 选择的 最小的语言 在某些情况下,或者,如果您不确定的。

      备注

      如果要创建类图或组件图,使用 UML 模型,请考虑。UML 建模工具的提供在单一模型的集成的设置关系图。使用 ModelBus,它们是可扩展的,并且可以与集成 DSL。有关更多信息,请参见开发软件设计模型

    • 选择 最小 WinForm 设计器 或创建 DSL 的 最小 WPF 设计器 在中显示 windows 窗体或 WPF 图面。 您必须定义编辑器编写代码。 有关更多信息,请参见下列主题:

      创建基于 Windows 窗体的域特定语言

      创建基于 WPF 的域特定语言

  3. 输入 DSL 的文件扩展名在适当的向导页。 这是包含 DSL 实例的文件将使用的扩展。

    • 选择不与在计算机上的任何应用程序的文件扩展名,或者在要安装 DSL 的所有计算机。 例如, docxhtm 不可接受文件扩展名。

    • 向导将警告,如果输入的扩展用作 DSL。 考虑使用不同的文件扩展名。 还可以重置 Visual Studio SDK 的实验实例中清除旧的实验设计器。 单击 启动,单击 所有程序Microsoft Visual Studio 2010 SDK工具然后 重置 Microsoft Visual Studio 2010 的实验实例

  4. 可以调整对其他页的设置,或保留默认值。

  5. 单击**“完成”**。

    向导创建包含两个或三个项目的解决方案,并从生成 DSL 定义的代码。

用户界面现在类似于下图。

dsl 设计器

此解决方案定义域特定语言 (dsl)。 有关更多信息,请参见 域特定语言工具用户界面的概述

Bb126581.collapse_all(zh-cn,VS.110).gif测试解决方案

模板解决方案提供一个有效的 DSL,可以修改或使用,按原样。

若要测试该解决方案,请按 F5 或 CTRL+F5。 Visual Studio 新实例以实验模式打开。

在 Visual Studio新实例,请在解决方案资源管理器中,打开示例文件。 将打开作为关系图,使用工具箱。

如果您运行从 最小的语言 模板创建的解决方案,实验 Visual Studio 将类似于以下示例:

Bb126581.DSL_min(zh-cn,VS.110).png

使用工具的测试。 创建组件并连接这些类。

关闭 Visual Studio 的实验实例。

备注

当您修改了 DSL,您不再能够看到在示例测试文件的形状。但是,您可以创建新元素。

Bb126581.collapse_all(zh-cn,VS.110).gif修改模板 DSL

向和保留某些或所有域类和形状类重命名模板 DSL 定义。 新的类名应是有效的 CLR,名称,而不用空格或标点。

保留这些类特别有用:

  • 根类出现在左上角 DSL 定义关系图,在 类和关系下。 重命名为名称与 DSL 不同。 例如,名为 MusicLibrary 的 DSL 可能具有名为 Music 的根类。

  • 关系图类出现在 DSL 定义关系图较低的权限,在 关系图元素 列。 您可能必须移动到右侧以查看它。 它通常名为 TheDsl关系图

  • 如果使用了 任务流 模板,并希望使用泳道创建关系图,保留并将参与者域类和 ActorSwimlane 形状进行重命名。

删除或给其他类重命名为匹配管理上。

定义的 DSL 模式

建议您通过一次添加或调整两个功能开发一个 DSL。 再添加一个函数,运行 DSL 并测试程序,然后添加两个功能。 DSL 的典型的函数可能是:

  • 域类,连接元素到设计的嵌入的关系,形状要求到该类中显示元素在关系图上并让用户创建组件的元素工具。

  • 在形状显示这些字段类和修饰器的字段的特性。

  • 引用关系并将其显示在关系图和连接线工具允许用户创建链接的连接。

  • 需要程序代码的自定义设置,如验证约束或菜单命令。

以下各节介绍如何生成最有用的类型 DSL 功能。 具有 DSL 可以构造的许多其他模式,但是,这些是最常用的。

备注

在添加功能后,不要忘记单击在解决方案资源管理器工具栏中 转换所有模板 ,可以在编译和运行 DSL 之前。

下图显示了类并使用本主题例如使用 DSL 的关系部件。

嵌入关系和引用关系

下一个图形是此示例 DSL 模型:

生成的 DSL 实例模型

备注

“模型”是指用户创建 DSL 的实例且通常显示为关系图。本主题讨论 DSL 定义关系图和显示的模型关系图使用 DSL。

定义字段类

域类表示 DSL 的概念。 实例是 模型元素。 例如在 MusicLibrary DSL 您可能有一个名为 Album 和歌曲的域类。

若要创建域类,您可以从 命名的 Domain Class 工具拖到关系图,然后将该类重命名为。

有关更多信息,请参见 域类的属性

Bb126581.collapse_all(zh-cn,VS.110).gif创建每个域类的一个嵌入的关系

每个域类,但根类必须至少一个嵌入关系的目标也必须从是一个嵌入关系的目标的类继承。

在设计,每个模型元素是在嵌入关系单个树中的节点。 一个嵌入关系的源和目标通常称为父任务和子级。

父的选择域类的取决于您要元素的生存期依赖其他组件。 如果树的节点中删除,子树通常删除。 具有独立存在元素的类因而也嵌入直接在根类下。

通常,因此,如果显示在另一个元素内的元素,要指示所有者关系。 在这种情况下,最合适的父类是容器的类。 异常是您会看到在容器内部的项目实际上是引用链接到独立组件。 在这种情况下,删除容器中删除引用,但没有其目标。

在本主题中描述的 DSL 定义的模式,我们假定,元素将显示在容器内部将被删除,在容器中删除。 更复杂的模式是可能的,可以通过定义规则来实现。

元素的显示方式。

父 () 嵌入类

在 DSL 解决方案模板的示例

关系图上的形状。

条泳道。

DSL 根类。

最小的语言。

任务流:参与者类。

在条泳道的形状。

显示为泳道元素的字段类。

任务流:任务类。

项目在形状列表,项目中删除,如果容器中删除。

形状边缘的端口。

映射到容器形状的域类。

类图:特性类。

组件图:端口类。

,如果容器中删除,项列表,不删除。

DSL 根类。

列表显示引用链接。

不直接公开。

它构成部分的类。

在下库的示例中,相册显示为歌曲的标题列表的矩形。 因此相册父是根类下,因此,一个父级为相册。

创建域类及其同时嵌入,单击 嵌入关系 工具,再单击父类,然后单击关系图的空白部分。

,因为它们将自动跟踪,类名来调整该嵌入的关系及其角色的名称通常并不是必需的。

有关更多信息,请参见域关系的属性域角色的属性

备注

嵌入与继承。一个嵌入关系的子项不继承其父的功能。

Bb126581.collapse_all(zh-cn,VS.110).gif添加字段特性添加到每个域类

字段属性存储值。 示例包括:名称,前缀,出版日期。

单击在类的 字段的特性 ,按 enter 键,然后键入属性的名称。 字段的特性的默认类型为字符串。 如果要更改类型,选择字段的特性,并在 属性 窗口的 类型 。 如果所需的类型不在下拉列表,请参见 将属性类型。

**设置元素的特性。**选择可用于标识在语言资源管理器元素的一个字段的特性。 例如,在一个域类可以选择标题字段的特性。 在 属性 窗口中,将 是元素名称 到 true。

Bb126581.collapse_all(zh-cn,VS.110).gif创建派生的域类

如果希望字段类具有继承其属性和关系的变量,创建从该类派生的类。 例如,相册可能有派生类 WMA 和 MP3。

使用 域类 工具,创建派生类。

单击 继承 工具,请单击该派生类,然后单击基类。

考虑将基类的 继承修饰符摘要。 如果您认为可能需要基类的实例,请考虑创建自己的单独派生类。

派生类继承其基类的属性和角色。

Bb126581.collapse_all(zh-cn,VS.110).gif排列 DSL 定义关系图

在添加关系,某些类于多个具有将出现。 若要减少外观的数量和使关系图更宽,右击关系的目标类,然后单击 将树此处。 该计数器的效果,右击关系的目标类并单击 拆分树。 如果看不到这些菜单命令,请确保仅字段类中选择。

使用 CTRL+Up 和 CTRL+Down 移动域类和形状类。

Bb126581.collapse_all(zh-cn,VS.110).gif测试域类

测试新字段类

  1. 单击转换 在解决方案资源管理器工具栏上的所有模板 ,生成 DSL 设计器代码。 您可自动执行此步骤。 有关更多信息,请参见 如何:自动转换所有模板

  2. **生成并运行 DSL。**按 F5 或 ctrl+f5 运行 Visual Studio 新实例以实验模式。 在 Visual Studio的实验实例中,打开或创建一个具有 DSL 的文件扩展名的文件。

  3. 打开资源管理器。在关系图的一侧是语言资源管理器窗口,通常名为 TheLanguage 资源管理器。 如果看不到此窗口,它可能在解决方案资源管理器下的选项。 如果找不到它,请在 视图 菜单上,指向 其他窗口,然后单击 TheLanguage资源管理器

    此时将资源管理器存在该模型的树视图。

  4. **创建新元素。**右击根节点在顶层,然后单击 添加新TheClass。

    类的新实例将出现语言资源管理器。

  5. 验证每个实例都有一个不同的名称,在创建新的实例。 ,仅当您在字段的特性,的 是元素名称 标志这将导致。

  6. **检查字段的特性。选定类的实例,**请检查 " 属性 " 窗口。 它应表示字段的特性,在此域类定义。

  7. 保存文件,将其关闭,然后重新打开它。 您创建的所有实例都应可见在编辑器中,资源管理器,然后展开节点之后。

定义关系图上的形状

可以定义显示在关系图上作为一个矩形、椭圆或图标元素的类。

定义显示为关系图上的形状元素的类

  1. 定义和测试域类中定义字段类所述**。**

    • 类的父级应当是根类。 即应具有根类和新字段类之间的一个嵌入的关系。

    • 如果图具有泳道,父可以将其映射到条泳道的域类。 在继续此过程之前,请参见 定义具有泳道的 DSL。

  2. 添加形状类 表示模型关系图上的元素。 在 DSL 定义关系图上的以下任一工具拖动:

    • 几何形状 提供一个矩形或椭圆。

    • 图像形状 显示您提供的图像。

    • 形状隔离舱 是包含一个或多个列表项的矩形。

    对形状类重命名为,在 DSL 定义关系图的右侧会显示,则形状和连接线下。

  3. ,如果创建了图形形状,定义一个图像

    1. 创建任意大小图像文件。 BMP、 GIF 和 JPEG、 EMF 布局的支持。

    2. 在解决方案资源管理器中,将文件添加到解决方案在 DSL \Resources 下。

    3. 返回 DSL 定义关系图并选择新图像形状类。

    4. 在 " 属性 " 窗口中,单击 图像 属性。

    5. 选择图像 对话框中,单击下拉菜单中 文件名下,并选择图像。

  4. 添加文本修饰器。形状,显示字段的特性。

    若要显示模型元素的名称或前缀,您可能需要至少一个文本修饰器。

    右击形状类的头,指向 添加,然后单击 text 修饰器。 设置一个修饰器的名称,并且,在 " 属性 " 窗口中设置其 位置

  5. 在关系图元素映射将每个形状。它应该显示的字段类

    单击 关系图元素映射 工具,再单击域类,然后单击形状类。

  6. 属性映射到文本修饰器。

    1. 选择在域类和表示关系图元素映射的形状类之间的灰色行。

    2. DSL 详细信息 窗口中,单击 修饰器映射 选项。 如果看不到 DSL 详细信息 窗口,请在 视图 菜单上,指向 其他窗口 然后单击 DSL 详细信息。 会引发此窗口的顶部看到所有内容通常是必需的。

    3. 选择修饰器的名称。 在 显示属性下,选择域类的属性的名称。 重复此每个修饰器的。

      如果要显示一个相关元素的属性,请单击下拉树浏览器在 显示特性的路径下。

    4. 确保复选标记在每个修饰器名称显示在中。

    形状映射和 DSL 详细信息窗口

  7. 使创建的域类的元素的工具箱项。

    1. DSL 资源管理器,展开 编辑 节点及其所有子节点。

    2. 右击与 DSL 相同的节点。 " 工具箱 " 选项卡 下,例如 MusicLibrary。 单击 添加元素工具

      备注

      如果右击 工具 节点,将不显示 添加元素工具。相反,单击在中的节点。

    3. 在具有选定的新元素工具的 " 属性 " 窗口中,将 到最近添加的域类。

    4. 设置 声明工具提示

    5. 设置 工具箱图标 要显示在工具箱的图标。 您可以将其设置为用于其他工具或图标已的新图标。

      创建新的图标,打开在 解决方案资源管理器的 DSL \Resources。 复制和粘贴一个现有的元素工具 BMP 文件。 请在粘贴的副本重命名,然后双击编辑它。

      返回 DSL 定义关系图,选择工具,以及在 工具箱图标的 " 属性 " 窗口中单击 [...] 。 在 选择位图 对话框中,选择 .BMP 文件从下拉菜单。

有关更多信息,请参见几何形状的属性图像形状的属性

测试形状

  1. 单击转换 在解决方案资源管理器工具栏上的所有模板 ,生成 DSL 设计器代码。

  2. **生成并运行 DSL。**按 F5 或 ctrl+f5 运行 Visual Studio 新实例以实验模式。 在 Visual Studio的实验实例中,打开或创建一个具有 DSL 的文件扩展名的文件。

  3. 验证元素工具出现在工具箱中。

  4. 通过将创建形状 从一个模型关系图上的工具。

  5. 验证每个文本修饰器,将出现 ,并且:

    1. ,除非您将在字段的特性,的 是只读的 UI 标志可以编辑该测试。

    2. 在编辑属性窗口或在一个修饰器时,另一个视图更新。

在首次研究形状后,您可能需要调整其某些属性并添加一些高级功能。 有关更多信息,请参见 自定义和扩展域特定语言

定义引用关系

可以定义任意源字段的类或任何目标域类之间的引用关系。 引用关系通常会显示在关系图作为连接,是在形状之间的行。

例如,因此,如果音乐相册和艺术家显示为关系图中的形状,您可以定义一个关系名为该 ArtistsAppearedOnAlbums 艺术家链接到这些工作的相册。 有关在该图中的示例。

生成的 DSL 实例模型

引用关系还可以链接相同类型的元素。 例如,在表示系族树的 DSL,父及其子控件之间的关系是从面对面的引用关系。

Bb126581.collapse_all(zh-cn,VS.110).gif定义一个引用关系

单击引用关系工具,再单击该关系的源域类,然后单击目标域类。 目标类可以是相同的源类。

每个关系有两个角色,由行在关系框中的每一端。 可以选择每个角色和设置其属性窗口。

向角色考虑重命名列。 例如,在人员之间的关系和人员,您可能希望更改默认名称添加到父工作项和子、管理器以及下属,内容和 student,依此类推。

,如有必要,调整每个角色重数。 如果希望每个人最多具有一个管理器,设置在关系图管理器的标签下方到的重数 0..1。

**添加字段属性设置为该关系。**在该图中,艺术家相册关系具有角色的属性。

此外,如果多同一个类的链接可以存在于同一之间对模型元素,设置关系allow duplicates属性 。 例如,您可以允许帮助指导多个受同一个学生。

连接线的形状映射

有关更多信息,请参见域关系的属性域角色的属性

Bb126581.collapse_all(zh-cn,VS.110).gif定义连接显示关系

连接线显示在两个形状之间的一行在模型关系图。

拖动到 DSL 定义关系图上的 连接 工具。

,如果要显示在连接,的标签添加文本修饰器。 设置其位置。 若要允许用户移动文本修饰器,请设置其 是可移动的 属性。

使用 关系图元素映射 工具与引用关系链接连接。

当关系图元素映射中选择,打开 DSL 详细信息 窗口,并打开 修饰器映射 选项。

选择每 修饰器 并将 显示属性 到正确的字段的特性。

确保复选标记在 修饰器 的每个项旁边的列表。

Bb126581.collapse_all(zh-cn,VS.110).gif定义连接生成器工具

DSL 资源管理器 窗口中,展开 编辑 节点及其所有子节点。

右击与 DSL 相同的节点,然后单击 添加新连接工具

当新工具时,在 " 属性 " 窗口:

  • 设置 声明工具提示

  • 单击 连接生成器 并为新关系选择适当的生成器。

  • 设置 工具箱图标 到图标要显示在工具箱中。 您可以将其设置为用于其他工具或图标已的新图标。

    创建新的图标,打开在 解决方案资源管理器的 DSL \Resources。 复制和粘贴一个现有的元素工具 BMP 文件。 请在粘贴的副本重命名,然后双击编辑它。

    返回 DSL 定义关系图,选择工具,以及在 工具箱图标的 " 属性 " 窗口中单击 [...] 。 在 选择位图 对话框中,选择 .BMP 文件从下拉菜单。

测试引用关系和连接

  1. 单击转换 在解决方案资源管理器工具栏上的所有模板 ,生成 DSL 设计器代码。

  2. **生成并运行 DSL。**按 F5 或 ctrl+f5 运行 Visual Studio 新实例以实验模式。 在 Visual Studio的实验实例中,打开或创建一个具有 DSL 的文件扩展名的文件。

  3. 验证连接工具出现在工具箱中。

  4. 通过将创建形状 从一个模型关系图上的工具。

  5. 创建 形状之间的连接 。 单击连接工具,单击形状,然后单击另一个形状。

  6. **验证是否不能创建不适当的类之间的连接。**例如,因此,如果该关系在相册和艺术家之间,请验证您不能与艺术家链接艺术家。

  7. 验证重数是正确的。 例如,请验证是否不能连接人员到多个管理器。

  8. 验证每个文本修饰器,将出现 ,并且:

    1. ,除非您将在字段的特性,的 是只读的 UI 标志可以编辑该测试。

    2. 在编辑属性窗口或在一个修饰器时,另一个视图更新。

在首次研究连接后,您可能需要调整其某些属性并添加一些高级功能。 有关更多信息,请参见 自定义和扩展域特定语言

定义包含的形状列表:形状隔离舱

形状隔离舱包含一个或多个列表项。 例如,在下库 DSL,可以使用隔离舱形状表示音乐相册。 在每个相册,有几个列表。

隔离舱形状

在实现在 DSL 定义的这种影响最简单的方法,则定义容器中的域类,因此,每个的一个域类的列表。 容器类映射到形状隔离舱。

形状映射

有关更多信息,请参见 分段形状的属性

定义形状隔离舱

  1. 创建容器域类。 单击 嵌入关系 工具,请单击该模型的根类,然后单击 DSL 定义关系图的空白部分。 这将创建该示例简图名为 Album 的域类。

    或而不是嵌入在根类,则在映射到条泳道的域类中嵌入容器。

    添加字段特性 (如名称到类中,并将其在 " 属性 " 窗口中 是元素名称 标志。

  2. 创建列表项字段类。 单击 嵌入关系 工具,单击容器类 (相册) 然后单击关系图的空白部分。 这将创建该示例简图名为 Song 的域类。

    添加字段特性 (如标题到类中,并将其 是元素名称 标志。

    添加其他字段的特性。

    添加另一个列表中每个的域类列表要显示。

  3. 若要组合几种类型的项列表中的,创建从列表类继承的类。 通过设置其 继承修饰符进行列出类摘要。

    例如,因此,如果要古典音乐由作曲家排序而不是艺术家,可以创建一个、 ClassicalSong 和 NonClassicalSong 两个子类。

  4. 创建形状隔离舱。 在 DSL 定义关系图上的 形状隔离舱 工具拖动。

    添加一个文本修饰器并设置其名称。

    添加隔离舱并设置其名称。

  5. 若要让用户隐藏的隔离舱中,右击形状隔离舱类,指向 添加,然后单击 展开/折叠修饰器。 在 " 属性 " 窗口中,将一个修饰器的位置。

  6. 单击 关系图元素映射 工具,单击容器域类,然后单击形状隔离舱。

  7. 选择域类和形状之间的关系图元素映射链接。 在 DSL 详细信息 窗口:

    1. 单击 修饰器 选项。 单击一个修饰器的名称然后选择适当的项。 显示属性下。 确保复选标记在一个修饰器的名称旁边是否显示。

    2. 单击 隔离舱映射 选项。

      单击隔离舱的名称。

      显示元素集合路径下,导航到列表元素类 (歌曲)。 单击下拉箭头使用浏览器工具。

      显示属性下,选择列表中应该显示的属性。 在此示例中,这是标题。

备注

通过在修饰器映射和隔离舱映射的路径字段字段,可以使字段类和形状隔离舱之间的更复杂的关系。

定义用于创建形状的工具

  1. 使创建的域类的元素的工具箱项。

  2. DSL 资源管理器,展开 编辑 节点及其所有子节点。

  3. 右击与 DSL 相同的节点。 " 工具箱 " 选项卡 下,例如 MusicLibrary。 单击 添加元素工具

    备注

    如果右击 工具 节点,将不显示 添加元素工具。相反,单击在中的节点。

  4. 在具有选定的新元素工具的 " 属性 " 窗口中,将 到最近添加的域类。

  5. 设置 声明工具提示

  6. 设置 工具箱图标 要显示在工具箱的图标。 您可以将其设置为用于其他工具或图标已的新图标。

    创建新的图标,打开在 解决方案资源管理器的 DSL \Resources。 复制和粘贴一个现有的元素工具 .BMP 文件。 请在粘贴的副本重命名,然后双击编辑它。

    返回 DSL 定义关系图,选择工具,以及在 工具箱图标的 " 属性 " 窗口中单击 [...] 。 在 选择位图 对话框中,选择 BMP 文件从下拉菜单。

测试形状隔离舱

  1. 单击转换 在解决方案资源管理器工具栏上的所有模板 ,生成 DSL 设计器代码。

  2. **生成并运行 DSL。**按 F5 或 ctrl+f5 运行 Visual Studio 新实例以实验模式。 在 Visual Studio的实验实例中,打开或创建一个具有 DSL 的文件扩展名的文件。

  3. 验证工具出现在工具箱中。

  4. 拖动到模型关系图上的工具。 形状创建。

    验证该元素的名称自动显示和设置为默认值。

  5. 右击新形状的标题,然后单击添加 列表项。在此示例中,则命令将添加一个。

    验证项目出现在列表中,并且具有新名称。

  6. 列表项中单击一,然后检查 " 属性 " 窗口。 您应看到列表项的属性。

  7. 打开语言资源管理器。 验证您可以查看具有内部列表项节点的容器节点。

生成的 DSL 资源管理器

在首次研究形状隔离舱后,您可能需要调整其中的一些属性和添加一些高级功能。 有关更多信息,请参见 自定义和扩展域特定语言

Bb126581.collapse_all(zh-cn,VS.110).gif显示在隔离舱的引用链接

通常,在隔离舱显示的元素由隔离舱形状表示元素的子元素。 但是,有时,您希望显示链接到它的引用关系的元素。

例如,我们可以添加第二隔离舱到显示艺术家列出了与相册链接的 AlbumShape。

在这种情况下,您应显示该链接,而不是被引用的元素。 这是因为,,当用户选择在隔离舱并按 delete 项时,希望该链接将被删除,而不是被引用的元素。

但是,您可以由引用的元素的名称出现在隔离舱。

以下过程假定,在本节中创建了域类、引用关系、隔离舱形状和关系图元素映射,如前面所述。

若要显示引用链接在隔离舱

  1. 添加隔离舱到形状隔离舱。 在 DSL 定义关系图,右击形状隔离舱类,指向 添加,然后单击 隔离舱

  2. 设置 显示元素集合路径 导航到该链接,而不是其目标元素。 单击下拉菜单并使用树视图中选择引用关系而不是其目标。 在此示例中,关系是 ArtistAppearedOnAlbums。

  3. 设置 显示特性的路径 从该链接导航到目标元素。 在此示例中,这是艺术家。

  4. 设置 显示属性 到目标元素,如名称的相应属性。

  5. 转换所有模板,生成并运行 DSL,并打开测试模型。

  6. 在模型关系图,请创建形状相应的类,设置其名称,并创建它们之间的链接。 在隔离舱形状,链接元素的名称应显示。

  7. 选定链接或项目在形状隔离舱。 该链接和项目应消失。

定义另一个形状边界的端口

端口是否位于另一个形状边界的形状。

端口在另一个形状还可用于提供了内置的连接点,用户可以绘制连接。 在这种情况下,可以使端口形状透明。

若要查看使用端口的示例,请选择 组件图 模板,您可以创建一个新的 DSL 解决方案时。 此示例演示知识可以可以考虑定义端口:

  • 具有表示端口的容器的域类, Component。

  • 具有表示端口的域类。 在此示例中,这是 ComponentPort。

  • 具有从容器域类的一个嵌入的关系到端口域类。 有关更多信息,请参见 定义字段类。

  • 如果同一个容器需端口不同类型的组合,可以创建端口域类的子类。 在此示例中, InPort 和 OutPort 从 ComponentPort继承。

  • 容器域类可以映射到任何形状。 在此示例中,它是 ComponentShape。 有关更多信息,请参见 定义形状。

  • 端口域类映射到端口形状。 可以映射派生类分隔端口形状类,或者映射基类为一个端口形状类。

在其他方面,端口形状正常工作 定义形状所述。

有关更多信息,请参见 端口形状的属性

定义具有泳道的 DSL

泳道是关系图中的水平或垂直分区。 每条泳道对应于一个模型元素。 DSL 定义为条泳道元素都需要域类。

最好的方式创建泳道 DSL 将创建一个新的 DSL 解决方案并选择任务流解决方案模板。 在 DSL 定义参与者,类是域类映射到条泳道。 将此和其他类重命名为适合该项。

若要添加将显示为在条泳道内的形状的类中,创建条泳道类和新类之间的一个嵌入的关系。 用户将能够从一条泳道中拖动元素到另一个,但是,每个元素始终在特定条泳道中。 在任务流解决方案模板, FlowElement 是条泳道类的子级。

若要添加将显示为形状独立泳道的类,请创建一个根类和新类之间的一个嵌入的关系。 用户可以将这些形状关系图上的任意位置,包括在泳道和外部跨边界泳道。 在任务流解决方案模板,注释是根类的子级。

有关更多信息,请参见 泳道属性

将属性类型

Bb126581.collapse_all(zh-cn,VS.110).gif字段枚举和文本

字段枚举是具有多个文本值的类型。

若要添加字段枚举,右击模型的根在 DSL 资源管理器 的然后单击 添加新字段枚举。 该组件将出现在 DSL 资源管理器字段类型 节点下。 此元素不在关系图中显示。

若要添加枚举文本到字段枚举,右击 " DSL 资源管理器 的字段枚举然后单击 添加新的枚举文本

默认情况下,枚举类型的属性一次只能设置为枚举的值。 如果您希望用户,然后的程序员可以设置值的任意组合 - “位域” - 设置枚举 IsFlags 属性。

Bb126581.collapse_all(zh-cn,VS.110).gif外部类型

当您将字段设置属性的类型,因此,如果没有找到该类型在的 类型 希望下拉列表,可以添加外部类型。 例如,可以添加 System.Drawing.Color 类型到列表中。

若要添加类型,右击模型的根在 DSL 资源管理器中的,然后单击 添加新的外部类型。 在 " 属性 " 窗口中,将名称设置为 Color 和命名空间对 System.Drawing。 此类型现在显示在 DSL 资源管理器中 字段类型下。 可以选择它,只要字段设置属性的类型。

自定义 DSL

使用本主题中介绍的方法,您可以用图表表示法、一个可读取的 XML 形式和需要生成代码和其他项目的基本工具快速创建 DSL。

具有扩展 DSL 定义两个方法:

  1. 通过使用 DSL 定义的更多功能,优化 DSL。 例如,可以创建能创建连接线的多种类型的单个连接线工具,因此,您可以控制删除一个元素也删除相关元素的规则。 这些方法通过在 DSL 定义的值主要实现,因此,某些文档中添加几行代码。

    有关更多信息,请参见 自定义和扩展域特定语言

  2. 扩展建模工具使用程序代码达到更高级的效果。 例如,可以创建能更改模型的菜单命令,因此,您可以创建集成两个或多个 DSL 的工具。 VMSDK 专门设计以便于集成与 DSL 定义生成的代码的扩展。 有关更多信息,请参见 编写代码以自定义域特定语言

Bb126581.collapse_all(zh-cn,VS.110).gif更改 DSL 定义

在 DSL 定义时创建所有项目,许多默认值自动设置。 在这些设置后,可以更改它们。 这简化了 DSL 的开发,那么,当仍允许强大的自定义项时。

例如,在中,在映射形状的元素时,映射的父元素路径基于域类的嵌入的关系自动设置为。 但是,因此,如果最新更改该嵌入的关系,父元素的路径不会自动更改为。

因此您应该知道,当您更改在 DSL 定义中的某些关系,而不是情况的错误报告为,则在保存该定义时,或者,在您转换所有模板时。 大部分错误很容易修复。 双击错误报告捕获错误的位置。

另请参见如何:更改域特定语言的命名空间

疑难解答

下表列出了遇到的一些常见问题,当您设计一个 DSL 时,与其解决方案的建议。 更多的可用 Visualization Tools Extensibililty Forum

问题

建议

我在 DSL 定义文件所做的更改不起作用。

单击工具栏上的 转换所有模板 在解决方案资源管理器中,然后重新生成解决方案。

形状以修饰器的名称而不是属性值。

设置修饰器映射。 在 DSL 定义关系图,请单击关系图元素映射,是在域类和形状类之间的灰色行。

打开 DSL 详细信息 窗口。 如果看不到它,请在 " 视图 " 菜单上,指向 其他窗口,然后单击 DSL 详细信息

单击 修饰器映射 选项。 选择一个修饰器的名称。 确保在其旁边的框处于选中状态。 在 显示属性下,选择字段的特性的名称。

有关更多信息,请参见 关系图上的形状。

在 DSL 资源管理器中,我无法添加到集合中。 例如,在中,当我右击工具时,则在菜单的 “添加工具”命令。

在 " 我的 DSL 的资源管理器,我无法将元素添加到列表中。

右击在尝试的节点上的项。 当要添加到列表时,将向命令不在列表节点,但是,在其所有者。

我创建的字段类,但是,我在语言资源管理器无法创建实例。

除了根的每个域类必须是一个嵌入关系的目标。

在 " 我的 DSL 的资源管理器,元素仅显示与其类型名称。

在 DSL 定义,选择类的一个字段的特性,并在 " 属性 " 窗口设置 是元素名称 为 true。

我的 DSL 在 XML 编辑器始终打开。

文件时,在读取时,这可能会由于错误。 但是,在中,在修复该错误后,必须显式重置编辑器是 DSL 设计器。

右击项目项,单击 打开。 并选择 TheLanguage设计器 (默认值)

,在 " 我更改了程序集名称后, " 工具箱 " 我的 DSL 不会出现。

检查并更新 DslPackage\GeneratedCode\Package.tt 有关更多信息,请参见 如何:更改域特定语言的命名空间

工具箱 " 我的 DSL 未显示,但是,我未更改程序集名称。

或者,将出现一个消息框报告无法加载扩展。

重置的实验实例中,并重新生成解决方案。

  1. 在窗口中启动菜单上,在 所有程序下,展开 Visual Studio SDK,然后 工具,然后单击 重置 Microsoft Visual Studio 的实验实例

  2. 在 Visual Studio生成 菜单上,单击 重新生成解决方案

请参见

任务

创建基于 Windows 窗体的域特定语言

概念

域特定语言入门

创建基于 WPF 的域特定语言