概述
DaaS 之前支持一个独立的模型文件,在复杂项目中会比较难以维护。
截止今天(2020-3-23)最新的DaaS内部测试版表示,将会支持‘文件夹’形式的模型文件,将会提高模型文件的能力,降低维护成本。
一个例子
新的模型文件目录的结构
新的入口文件样例:
模型文件夹结构说明
新增了两种目录:
lib
用于存放已经标准化的模型。 例如 _iam, _mobile_app
project_xxx
用于存放项目的模型文件
入口文件是 main.xml 例子中的main.xml 就引入了4个模型
<root> <platform/> <#import file="../lib/iam/_iam_v1.0.xml" /> <#import file="../lib/mobile/_mobile_app_v1.0.xml" /> <#import file="exam.xml"> <fault_answer user="$(sec_user)" /> <start_exam #delete="_features, change_request" /> <#delete name="dirty_node"/> </#import> <#import file="change_request.xml" /> </root>
- 用于占位的 <platform> (第一个对象对于DaaS系统生成有重要意义,所以在这里用它的名字占个位置)
- 标准化的 iam 模型
- 标准化的 mobile_app 模型
- 项目模型, 这里是 exam.xml. 并在这里做了一些简单的修改。
- 生成的‘变更请求’模型:change_request.xml
模型文章查找顺序
新增‘项目模型文件夹’以后,为保证向前兼容,现在的模型查找顺序为:
- 先看有没有 project_<name> 目录,并且其目录下有main.xml. 如果有,则使用此模型。
- 再查看 modeling/miscroservice/<name>.xml 是否存在。如果有,则使用此模型。
- 再查看 modeling/<name>.xml 是否存在。如果有,则使用此模型。
- 还没有,就报错。
模型文件夹指令说明
import 指令
本次新增一个指令,import, 使用它可以将模型拆分成任意模块,分别维护。 语法非常简单<#import file="<path>" />
path 的计算:以当前文件为基点,需要import的模型文件的相对路径。
delete 指令
本次还新增指令,delete,可以用于delete一个节点,也可以用于delete 一个节点中的属性。merge 的效果
在 import 指令和 delete 指令的作用下, 会对模型进行merge。 merge的原则为:- 如果之前存在,import的时候,后写的优先级大于先写的;
- 如果之前不存在,import的时候直接增加;
例如,上例中的
<fault_answer user="$(sec_user)"
就会覆盖原来的
<fault_answer user="$(exam_user)"
状态模型/枚举值的定义方式
原来的DaaS模型中支持 状态/枚举 的定义,毕竟机器是很严格的根据字节来运行,常量值是常见的业务需要。
原来的写法是这样
<role
name="管理员|员工"
code="ADMIN|EMPLOYEE|[1,40]"
description="管理人员|员工|[0,200]"
platform="$(platform)"
_features="status"
/>
就是声明 _features 中要包含 status, 然后用竖线把各个需要的值列举出来。
这个写法对少量的输入还好,数量多了就会容易出错,例如 code 和 name 顺序不一致或者差一个位置之类的。
现在支持value()描述符,可以“横着写”:
<role
name="value()|[1,40]"
code="value()|[1,40]"
description="value()|[0,200]"
platform="$(platform)"
_features="status"
>
<#value name="管理员" code="ADMIN" description="管理人员"/>
<#value name="员工" code="EMPLOYEE" description="员工"/>
</role>
即其他的写法不变,使用value()描述符告诉解析器此值从其子节点 #value 中取对应的部分。
Merge工具会对其做预处理,将其构造成原来的语法形式。 好处就是不容易出错。