Daas 支持新的模型文件夹结构

421 阅读1分钟

概述

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

模型文章查找顺序

新增‘项目模型文件夹’以后,为保证向前兼容,现在的模型查找顺序为:

  1. 先看有没有 project_<name> 目录,并且其目录下有main.xml. 如果有,则使用此模型。
  2. 再查看 modeling/miscroservice/<name>.xml 是否存在。如果有,则使用此模型。
  3. 再查看 modeling/<name>.xml 是否存在。如果有,则使用此模型。
  4. 还没有,就报错。

模型文件夹指令说明

import 指令

本次新增一个指令,import, 使用它可以将模型拆分成任意模块,分别维护。 语法非常简单
<#import file="<path>" />

path 的计算:以当前文件为基点,需要import的模型文件的相对路径。

delete 指令

本次还新增指令,delete,可以用于delete一个节点,也可以用于delete 一个节点中的属性。

merge 的效果

在 import 指令和 delete 指令的作用下, 会对模型进行merge。 merge的原则为:
  1. 如果之前存在,import的时候,后写的优先级大于先写的;
  2. 如果之前不存在,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工具会对其做预处理,将其构造成原来的语法形式。 好处就是不容易出错。