MDA模型定义及扩展
Tiny框架中。对模型本向没有不论什么强制性约束,也就是说你能够把不论什么类型的对象作为模型。也不必实现不论什么接口。
因此简单的说,你定义一个类。里面有一些描写叙述业务属性或处理的内容,就能够说它是模型了。 可是要想在引擎中跑起来,这么做显然是不够的,首先你得让引擎知道。这是个模型。
这须要通过定义模型定义文件来声明出来。
- <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" model-to-bean="entity2Table">
- <model-processor-defines>
- <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>
- </model-processor-defines>
- </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模型定义及扩展的更多相关文章
- Entity Framework 6 Recipes 2nd Edition(11-4)译 -> 在”模型定义”函数里调用另一个”模型定义”函数
11-4.在”模型定义”函数里调用另一个”模型定义”函数 问题 想要用一个”模型定义”函数去实现另一个”模型定义”函数 解决方案 假设我们已有一个公司合伙人关系连同它们的结构模型,如Figure 11 ...
- Fixflow引擎解析(四)(模型) - 通过EMF扩展BPMN2.0元素
Fixflow引擎解析(四)(模型) - 通过EMF扩展BPMN2.0元素 Fixflow引擎解析(三)(模型) - 创建EMF模型来读写XML文件 Fixflow引擎解析(二)(模型) - BPMN ...
- WPF 3D模型的一个扩展方法
原文:WPF 3D模型的一个扩展方法 在WPF 3D中,我们常常需要改变一个ModelVisual3D对象的颜色. 先说说ModelVisual3D,本质上3D模型都是由一个个的三角形构成的,并且经过 ...
- Sequelize模型定义
定义 定义模型与表之间的映射,使用 define 方法. Sequelize 会自动增加 createdAt 和 updated 属性,这样能知道一个实例的创建时间和最终修改时间.如果不想自动生成,可 ...
- Entity Framework 6 Recipes 2nd Edition(11-1)译 -> 从“模型定义”函数返回一个标量值
第11章函数 函数提供了一个有力代码复用机制, 并且让你的代码保持简洁和易懂. 它们同样也是EF运行时能利用的数据库层代码.函数有几类: Rowset Functions, 聚合函数, Ranking ...
- Entity Framework 6 Recipes 2nd Edition(11-2)译 -> 用”模型定义”函数过滤实体集
11-2. 用”模型定义”函数过滤实体集 问题 想要创建一个”模型定义”函数来过滤一个实体集 解决方案 假设我们已有一个客户(Customer)和票据Invoice)模型,如Figure 11-2所示 ...
- Entity Framework 6 Recipes 2nd Edition(11-2)译 -> 为一个”模型定义”函数返回一个计算列
11-3. 为一个”模型定义”函数返回一个计算列 问题 想从”模型定义”函数里返回一个计算列 解决方案 假设我们有一个员工(Employee)实体,属性有: FirstName, LastName,和 ...
- Entity Framework 6 Recipes 2nd Edition(11-5)译 -> 从”模型定义”函数返回一个匿名类型
11-5. 从”模型定义”函数返回一个匿名类型 问题 想创建一个返回一个匿名类型的”模型定义”函数 解决方案 假设已有游客(Visitor) 预订(reservation)房间(hotel ) 的模型 ...
- Entity Framework 6 Recipes 2nd Edition(11-6)译 -> 从一个”模型定义”函数里返回一个复杂类型
11-6.从一个”模型定义”函数里返回一个复杂类型 问题 想要从一个”模型定义”函数返回一个复杂类型 解决方案 假设我们有一个病人(patient)和他们访客(visit)的模型,如 Figure 1 ...
随机推荐
- dubbo+zookeeper下生产者和消费者配置(基于springboot开发)
一.总共分为三个目录: dubbo-api 服务的接口用于对接客户端和服务端 dubbo-client 客户端配置文件为:consumer.xml dubbo-service 服务 ...
- 【Leetcode】84. Largest Rectangle in Histogram 85. Maximal Rectangle
问题描述: 84:直方图最大面积. 85:0,1矩阵最大全1子矩阵面积. 问题分析: 对于84,如果高度递增的话,那么OK没有问题,不断添加到栈里,最后一起算面积(当然,面积等于高度h * disPo ...
- 11 在C#中写文件
在这个练习中,我们来学习如何把我们想要的东西写到文件中.我们在这个练习中还是使用File类中的方法来完成写文件的操作. 在这个练习中我们要用C#创建一个纯文本文件ex11.txt 放到c盘的Exerc ...
- python基础篇(一)-------- 字符串的操作
1.字符串的常用操作: 已知字符串:str = "hello world zhangsan and zhangsan" 1.字符串的长度:len(str) 2.查看字符串的索引值: ...
- [转帖]c++ 面试整理
1. 继承方式 public 父类的访问级别不变 protected 父类的public成员在派生类编程protected,其余的不变 private 父类的所有成员变成pr ...
- DeltaFish 校园物资共享平台 第七次小组会议
DeltaFish 校园物资共享平台 第七次小组会议 一.上周进度报告 前端 娄:和李一起建立前后端交互参数文档,和数据库文档,完成前端页面跳转和图片加载的 bug,Git 上去. 刘:优化前端 ab ...
- Spring的核心机制依赖注入
原文地址:http://developer.51cto.com/art/200610/33311.htm 本文主要讲解依赖注入(设值注入.构造注入),作用是可以使Spring将各层的对象以松耦合的方式 ...
- 微信小程序php后台实现
这里简单介绍用php后台实现获取openid并保存到数据库: 微信的登陆流程是这样的 首先前端发送请求到服务器: wx.login({ success: function (res) { var co ...
- haproxy故障处理
1. haproxy 在配置健康检查的时候,默认没有配置页面检查 ,通过端口状态来检测.后端IIS web服务开始可能 是一个站点,或者采用了基于域名的配置方式,导致目前站点停了,后端主机不能被hap ...
- string.format("%s",name)
TCHAR name[40]; acedGetString(0, _T("输入名字"), name); acutPrintf(name); CString na; na.Forma ...