1.5 元数据模型实例创建

有了Dna和Inst类,就可以基于Dna对象创建Inst对象了。下面的例子是创建一个Inst对象partyInst,在其下创建两个账户对象。当创建partyInst时,先调用一个本地服务,instService.initInst方法返回一个初始化的实例对象,然后在其上进行赋值操作。创建一个Inst对象partyInst代码如下:

img
img

在以上创建例子中,为节省篇幅,对创建实例的代码做了一些简化,忽略了部分属性赋值。在上述代码中没有看到Dna对象在创建Inst对象中所起的作用,实际发生在instService.initInst服务中,根据参数businessType和dnaCode决定使用哪一个Dna对象来初始化Inst对象。该服务最终会调用方法dna2Cell创建Dna对象相关的Cell对象及其下孩子Inst对象。若Dna对象的cursive为true,则还要递归为当前Dna对象创建实例作为子实例对象。dna2Cell的代码如下:

img
img

在上面代码中,Cell cell = singleDna2Cell(instType, dna);用于创建一个Cell对象。singleDna2Cell方法实现代码如下:

img

上述代码根据instType不同,分别创建不同Cell实例对象,如果instType为CodeDefConst.INST_TYPE_DEFAULT,创建对象为Cell对象;如果是CodeDefConst.INST_TYPE_FILTER_ RESULT,则创建FilterResultCell对象,表示它是查询结果返回实例值。然后遍历Dna对象下的每一个Vd对象,调用方法vd2Va创建Va对象,放到Cell对象下的属性vas(Map类型)中。vd2Va方法的代码如下:

img
img

该方法为Dna对象下vds中每一个属性定义Vd对象创建对应的Va对象,并根据不同的数据类型,做初始化操作。

对照上述创建partyInst对象的过程,普通PartyBO对象的创建过程如下:

img

比较创建实例对象和POJO对象之间的代码差异,通过元数据模型创建实例对象,首先要调用instService.initInst方法,再做实例初始化,内部调用dna2Cell创建实例值Cell对象。而在普通方法中,是通过new PartyBO()直接创建对象的。除初始化外,两个创建过程几乎相同,程序写法稍微不同,但是为元数据实例值的属性赋值没有数据类型和属性名称检查,容易出错;而使用普通对象赋值通过开发工具和编译器检查正确性,出错概率较小。

既然通过元数据模型创建实例对象比普通对象创建要复杂,为什么还要利用元数据模型来开发应用呢?答案是:元数据模型具有灵活扩展属性的能力,是一般领域模型所缺乏的特性。对于一般领域模型,都是在需求阶段枚举所有属性的,如果之后发现新属性或者模型结构需要调整,则需重新设计Java类、修改程序代码。而利用元数据模型设计的系统,增加和删除属性都不需要修改程序。

在这个例子中,通过编写程序创建实例对象,不能体现元数据模型的优势。而在实际应用中,采用元数据模型驱动设计,支持数据模型扩展,用户只要通过界面就能创建实例对象会方便很多,而界面自身基于元数据模型灵活配置实现,也无须开发,比较贴近低代码开发平台的需求特性。