了解模型、类和关系
域特定语言 (DSL) (dsl) 由其 DSL 定义文件中定义的,并使用编写的所有用户程序代码。 大多数在 DSL 解决方案的程序代码从该文件生成。
本主题说明 DSL 定义的核心功能。
DSL 定义
当您打开 Dsl\DslDefinition.dsl时, Visual Studio 窗口类似于下图。
在 DSL 定义的重要信息在 DSL 定义关系图中显示。 附加信息,也是 DslDefinition.dsl 的部分,在 DSL 资源管理器中显示,通常出现在关系图的。 使用最常见的任务的关系图和处理更高级的自定义项的 DSL 资源管理器一起使用。
DSL 定义图演示了定义模型元素的域类和定义模型元素之间的链接关系。 它还演示了用于显示模型元素对用户的形状和连接线。
当您在中选择 DSL 定义的项目,在关系图上或在 DSL 资源管理器时,有关它的信息显示在 " 属性 " 窗口中。 附加信息在 DSL 详细信息 " 窗口可能会显示。
模型是 DSL 实例
模型 是用户创建的 DSL 的实例。 设计包含模型元素,为域类的实例您定义和链接元素之间,为域关系实例您定义。 模型可能还有形状和连接线,显示模型元素和链接在关系图上。 DSL 定义包括形状类、 connect 类和类图的。
也称为 DSL 定义为 域模型。 DSL 定义或域模型为域特定语言 (dsl) 设计时表示,因此,当设计为域特定语言 (dsl) 运行时实例化。
域类定义模型元素
域类在字段用于创建各种元素,并且,字段关系是元素之间的链接。 它们是由这种设计语言特定的用户实例化组件的设计时表示和链接,在创建它们的设计时。
此图显示由音乐库 DSL 的用户创建的一个模型。 music 相册由包含列表歌曲的框中表示。 艺术家由圆形将方的框表示和连接到它们分配给特定的相册。
DSL 定义分隔两个方面。 通过使用形状类和 connect 类,模型元素的外观在模型关系图的定义。 使用域类和域关系,信息传送该模型中定义。
下面的插图音乐库的 DSL 定义显示字段类和关系。
此图显示了域类:music、相册、艺术家和歌曲。 域类定义字段特性 (如名称,前缀,依此类推。 在实例模型,其中某些属性的值在关系图中显示。
类之间是域关系:MusicHasAlbums、 MusicHasArtists、 AlbumbHasSongs 和 ArtistAppearedOnAlbums。 关系的重数例如 1..1, 0。*。 例如,每首歌必须与正好一个相册相关通过 AlbumHasSongs 关系。 每个相册可以具有任意数量的歌曲。
重新排列 DSL 定义关系图
通知域类可以出现在 DSL 定义关系图中多次,相册,此图片执行。 始终有一个主要视图,因此,可以有一些 引用 视图。
若要重新排列 DSL 定义关系图,您可以:
使用 将树此处 和 拆分树 命令,交换主要和引用视图。 右击单个字段类查看这些命令。
按 Ctrl+Up 和 Ctrl+Down 重新排列字段类和形状类。
折叠或展开类使用图标在右上角每个形状。
树的折叠部件通过单击减号 (-) 在域类的底部。
Inheritance
使用继承,字段类中定义。 若要创建继承派生,单击继承工具,请单击该派生类,然后单击基类。 一个模型元素具有本身是定义的字段类的所有属性,而从基类继承的所有属性。 它还继承其在关系的效果。
继承也可在关系、形状和连接线之间。 继承必须在同一组内保持。 形状不能从域类继承。
域关系
模型元素可由关系链接。 链接始终二进制;它们完全链接两个元素。 但是,任何元素可能具有很多链接到其他对象,并且,甚至可能有多个之间的链接元素对。
就象可以定义组件不同的类,可以定义链接不同的类。 链接的类称为 域关系。 域关系指定元素的类的实例可以连接。 关系的每一端调用 角色,并且,字段关系定义名称两个角色,以及对于关系。
有两种域关系:嵌入关系和引用关系。 在 DSL 定义关系图,嵌入关系具有实线在每个角色,引用关系具有虚线。
嵌入关系
在一个模型中的每个元素,只不过其根,是一个嵌入链接的目标。 因此,单个树嵌入链接的整个模型构成。 一个嵌入的关系表示包容或所有权。 此类相关也称为的两个模型元素是父元素和子元素。 子级在父被视为嵌入。
嵌入链接未显式通常显示为关系图的连接。 相反,它们由包容通常表示。 该模型的根由关系图表示,因此,其中嵌入的元素显示为关系图上的形状。
在此示例中,根类音乐对相册的一个嵌入的关系 MusicHasAlbums,具有嵌入的 AlbumHasSongs 到歌曲。 首歌都显示为一个列表项在每个相册中。 music 还具有嵌入的 MusicHasArtists 到艺术家类的实例,将显示为关系图上的形状。
默认情况下,那么,当其父删除过程中,嵌入元素会自动被删除。
当设计保存到文件是 XML 格式时,嵌入元素嵌套在其父内,,除非自定义序列化。
备注
嵌入与继承。一个嵌入关系的子项不继承父级的属性。嵌入是链接类型的模型元素之间的。继承是类之间的关系并不创建模型元素之间的链接。
嵌入规则
在实例模型中的每个元素必须是正好一个嵌入链接的目标,但该模型的根。
因此,每个非抽象域类,除此之外,根类,必须至少一个嵌入关系的目标,或者必须继承一嵌入基类。 类可以是两个或多个嵌入的目标,但是,它的实例的模型元素可以一次只能有一个父级。 multiplicity 从目标添加到源必须是 0..1 或 1..1。
嵌入资源管理器中显示的树
DSL 定义或创建一个资源管理器,用户及它们的模型关系图参见。
此时将资源管理器在模型中所有元素,甚至尚未定义任何形状。 它显示组件和嵌入关系,但是,不引用关系。
若要查看元素的字段的特性的值,用户选择一个元素,该模型关系图或模型资源管理器,并打开 " 属性 " 窗口。 它显示所有字段的特性,包括在关系图那些不显示的元素。 在此示例中,每一个具有标题和一种风格,但是,前缀的值仅在关系图上显示。
引用关系
引用关系表示不嵌入的任何关系。
引用关系通常会显示在关系图作为在形状之间的连接。
使用 标记,在设计的 XML 表示形式,两个元素间的引用链接表示 。即标记是唯一地标识模型中的每个元素的名称。 每个模型元素的 XML 节点包含指定该关系名称和另一个元素的标记的一个节点。
角色
每个字段关系有两个角色、一个源角色和一个目标角色。
在图,发行者域类和 PublisherCatalog 域关系之间的行是源角色。 在域关系和相册域类之间的行是目标角色。
名称与关系尤其重要,当您编写遍历该模型的程序代码。 例如,那么,当您生成 DSL 解决方案时,生成的类发行者拥有是相册的集合的属性内容。 类相册有类发行者的单个实例的特性发行者。
在 DSL 定义时创建关系,为属性和关系名称的默认值。 但是,您可以更改它们。
重数
重数指定多少个元素可以有在域关系的同一角色。 在此示例中,零到许多 (0。*) 将内容角色的重数指定发行者域类的所有实例可以有多个 PublisherCatalog 关系链接,当要为其赋予。
配置一个角色的重数通过键入在关系图或通过修改 Multiplicity 属性。 属性 窗口。 下表描述此属性的设置。
multiplicity 类型 |
说明 |
---|---|
0。* (对于许多零) |
域类的每个实例不能具有该关系的多个实例或该关系的实例。 |
0..1 (零到一个) |
域类的每个实例可有多关系或不带关系的实例的一个实例。 |
1..1 (1) |
域类的每个实例可能为的关系的一个实例。 不能创建超出此关系一个实例从角色类的实例的。 验证有效,则将出现验证错误角色类的所有实例没有该关系的实例。 |
1. * (一对多个) |
类的每个实例都具有此多样性的角色的可能为的关系的多个实例和每个实例必须具有该关系的至少一个实例。 验证有效,则将出现验证错误角色类的所有实例没有该关系的实例。 |
为类的字段关系
链接在存储表示为 LinkElement 实例,是 ModelElement 派生类。 可以在域模型关系图的这些特性在域关系。
还可以使关系该源或目标其他关系。 在域模型关系图,右击域关系然后单击 公开为类。 一个其他的类框中将显示。 然后可以连接到它的关系。
就象可以与域类,可以通过继承部分定义关系。 选择该派生的关系并在 " 属性 " 窗口中设置 基本关系 。
派生的关系专用其基本关系。 其链接应派生自的域类或以及基本关系链接的类同名。 当从派生的关系的链接在设计时创建,它是派生的和基本关系实例。 在过程代码中,可以导航到该链接的相对端使用属性生成了由基础或由该派生类。