上一节我们大概介绍了一些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<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,此属性的值会在序列化处理时使用.
作者:孤独侠客(似水流年)
出处:http://lonely7345.cnblogs.com/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。