一种基于概念数据模型的领域代码生成方法及装置
技术领域
本申请涉及领域驱动设计领域,尤其涉及一种基于概念数据模型的领域代码生成方法及装置。
背景技术
在领域驱动设计中,概念数据模型(Conceptual Data Model,CDM)中包括组件、聚合根、多语言等概念,这些概念体现了领域驱动设计的国际化等特性。
目前,在生成领域代码的过程中,代码生成工具可根据CDM文件生成相应的实体类源代码,但是其成的实体类之间彼此孤立,不存在关联关系。并且,由于代码生成工具中没有表达多语言、多时区等概念的组件,因此,生成的实体类源代码无法对领域驱动设计中的聚合根、多语言、多时区等特性进行体现。
发明内容
本申请实施例提供一种基于概念数据模型的领域代码生成方法及装置,用以解决目前生成的领域代码实体类无关联,且生成的领域代码无法对领域驱动设计中的多语言、多时区等特性进行体现的问题。
本申请实施例提供的一种基于概念数据模型的领域代码生成方法,包括:
确定待生成的概念数据模型CDM文件;
根据预设的解析器,对所述CDM文件中的域、包、实体、属性分别进行解析,确定对应的面向对象信息;
根据所述CDM文件中域、实体、属性对应的版型关键字,对相应的面向对象信息中的特性信息进行处理;
根据处理后的面向对象信息,生成相应的领域代码。
在一个示例中,根据预设的解析器,对所述CDM文件中的域、包、实体、属性分别进行解析,确定对应的面向对象信息,包括:根据预设的域解析器,对CDM文件中的域进行解析,确定面向对象的域信息;根据预设的包解析器,对CDM文件中的包进行解析,确定面向对象的组件信息;根据预设的实体解析器,对CDM文件中各包的实体进行解析,确定面向对象的实体信息;根据预设的属性解析器,对CDM文件中各实体的属性进行解析,确定面向对象的属性信息。
在一个示例中,根据所述CDM文件中域、实体、属性对应的版型关键字,对相应的面向对象信息中的特性信息进行处理之前,所述方法还包括:根据预设的版型解析器接口配置,确定各解析阶段分别对应的版型关键字;所述解析阶段包括域解析阶段、实体解析阶段、属性解析阶段。
在一个示例中,根据所述CDM文件中域、实体、属性对应的版型关键字,对相应的面向对象信息中的特性信息进行处理,包括:根据预设的版型解析器接口配置,确定所述CDM文件中的域、实体、属性分别对应的版型关键字与版型解析器接口实现类;根据确定出的版型解析器接口实现类,调用相应的版型解析器接口,进行处理。
在一个示例中,对相应的面向对象信息中的特性信息进行处理,包括:根据相应的版型关键字,对相应的面向对象信息的属性值进行设置。
在一个示例中,生成相应的领域代码之前,所述方法还包括:根据用户指定的配置信息,构造源代码生成上下文;所述配置信息包括代码模板路径、命名空间、是否覆盖已有代码。
在一个示例中,根据处理后的面向对象信息,生成相应的领域代码,包括:根据所述源代码生成上下文中的代码模板路径,以及预设的模板处理工具,确定对应的代码模板;将处理后的面向对象信息传递至所述代码模板,形成相应的命名空间,并生成相应的领域代码。
在一个示例中,所述方法还包括:根据所述CDM文件中域、实体、属性对应的版型关键字,在生成的领域代码的类中添加相应的注解。
在一个示例中,所述方法还包括:根据所述属性对应的域标识,确定相应属性值。
本申请实施例提供的一种基于概念数据模型的领域代码生成装置,包括:
确定模块,确定待生成的概念数据模型CDM文件;
解析模块,根据预设的解析器,对所述CDM文件中的域、包、实体、属性分别进行解析,确定对应的面向对象信息;
处理模块,根据所述CDM文件中域、实体、属性对应的版型关键字,对相应的面向对象信息中的特性信息进行处理;
生成模块,根据处理后的面向对象信息,生成相应的领域代码。
本申请实施例提供一种基于概念数据模型的领域代码生成方法及装置,至少包括以下有益效果:通过版型关键字,能够建立CDM文件中包、实体、属性、域与领域设计中相应的组件、实体、属性之间的对应关系,这样,在生成领域代码的过程中,即可通过版型关键字对“聚合根”、“多语言”、“多时区”等概念进行表达,能够实现普通代码生成工具对领域代码的完整生成,避免了花费大量时间、精力进行领域驱动设计工具以及特定的代码生成工具开发,节省了研发费用,提高了研发效率。
附图说明
此处所说明的附图用来提供对本申请的进一步理解,构成本申请的一部分,本申请的示意性实施例及其说明用于解释本申请,并不构成对本申请的不当限定。在附图中:
图1为本申请实施例提供的基于概念数据模型的领域代码生成方法流程图;
图2为本申请实施例提供的基于概念数据模型的领域代码生成装置结构示意图。
具体实施方式
为使本申请的目的、技术方案和优点更加清楚,下面将结合本申请具体实施例及相应的附图对本申请技术方案进行清楚、完整地描述。显然,所描述的实施例仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。
图1为本申请实施例提供的基于概念数据模型的领域代码生成方法流程图,具体包括以下步骤:
S101:确定待生成的概念数据模型CDM文件。
在本申请实施例中,服务器可预先根据CDM文件生成领域代码的需要,定义代码生成过程需要遵循的接口标准。接口标准中包括解析器、解析器接口、接口配置等。
之后,服务器可确定用户指定的用于生成领域代码的CDM文件,作为待生成的CDM文件,以便后续对该CDM文件进行解析,自动生成相应的源代码。
S102:根据预设的解析器,对CDM文件中的域、包、实体、属性分别进行解析,确定对应的面向对象信息。
在本申请实施例中,服务器可根据预设的解析器,对CDM文件中的域、包、实体、属性分别进行解析,以获得对应的面向对象形式的信息,实现CDM文件中xml形式向面向对象形式的转化。
在一个实施例中,服务器在对CDM文件进行解析的过程中,根据解析对象、解析阶段的不同,对应的解析过程也不相同。
具体的,服务器在对域进行解析时,可读取CDM文件的内容,查找包含“c:Domains/o:Domain”的域节点,形成对应的域节点列表。之后,针对所有域节点,服务器可根据预设的域解析器,调用其中的“解析域”方法,输入相应的域节点信息,进行解析,以获得面向对象的多实体共用的域信息。
其中,域解析器用于定义将CDM文件中xml形式的域信息解析成面向对象形式的域信息的方法。域表示不同实体之间同名的共享属性,可由实体进行引用,以实现对同一含义的属性的统一定义,避免同一含义的属性在不同实体中定义不同。
域可包括标识、对象标识、编码、名称、数据类型、长度、精度、是否必填、默认值、版型、是否多语言、是否多时区、是否参照字段等属性。其中,“标识”用于唯一标识一个域;“对象标识”用于表示域在CDM文件中的标识;“编码”用于表示域的编码;“名称”用于表示域的名称;“数据类型”用于表示域的数据类型;“长度”用于表示域的数据类型的长度;“精度”用于表示数据的精度要求;“是否必填”用于表示当前属性是否必须填写;“默认值”用于表示该域的默认值;“版型”用于表示该域对应的版型关键字的标识;“是否多语言”用于指定当前属性是否是多语言字段;“是否多时区”用于指定当前属性是否是多时区字段;“是否参照字段”用于指定当前属性是否是参照字段,即外键字段。
具体的,服务器在对包进行解析时,可根据CDM文件的内容,查找包含“c:Packages/o:Package”的包节点,形成对应的包节点列表。之后,针对所有包节点,服务器可根据预设的包解析器,调用其中的“解析包”方法,输入相应的包节点信息,进行解析,以获得对应的面向对象形式的组件信息。
其中,包解析器用于定义将CDM文件中的包解析成面向对象形式的组件信息的方法。
组件表示包含有若干实体的容器。组件可包括标识、编码、名称、实体列表等属性。其中,“标识”用于唯一标识一个组件;“编码”用于表示组件的编码;“名称”用于表示组件的名称;“实体列表”用于表示包内实体的列表。
具体的,服务器在对每个包节点内的实体进行解析时,可根据CDM文件中相应包节点的内容,查找包含“c:Entities/o:Entity”的实体节点,形成对应的实体节点列表。之后,针对各包节点中的所有实体,服务器可根据预设的实体解析器,调用其中的“解析实体”方法,输入相应的实体节点的信息,进行解析,以获得面向对象的实体信息。
其中,实体解析器用于定义将CDM文件中xml形式的实体信息解析成面向对象形式的领域实体信息的方法。
实体表示包含有若干字段属性的容器,其可包括标识、对象标识、编码、名称、版型、是否聚合根、属性列表等属性。其中,“标识”用于唯一标识一个实体;“对象标识”用于表示实体在CDM文件中的标识;“编码”用于表示实体的编码;“名称”用于表示实体的名称;“版型”用于表示当前实体对应的版型关键字;“是否聚合根”用于表示当前实体是否为聚合根,在一个包内,只有一个实体为主实体,也只有一个实体为聚合根;“属性列表”用于表示当前实体对应的属性列表。
具体的,服务器在对每个实体中的属性进行解析时,可在每个实体节点内部,查找包含“c:Attributes/o:EntityAttribute”的属性内容,形成对应的xml格式的属性节点列表。之后,针对属性节点列表中的每个属性,服务器可根据预设的属性解析器,调用其中的“解析属性”方法,输入相应的xml形式的属性信息,进行解析,以获得对应的面向对象的内存中的属性信息。
其中,属性解析器用于定义将CDM文件中xml形式的属性信息解析成面向对象形式的属性信息的方法。
属性的数据结构与上述域的数据结构基本相同,包括标识、对象标识、域标识、编码、名称、数据类型、长度、精度、是否必填、默认值、版型、是否多语言、是否多时区、是否参照字段等属性。其中,“标识”用于唯一标识一个属性;“对象标识”用于表示属性在CDM文件中的标识;“域标识”用于表示当前属性的详细信息参照哪个域的定义,若该属性值不为空,则可根据该域标识,将域中对应的值复制到当前属性中;“编码”用于表示属性的编码;“名称”用于表示属性的名称;“数据类型”用于表示属性的数据类型;“长度”用于表示属性的数据类型的长度;“精度”用于表示数据的精度要求;“是否必填”用于表示当前属性是否必须填写;“默认值”用于表示该属性的默认值;“版型”用于表示该属性对应的版型关键字;“是否多语言”用于指定当前属性是否是多语言字段;“是否多时区”用于指定当前属性是否是多时区字段;“是否参照字段”用于指定当前属性是否是参照字段,即外键字段。
S103:根据CDM文件中域、实体、属性对应的版型关键字,对相应的面向对象信息中的特性信息进行处理。
在本申请实施例中,服务器可预先根据CDM文件中实体、属性、域的相关特性,设置各实体、属性、域对应的版型关键字。其中,特性表示无法通过一般的代码生成工具,自动生成相应领域代码的属性,如多语言、多时区等,版型关键字表示对各实体、属性、域的相关特性的描述。
服务器在对CDM文件中的包、实体、属性、域进行解析,获得转换后的面向对象的信息后,可确定各实体、属性、域分别对应的版型关键字,并根据预设的版型解析器,对相应的版型关键字进行解析,以将版型关键字中对相关特性的描述添加到面向对象信息中。
在一个实施例中,预先定义的接口标准中可包括版型解析器接口配置。版型解析器接口配置用于定义解析阶段、版型关键字与版型解析器接口实现类之间的对应关系。
版型解析器接口配置包括标识、解析阶段、版型关键字、版型解析器接口实现类等属性。其中,“标识”用于唯一标识一个版型解析器接口配置;“解析阶段”用于表示当前版型解析器接口配置对应的解析阶段,包括域解析阶段、实体解析阶段、属性解析阶段;“版型关键字”用于表示当前解析阶段对应的版型关键字,不同解析阶段往往对应不同的版型关键字;“版型解析器接口实现类”用于表示版型解析器接口的实现类,不同版型关键字对应不同的版型解析器接口实现类。
于是,服务器可根据版型解析器接口配置,确定各解析阶段对应的版型关键字、版型解析器接口实现类。之后,服务器可根据CDM文件中的域、实体、属性的版型关键字分别对应的版型解析器接口实现类,调用相应的版型解析器接口,对相应的版型关键字进行解析,并将解析得到的特性信息添加到预先得到的面向对象信息中。
具体的,服务器可根据实体、属性、域分别对应的版型关键字,对相应的特性参数的属性值进行赋值。例如,实体对应的版型关键字为聚合根,则可将实体中“是否聚合根”的属性值设置为“是”;属性对应的版型关键字为多语言,则可将属性中“是否多语言”的属性值设置为“是”。
S104:根据处理后的面向对象信息,生成相应的领域代码。
在本申请实施例中,服务器可根据处理后的面向对象信息,生成相应的领域代码。其中,生成的领域代码中包括相应的特性信息。
在一个实施例中,服务器可根据用户指定的配置信息,构造源代码生成上下文,用于生成领域代码。其中,指定的配置信息包括代码模板路径、命名空间、是否覆盖已有代码等。
在一个实施例中,服务器在构建源代码生成上下文后,可根据源代码生成上下文中的代码模板路径,以及预设的模板处理工具,确定对应的代码模板。之后,服务器可将处理后的面向对象信息传递至相应的代码模板,形成相应的命名空间,并生成相应的领域代码。
在一个实施例中,服务器可根据CDM文件中域、实体、属性的版型,在生成的领域代码的类中添加相应的注解,以在生成的领域代码中体现域、实体、属性的多语言、多时区等特性信息。
在本申请实施例中,通过版型关键字,能够建立CDM文件中包、实体、属性、域与领域设计中相应的组件、实体、属性之间的对应关系,这样,在生成领域代码的过程中,即可通过版型关键字对“聚合根”、“多语言”、“多时区”等概念进行表达,能够实现普通代码生成工具对领域代码的完整生成,避免了花费大量时间、精力进行领域驱动设计工具以及特定的代码生成工具开发,节省了研发费用,提高了研发效率。
为方便理解,本申请以CDM文件中销售订单包内的实体源代码的生成为例进行说明。
在CDM文件中,如表1所示为销售订单包的内容。其中,第1列表示销售订单包的属性,第2列表示对应的属性值。
表1
属性名称 |
值 |
Code |
SalesOrder |
Name |
销售订单 |
如表2所示为销售订单包内,销售订单实体的内容。其中,第1列表示销售订单包的属性,第2列表示对应的属性值。
表2
属性名称 |
含义 |
标识 |
O1 |
对象标识 |
99710E01-DBC5-4B08-905C-2510208A491F |
编码 |
SalesOrder |
名称 |
销售订单 |
版型 |
聚合根 |
如表3所示为销售订单实体的属性信息。其中,第1行表示实体属性对应的属性,第2~4行分别表示销售订单实体的三个属性。
表3
标识 |
编码 |
名称 |
数据类型 |
长度 |
是否必填 |
版型 |
1 |
ID |
ID |
String |
36 |
是 |
|
2 |
MaterialName |
物料名称 |
String |
100 |
是 |
多语言 |
3 |
DeliveryDate |
发运日期 |
DateTime |
|
是 |
多时区 |
如表4所示为版型解析器接口配置。其中,第2~4行分别表示三种配置,由于域解析阶段与属性解析阶段的解析过程基本一致,因此可采用相同的接口实现类。
表4
代码生成的过程包括以下步骤:
第一,服务器可根据版型解析器接口配置,以及不同的解析阶段,确定对应的版型关键字,以及版型解析器接口实现类。
根据上述表1~表4可知,包解析阶段的输出值为空,实体解析阶段得到的版型关键字为聚合根,对应的版型解析器接口实现类为com.inspur.common.AggregateRootInterceptor,域(实体)解析阶段得到的版型关键字为多语言与多时区,对应的版型解析器接口实现类分别为com.inspur.common.I18nInterceptor与com.inspur.common.TimeZoneInterceptor。
第二,服务器可根据用户指定的基路径/project、命名空间com.inspur.scm.sd、代码模板entity.vm、是否覆盖已有代码等配置信息,构造源代码生成上下文。
第三,服务器读取用户指定的CDM文件内容,查找包含“c:Domains/o:Domain”的节点,得到域节点列表,迭代这些域节点,并将每一个域节点的信息,传递给“域解析器”的“解析域”操作,得到多实体公用的域信息,为后续解析属性提供基础。
第四,服务器查找包含“c:Packages/o:Package”的节点,得到包节点列表,迭代这些包节点,并将每一个包节点的信息,传递给“包解析器”的“解析包”操作,得到当前包对应的组件信息SalesOrder。
第五,服务器在当前节点的子节点内查找包含“c:Entities/o:Entity”的节点,得到当前包内的实体节点列表信息,迭代每一个实体节点,调用“实体解析器”的“解析实体”操作,得到其对应的面向对象实体信息。
并且,服务器可根据第一步确定出的实体的版型关键字、版型解析器接口与版型解析器接口实现类,调用其“处理”接口,对该实体的版型关键字进行解析,根据版型关键字“聚合根”,将当前实体的“是否聚合根”数据设置为true。
第六,服务器在当前实体节点内部查找“c:Attributes/o:EntityAttribute”的子节点,得到xml形式的属性节点列表,迭代每一个属性节点,调用“属性解析器”的“解析属性操作”,得到当前节点对应的实体属性信息。其中,如果属性中的“域标识”有值,则将对应域中的值拷贝到当前属性中。
并且,服务器可同样根据第一步确定出的域(属性)的版型关键字、版型解析器接口与版型解析器接口实现类,调用其“处理”接口,对该属性的版型关键字进行解析,根据属性“物料名称”的版型关键字“多语言”,将当前属性(域)的“是否多语言”数据设置为true,根据属性“发运日期”的版型关键字“多时区,将当前属性(域)的“是否多时区”设置为true。
至此,一个包内的所有实体、所有实体属性均已完成xml形式向对象形式的转换;迭代下一个包,直至本CDM文件内所有的包、所有的实体、所有的属性均已转换成对象形式,将对象形式的组件列表赋值给源代码生成上下文的组件列表。
第七,服务器可获取源代码生成上下文的代码模板路径,使用模板处理工具读取代码模板内容,然后迭代组件列表,在当前组件内迭代实体列表,将当前组件和当前实体作为参数传递给代码模板。
模板处理工具将利用组件信息和基命名空间信息,即基命名空间和组件编码,形成本组件内所有实体类的命名空间;将实体信息和实体属性信息替换代码模板内相关形参,并将实体版型,诸如“聚合根”版型,以注解@AggregateRoot的形式注解在类上,将属性版型,诸如“多语言”、“多时区”等版型,以注解@I18n、@TimeZone的形式注解在相应的属性上;迭代下一个实体,迭代下一个组件,直至所有组件均形成其领域代码。
以上为本申请实施例提供的基于概念数据模型的领域代码生成方法,基于同样的发明思路,本申请实施例还提供了相应的基于概念数据模型的领域代码生成装置,如图2所示。
图2为本申请实施例提供的基于概念数据模型的领域代码生成装置结构示意图,具体包括:
确定模块201,确定待生成的概念数据模型CDM文件;
解析模块202,根据预设的解析器,对所述CDM文件中的域、包、实体、属性分别进行解析,确定对应的面向对象信息;
处理模块203,根据所述CDM文件中域、实体、属性对应的版型关键字,对相应的面向对象信息中的特性信息进行处理;
生成模块204,根据处理后的面向对象信息,生成相应的领域代码。
本申请中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于装置实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
还需要说明的是,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、商品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、商品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、商品或者设备中还存在另外的相同要素。
以上所述仅为本申请的实施例而已,并不用于限制本申请。对于本领域技术人员来说,本申请可以有各种更改和变化。凡在本申请的精神和原理之内所作的任何修改、等同替换、改进等,均应包含在本申请的权利要求范围之内。