Tiny框架中。对模型本向没有不论什么强制性约束,也就是说你能够把不论什么类型的对象作为模型。也不必实现不论什么接口。

因此简单的说,你定义一个类。里面有一些描写叙述业务属性或处理的内容,就能够说它是模型了。  可是要想在引擎中跑起来,这么做显然是不够的,首先你得让引擎知道。这是个模型。

这须要通过定义模型定义文件来声明出来。

  1. <model-define id="EntityModel" name="EntityModel" title="实体模型"
  2. model-class="org.tinygroup.entity.entitymodel.EntityModel"
  3. error-page="/model/modelError.pagelet"
  4. validate-error-page="/model/modelValidateError.page"
  5. model-infomation-getter="modelInfoGetter" model-loader-bean="entityModelLoader" model-to-bean="entity2Table">
  6. <model-processor-defines>
  7. <model-processor-define name="modify" title="改动" record-mode="Single">
  8. <model-processor-stage name="select" title="改动"
  9. service-processor="entityViewModelModifyStageSelectServiceProcessor"
  10. view-processor="defaultModelViewProcessor" parameter-builder="entityOperationModifyStageSelectParameterBuilder"></model-processor-stage>
  11. <model-processor-stage name="save" title="保存" need-validate="true"
  12. service-processor="entityViewModelModifyStageSaveServiceProcessor"
  13. view-processor="defaultModelViewProcessor" parameter-builder="entityOperationModifyStageSaveParameterBuilder"></model-processor-stage>
  14. </model-processor-define>
  15. </model-processor-defines>
  16. </model-define>

复制代码

上面就是实体模型的描写叙述文件。

上面就是实体模型的描写叙述文件。

1

2

3

4

5
<model-define id="EntityModel" name="EntityModel" title="实体模型"

    model-class="org.tinygroup.entity.entitymodel.EntityModel"

    error-page="/model/modelError.pagelet"

    validate-error-page="/model/modelValidateError.page"

    model-infomation-getter="modelInfoGetter" model-loader-bean="entityModelLoader">

上面定义了实体模型的类型,中英文名称,相应的类的名字。错误展现页面,校验错误的展现页面,模型信息获取接口实现Bean,模型加载接口实现Bean。   也能够觉得。这里是模型的元数据定义及其相关处理的实现。当中ModelInfomationGetter接口主要是用于给引擎获取相关信息。我们前面有讲,模型实现类本身不须要实现模型引擎的不论什么接口。可是模型引擎总是要获取模型的相关信息的,因此,在引擎扩展中须要提供ModelInfomationGetter的实现类来提供相关信息,这种设计是为了避免对模型有侵入;ModelLoader接口用于加载模型文件。因为引擎不知道模型文件的格式。因此怎样加载,也仅仅能通过扩展来处理。

1

2

3

4

5

6

7

8
<model-processor-define name="modify" title="改动" record-mode="Single">

    <model-processor-stage name="select" title="改动"

        service-processor="entityViewModelModifyStageSelectServiceProcessor"

        view-processor="defaultModelViewProcessor" parameter-builder="entityOperationModifyStageSelectParameterBuilder"></model-processor-stage>

    <model-processor-stage name="save" title="保存" need-validate="true"

        service-processor="entityViewModelModifyStageSaveServiceProcessor"

        view-processor="defaultModelViewProcessor" parameter-builder="entityOperationModifyStageSaveParameterBuilder"></model-processor-stage>

< /model-processor-define>

上面定义了实体模型改动处理的定义。在Tiny Mda引擎中。它觉得一个模型上能够有若干个处理,每一个处理又能够分成若干个步骤(至少须要一个)。

每一个步骤又分为三个处理过程(三个处理过程不是所有须要的),參数处理、服务处理、展现处理。  比方上面的改动操作,就定义了两个步骤,由于改动的处理过程是这种:


步骤1:页面请求要对某条记录进行改动,參数处理构建了服务调用的參数。然后调用数据获取服务进行处理;服务处理之后把要改动的记录信息返回。界面展现处理显示改动界面给用户。


步骤2:页面请求提交记录改动,參数处理构建了服务调用的參数,然后调用保存服务进行处理;服务处理之后把要改动情况返回;界面展现提交用户已经改动完成。


须要指出的是,

1 record-mode="Single"

记录模型是指操作时针对的记录情况,一共同拥有三种:None,Single,Multiple。分别表示,不须要记录,须要一条记录,须要多条记录。

OK。从模型定义的角度来说,这些就已经完毕了。

Tiny框架从来不觉得。完毕的东西是不须要改动的,因此,还提供了模型扩展的功能。

比方。上面的模型扩展,框架内建已经支持了添加、改动、删除、复制加入,等等处理,可是能够预想到,开发者肯定须要别的处理,比方:Excel导出、PDF导出。图表显示等等。同一时候,有的开发者会发现现有的实现并不满足须要,可是假设把原来的模型进行破坏性改动,对于开发与公布来说又会带来很多新的问题。


为此,Tiny框架提供了模型扩展及覆盖机制。

模型扩展定义文件与模型定义文件除了根标签不一样之外,其他全然一样;

1

2

3

4

5
<model-define-extend id="entityModel">

   <model-processor-defines>

.....

   </model-processor-defines>

< /model-define-extend>

假设原有模型中存在中相同的模型操作,则会被覆盖,假设原来的模型操作中不存在,则会被新增。

至此。就知道了在Tiny框架中,怎样扩展新的模型类型或者已有的模型进行扩展或覆盖。




大量的处理,都是在模型扩展中完毕的。那么模型引擎都完毕什么事情呢?

1.模型体系定义

定义模型实现类能够是不论什么对象,定义模型上能够能够进行不同类型操作,定义模型的载入体系。

2.模型解释执行

因为模型上定义了各种操作,在人机交互过程中要驱动模型引擎及模型扩展的各种实现与扩展的协作执行,终于给用户完整的要机交互。

3.数据校验扩展

模型引擎定义了前面及后台数据校验的规范与规则,使得前后台数据校验都能够通过模型定义来完毕。保证了前后台数据校验的一致性及有效性(众所周知,前台数据校验是不可靠的,后台数据校验提高成本的)。


4.权限控制体系

因为模型定义了各种各样的处理。实际上就会对数据进行各种影响,出于安全的考虑,必须对当中的一部分或所有进行权限控制。

MDA模型定义及扩展的更多相关文章

  1. Entity Framework 6 Recipes 2nd Edition(11-4)译 -> 在”模型定义”函数里调用另一个”模型定义”函数

    11-4.在”模型定义”函数里调用另一个”模型定义”函数 问题 想要用一个”模型定义”函数去实现另一个”模型定义”函数 解决方案 假设我们已有一个公司合伙人关系连同它们的结构模型,如Figure 11 ...

  2. Fixflow引擎解析(四)(模型) - 通过EMF扩展BPMN2.0元素

    Fixflow引擎解析(四)(模型) - 通过EMF扩展BPMN2.0元素 Fixflow引擎解析(三)(模型) - 创建EMF模型来读写XML文件 Fixflow引擎解析(二)(模型) - BPMN ...

  3. WPF 3D模型的一个扩展方法

    原文:WPF 3D模型的一个扩展方法 在WPF 3D中,我们常常需要改变一个ModelVisual3D对象的颜色. 先说说ModelVisual3D,本质上3D模型都是由一个个的三角形构成的,并且经过 ...

  4. Sequelize模型定义

    定义 定义模型与表之间的映射,使用 define 方法. Sequelize 会自动增加 createdAt 和 updated 属性,这样能知道一个实例的创建时间和最终修改时间.如果不想自动生成,可 ...

  5. Entity Framework 6 Recipes 2nd Edition(11-1)译 -> 从“模型定义”函数返回一个标量值

    第11章函数 函数提供了一个有力代码复用机制, 并且让你的代码保持简洁和易懂. 它们同样也是EF运行时能利用的数据库层代码.函数有几类: Rowset Functions, 聚合函数, Ranking ...

  6. Entity Framework 6 Recipes 2nd Edition(11-2)译 -> 用”模型定义”函数过滤实体集

    11-2. 用”模型定义”函数过滤实体集 问题 想要创建一个”模型定义”函数来过滤一个实体集 解决方案 假设我们已有一个客户(Customer)和票据Invoice)模型,如Figure 11-2所示 ...

  7. Entity Framework 6 Recipes 2nd Edition(11-2)译 -> 为一个”模型定义”函数返回一个计算列

    11-3. 为一个”模型定义”函数返回一个计算列 问题 想从”模型定义”函数里返回一个计算列 解决方案 假设我们有一个员工(Employee)实体,属性有: FirstName, LastName,和 ...

  8. Entity Framework 6 Recipes 2nd Edition(11-5)译 -> 从”模型定义”函数返回一个匿名类型

    11-5. 从”模型定义”函数返回一个匿名类型 问题 想创建一个返回一个匿名类型的”模型定义”函数 解决方案 假设已有游客(Visitor) 预订(reservation)房间(hotel ) 的模型 ...

  9. Entity Framework 6 Recipes 2nd Edition(11-6)译 -> 从一个”模型定义”函数里返回一个复杂类型

    11-6.从一个”模型定义”函数里返回一个复杂类型 问题 想要从一个”模型定义”函数返回一个复杂类型 解决方案 假设我们有一个病人(patient)和他们访客(visit)的模型,如 Figure 1 ...

随机推荐

  1. 汇编程序45:检测点13.2 (loop指令的中断例程)

    安装程序: assume cs:code //loop指令的替代实现 code segment start: mov ax,cs mov ds,ax mov si,offset sub1 mov ax ...

  2. 点击文字弹出一个DIV层窗口代码 【或FORM表单 并且获取点击按钮的ID值】

    点击不同按钮咨询不同的 专家 <?php for($i=1;$i<5;$i++){ $uid=$i; //用户ID ?> <a class="a_click" ...

  3. 每天学点Linux命令之 vi 命令

    来学一个vi的命令.要完成的是在一个只读文件中,删掉一行,然后插入两行. 那只读文件你要修改,用sudo vi 总可以了吧.首先 vi命令进入编辑模式. 在非插入模式中: h 光标左移  l 光标右移 ...

  4. firefox 附加组件栏安装

    firefox 在升级到 30的版本后,发现附加组件栏不兼容了. 搜索组件,add-on bar 会得到一个 new add-on bar的组件,安装完后发现上面不显示ip, 后来才发现,应该安装Th ...

  5. Echarts 出现不明竖线解决方案

    Echarts出现了不明竖线,百思不得其解.去查相应的解决方案也没有找到. 后来自己点来点去,突然感觉像是上一个Echarts遗留的. 然后去Echarts官网看到了 clear()方法,这个方法可以 ...

  6. DetachedCriteria和Criteria的使用方法

    DetachedCriteria和Criteria的使用方法 /*  * 下载统计  * @return  */ public String downloadStatistics(){  logger ...

  7. html5——私有前缀

    CSS3的浏览器私有属性前缀是一个浏览器生产商经常使用的一种方式.它暗示该CSS属性或规则尚未成为W3C标准的一部分,像border-radius等属性需要加私有前缀才奏效 1.-webkit-:谷歌 ...

  8. 调用.NET Serviced Component引发的性能问题及其解决

    在企业用户环境里,.NET Serviced Component使用广泛.它比较好的把传统COM+封装和.NET应用逻辑衔接了起来,在服务器端应用起到重要作用..NET Serviced Compon ...

  9. 4星|《超级技术:改变未来社会和商业的技术趋势》:AI对人友好吗

    超级技术:改变未来社会和商业的技术趋势 多位专家或经济学人编辑关于未来的预测,梅琳达·盖茨写了其中一章.在同类书中属于水平比较高的,专家只写自己熟悉的领域,分析与预测有理有据而不仅仅是畅想性质. 以下 ...

  10. 默认ttl参考

    UNIX 及类 UNIX操作系统 ICMP 回显应答的 TTL 字段值为 255 Compaq Tru64 5.0 ICMP 回显应答的 TTL 字段值为 64 WINXP-32bit 回显应答的 T ...