zoukankan      html  css  js  c++  java
  • Visual Studio DSL 入门 5理解生成的域类和域关系

         上一节我们大概介绍了一些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,查看类图,显示类图中的属性为关系或者是组合关系:
            ClassDiagram2

               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/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  • 相关阅读:
    sublime text 怎么浏览包
    postman 中url有动态变换的值时,可以按下面方式变换。
    mac jmeter安装
    mysql 更改密码
    Jenkins启动报端口被占用,解决办法FAILED ServerConnector@2a265ea9{HTTP/1.1}{0.0.0.0:8080}: java
    ajax无法跳转页面的问题,
    EF查询性能优化相关
    code first从入门到伪精通
    自适应Bootstrap学习
    每月分享github上有意思的项目
  • 原文地址:https://www.cnblogs.com/lonely7345/p/1659157.html
Copyright © 2011-2022 走看看