2019独角兽企业重金招聘Python工程师标准>>>

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>

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

<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接口用于载入模型文件,由于引擎不知道模型文件的格式,因此如何载入,也只能通过扩展来处理。

<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:页面请求提交记录修改,参数处理构建了服务调用的参数,然后调用保存服务进行处理;服务处理之后把要修改情况返回;界面展现提交用户已经修改完毕。

需要指出的是,

record-mode="Single"

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

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

Tiny框架从来不认为,完成的东西是不需要修改的,因此,还提供了模型扩展的功能。

比如,上面的模型扩展,框架内建已经支持了增加、修改、删除、复制添加,等等处理,但是可以预想到,开发人员肯定需要别的处理,比如:Excel导出、PDF导出,图表显示等等;同时,有的开发人员会发现现有的实现并不满足需要,但是如果把原来的模型进行破坏性修改,对于开发与发布来说又会带来许多新的问题。

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

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

<model-define-extend id="entityModel"><model-processor-defines>
.....</model-processor-defines>
</model-define-extend>

如果原有模型中存在中同样的模型操作,则会被覆盖,如果原来的模型操作中不存在,则会被新增。

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

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

1.模型体系定义

定义模型实现类可以是任何对象,定义模型上可以可以进行不同类型操作,定义模型的加载体系。

2.模型解释运行

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

3.数据校验扩展

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

4.权限控制体系

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

转载于:https://my.oschina.net/tinyframework/blog/166842

MDA模型定义及扩展相关推荐

  1. [AlwaysOn Availability Groups] 健康模型 Part 2 ——扩展

    [AlwaysOn Availability Groups] 健康模型 Part 2 --扩展 健康模型扩展 第一部分已经介绍了AlwayOn健康模型的概述.现在是创建一个自己的PBM策略,然后设置为 ...

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

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

  3. PyTorch学习笔记(五):模型定义、修改、保存

    往期学习资料推荐: 1.Pytorch实战笔记_GoAI的博客-CSDN博客 2.Pytorch入门教程_GoAI的博客-CSDN博客 本系列目录: PyTorch学习笔记(一):PyTorch环境安 ...

  4. PyTorch:模型定义

    PyTorch模型定义的方式 模型在深度学习中扮演着重要的角色,好的模型极大地促进了深度学习的发展进步,比如CNN的提出解决了图像.视频处理中的诸多问题,RNN/LSTM模型解决了序列数据处理的问题, ...

  5. task03 Pytorch模型定义

    task03 Pytorch模型定义 2022/6/19 雾切凉宫 先引入必要的包 import os import numpy as np import collections import tor ...

  6. CodeGen用户定义的扩展令牌

    CodeGen用户定义的扩展令牌 用户定义的扩展令牌是一种特殊的令牌,开发人员可以确定令牌的名称以及在代码生成过程中遇到令牌时要插入的值. CodeGen支持多种机制,允许通过以下方式实现用户定义的令 ...

  7. MetaModelEngine:域模型定义

    每一个DSL的核心都是一个域模型,它定义了这一语言所代表的各种概念,以及这些概念的属性和它们之间的关系,在创建DSL每一个元素时都是使用域模型来描述.域模型还为语言的其他方面的建立提供了基础:图形符号 ...

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

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

  9. 算法模型是什么意思,算法模型定义介绍

    算法模型定义介绍 1.马尔科夫模型 1.1马尔科夫过程 马尔可夫过程(Markov process)是一类随机过程.它的原始模型马尔可夫链.已知目前状态(现在)的条件下,它未来的演变(将来)不依赖于它 ...

最新文章

  1. PHP 函数 ignore_user_abort定时执行任务的实现
  2. Linux目录与文件常见处理命令
  3. sqlite3---终端操作
  4. 如何在Mac上直接删除文件而不将其发送到垃圾箱?
  5. html5 video mute按钮,How to mute an html5 video player
  6. 经济金融学之1宏观经济学
  7. Sign in - CodeProject
  8. Windows蓝屏代码查询(Bug Check Code)
  9. 求5的阶乘和1-5的阶乘和
  10. 配置商用计算机,商用计算机主板配置推荐
  11. VR和AR未来的对垒
  12. 计算机图形学——八分法中点画圆
  13. 【java期末复习题】第4章 面向对象基础
  14. 机器学习--最大熵模型
  15. 代码阅读——十个C开源项目
  16. 【STM32】R05D电控红外协议的美的空调遥控器
  17. 俄罗斯方块linux服务器,分享|在 Linux 终端上玩俄罗斯方块
  18. 美业多门店收银系统源码saas
  19. java 字符界面 curses_Linux终端图形库 Curses简介和实例分析
  20. matlab 不规则三角网,不规则三角网(TIN)的构建与应用.pdf

热门文章

  1. 文档相似度的比较tf-idf lda lsi
  2. 电子与计算机工程 加拿大,加拿大本科热门专业:电子与计算机工程
  3. 取文字_有内涵的男孩名字:用三字经为宝宝取一个独特稀少有内涵的好名
  4. Python系统的下载与安装教程
  5. 张仰彪第二排序法_十大排序之冒泡和选择排序
  6. vscode 无法跳转到函数定义_玩转VS Code
  7. 计算机转进制怎么看平方,计算机数制转换
  8. 不学51直接学stm32可以吗?学stm32需要哪些基础?
  9. parquet java_Apache Parquet Java API的文档?
  10. 侠客风云传服务器维护,《侠客风云传online》4月20日服务器数据互通公告