1.X-gen项目背景
项目越来越大,模块越来越多,但是大多数都是重复或者相似的做法,至少每个模块的基础部分的实现是差不多的,比如CRUD(创建Create、更新Update、读取Retrieve和删除Delete操作——增删改查)功能的实现,又比如翻页功能的实现等等。
如何能够减少这些重复劳动?
根据需要,结合公司已有的系统架构和公共功能,制作出了符合自己需要的小应用,可以实现根据配置文件或者是数据库定义来生成应用模块,并带上增删改查的功能实现。
通常这种程序,由于是公司内部专用,因此会实现得非常简单,很多复杂多变的状况也就不再去考虑。
1.1 小应用面临的问题
- 如果生成的配置文件需要发生变化:那么相应的读取配置文件的程序需要变化;同时使用这些数据的程序也需要变化
- 如果模板文件需要发生变化:那么读取模板的文件的地方需要发生变化,同时,运行中把参数数据设置到模板的程序也需要发生变化
- 如果调用逻辑或调用顺序需要发生变化:那就需要修改调用部分的程序来适应新的变化
- 如果输出格式需要发生变化:那就只好重新写代码来实现新的输出格式
类似的问题还有很多。
1.2 X-gen
因此,需要一个项目把生成应用的核心部分独立出来,形成公共的应用,让变化的部分从应用中分离出来,让程序人员可以根据需要进行配置和扩展,从而适应各种应用的需要。
X-gen分为两个部分:
- 核心框架。用来生成应用的公共部分
- 自定义模板部分。按照程序员的需要来定义模板,几乎所有能重复使用的功能都可以通过X-gen生成
2.X-gen功能概述
X-gen是一个能按照模板和配置去生成结果的通用框架,设计精巧,结构灵活,平台开放,支持模板自定义,支持配置方式自定义,支持生成方式自定义,甚至可以自定义generate的过程。
X-gen的核心是一个通用的生成调用框架,本身并不约定任何需要生成的东西,因此几乎可以满足所有朋友的各种generate需求。
X-gen需要解决的问题:
- 解决根据什么来生成的问题
- 解决如何如何生成的问题,同时还要解决在生成的时候如何利用外部主题的问题
- 解决生成结果的问题,包括最终生成什么格式,以及把结果输出到什么地方等问题
2.1 配置管理模块(genconf)
X-gen设计模式综合实战2-配置管理
配置管理模块主要完成:
- 获取用户配置的数据
- 缓存用户配置的数据
- 并对外提供访问这些数据的接口
X-gen是一个通用的框架,它本身并不固定要求配置的格式,也不要求配置的来源,因为它也不固定获取和解析配置数据的程序。虽然默认提供了对xml配置的支持,但可以通过注册新的provider来提供对新的配置方式的支持。
X-gen可以完全由开发人员自己来制定配置的方式、配置的地方、配置的格式,以及如何获取这些配置数据,如何解析这些配置数据等。并可以很简单的方式插入到X-gen的核心框架中。
2.2 分发调度模块(dispatch)
X-gen设计模式综合实战3-分发调度模块
分发调用提供接受用户请求的入口,然后根据用户请求的内容,去获取相应的配置数据,然后按照配置的要求来发出命令,要求按照这些配置数据来完成generate的功能。
在每一个具体命令的实现中,先动态组合完成需要完成的generate功能,然后就将这些功能交给generate的代理去完成。
也即分发调度只是负责接收用户的任务,然后把任务组合好,最后分配出去,只是起到一个调度的作用,本身并不处理用户请求的功能。
2.3 生成代理模块(genproxy)
X-gen设计模式综合实战4-生成代理模块
介于生成调度(dispatch)和真正生成(geninvocation)之间额外的附加层,目的是能够根据需要切换不同的代理,比如生成调度根据配置,需要通过远程来生成,那么就需要远程代理,远程访问的方式可能是rmi或webservice等。
2.4 具体调用模块(geninvocation)
X-gen设计模式综合实战5-具体调用模块
这个模块实现一个具体生成功能的调用过程,通常是把用户配置的参数数据,按照一定的规则与theme的模板相结合,从而得到需要生成的结果,然后把结果输出的过程。
2.5 模板管理模块(template)
X-gen设计模式综合实战6-模板管理模块
模板管理的功能就是负责获取相应的模板数据,并对这些模板的数据进行管理,在外部需要这些模板数据的时候,可以访问模板管理提供的接口来获取。
2.6 生成输出模块(output)
- 结果如何输出
- 输出到什么地方
- 输出成为什么格式
生成输出本身并不固定任何的输出要求,开发人员完全可以在外部来定义输出的格式,输出的地方,以及如何输出,只需要在theme的配置中注册新的outtype即可。
3.外部主题
X-gen设计模式综合实战8-开发外部主题
一套用于生成的模板及其相应程序和配置。由于模板的配置会有很多个,通常会把多个相关的模板组合在一起,统称为主题theme。
外部主题是独立于X-gen核心框架之外的,完全由开发人员根据需要来制定,通常里面会包含generate需要的所有原始模板文件,跟模板文件对应的解析和生成的辅助程序,生成处理的Action处理程序,还有theme的配置文件,一般这几个是必不可少的。
其次,根据需要,可由开发人员扩展功能。比如:在进行生成处理前后需要额外添加的功能,自定义的输出类型。
外部主题决定了按照什么来生成、如何生成以及生成什么东西的具体信息,是提供给X-gen核心框架使用的重要数据。