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

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

#T#

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

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

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

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

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

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,此属性的值会在序列化处理时使用.

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

文章题目:VisualStudio特定领域开发中生成域类和域关系
网页URL:http://www.hantingmc.com/qtweb/news30/357280.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联