Visual Studio特定领域开发中生成域类和域关系

开发 后端
我们之前介绍过Visual Studio特定领域开发,在这里我们将详细的讲述如何生成域类和域关系。

Visual Studio DSL也成为Visual Studio特定领域开发,之前我们报道过《浅析Visual Studio中的特定领域开发》,而本文也是Visual Studio特定领域开发系列文章中关于生成域类和域关系的部分。

#T#

上一节我们大概介绍了一些Vs.net Dsl的域模型的一些基本的概念,这一节我们再回到我们生成的LanuageSm项目,看一下生成的域类以及域关系,介绍一下Dsl运行时的Store,然后再来介绍一下需要注意的一些关键点。为我们下一节具体设计我们自己的Dsl做最后的准备. 

1. 首先找到Dsl项目中模板DomainClasses.tt生成的DomainClasses.cs,我们来查看一下它由两个类组成: 

ClassDiagram1 

其实也就对应着我们域模型中的根域类ExampleModel和域类ExampleElement.我们仔细再来看一下ExampleElement类的具体结构.可以发现: 

1).字段是Guid类型的,这样更方便关系类中直接引用属性,后续我们也会发现在验证,规则中也会经常使用属性的Guid字段变量来代表属性. 

2).我们看到上一节我们看到的关系生成的属性,ExampleElement与ExampleModel的嵌入关系,生成了ExampleModel类型的ExampleModel属性.   ExampleElement与自身的引用关系,由于重数是*,生成了强集合类型LinkedElementCollection<ExampleElement>属性. 

3).属性中的Name代表域类的域属性Name。

2. 我们再来看一下域关系,找到DomainRelationships.tt生成的类文件DomainRelationships.cs,查看类图,显示类图中的属性为关系或者是组合关系: 

域关系

1)可以看到域关系对应的类通过Guid对应的字段关联域类. 

2)通过上面的类图,可以看到域关系类对应的属性与域类的关系,它分别存储了关系对应的源Source和目标Target的属性。 

3)我们可以找到一些静态方法,比如在ExampleModelHasElements类中:

GetElements(ExampleModel)  ---  获取关系中一个ExampleModel对应的所有的ExampleElement 

GetExampleModel(ExampleElement)  --获取关系中一个ExampleElement对应的ExampleModel 

另外还可以通过GetLink,GetLinks, GetLinksToElements,获取指定元素之间的关系。 

3.很有必要在这里也对Dsl的运行的机制有一些了解 ,那就必须在这里介绍一下Store. 

1)在Dsl运行期间,模型元素都被存储在内存中的Store中,Sotre也提供了一系列的操作:模型元素和关系的创建,操作,删除,Redo/Undo,规则,事件等,相当重要,在Dsl开发中经常会涉及到Store的操作。 

2)当一个模型文件被打开时,会自动重建一个Store,并且加载模型文件中的所有的模型和关系的实例,这个过程我们会在后面介绍。 

3) 每一个域类都继承ModelElement,每个域关系都继承自ElementLink(ElementLink其实也继承于ModelElement). 在Store中加载的每个模型其实都是ModelEment的一个实例,每个域关系都是ElementLink的一个实例。可以通过Store甚至可以操作它们的属性,监听创建,删除等事件. 

4.有一些细节性的应该注意的问题在这里零散的总结一下: 

1).区分两个域类是嵌入关系还是引用关系,可以考虑这域类在模型浏览器里的展现,如果嵌入在模型浏览器中(Model Explorer)那就可以采用嵌入关系,否则就是引用关系. 

2).关系的重数虽然可以任意选择,但是在有些情况下会有些限制,比如在嵌入式关系中: 

嵌入关系目标角色的重数可为One 或者是ZeroOne,因为一个ModelElement只能被嵌入一次. 

如果一个ModelElement是多个嵌入关系中的目标角色,那么目标角色的重数必须都为ZeroOne,因为它只能在同一时间在一个关系中扮演目标角色。 

在一个完整的域模型中,每个域类(根域类除外)必须是一个嵌入关系的目标,不然就不能够构成一个完整的模型树,也就不能够处理序列化 

当然,可能大家会对这些规则有些不知所措,没关系,你可以不理这些规则,按照你的方式去设计,在保存或者是验证(右键Validate All)时,会在下面的错误窗口提示你的。 

3)每个域类都应该有Name Domain Property.可以通过从工具栏拖Named Domain Class创建域类,自动带出此域属性,也可以手动添加域属性,然后指定域属性的Is Element Name 为True,此属性的值会在序列化处理时使用.  

原文标题:Visual Studio DSL 入门 5---理解生成的域类和域关系

链接:http://www.cnblogs.com/lonely7345/archive/2010/01/29/1659157.html

责任编辑:彭凡 来源: 博客园
相关推荐

2010-01-25 09:17:01

Visual Stud

2009-11-09 10:08:31

Visual Stud

2009-11-09 17:04:20

Visual Stud

2024-02-27 12:42:38

开发前端

2009-11-06 13:25:35

Visual Stud

2009-11-06 13:54:09

Visual Stud

2013-11-14 01:09:35

微软Visual StudVisual Stud

2023-09-05 07:32:22

vscode开源故障

2009-11-09 14:55:51

Visual Stud

2011-07-15 11:11:13

AD域控制器

2019-03-13 08:00:00

JavaScript作用域前端

2021-03-09 08:35:51

JSS作用域前端

2009-11-06 11:16:17

Visual Stud

2009-11-06 11:04:29

Visual Stud

2011-09-06 09:56:24

JavaScript

2011-07-15 10:43:06

AD域控制器

2020-08-27 15:06:22

Alexa

2010-12-23 16:09:48

Active Dire

2011-04-08 10:10:26

CIDR路由

2009-11-11 12:55:52

Visual Stud
点赞
收藏

51CTO技术栈公众号