65.9K
CodeProject 正在变化。 阅读更多。
Home

另一个代码生成器

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.37/5 (13投票s)

2008年7月9日

CPOL

9分钟阅读

viewsIcon

76186

downloadIcon

4647

基于模板的代码生成器。

介绍 

什么是“又一个代码生成器”(YACGEN)?
YACGEN 是一个模板驱动的代码生成器。功能包括

  • YACGEN 读取数据库架构并允许为单个对象(数据库、表和列)分配几乎无限的自定义属性
  • YACGEN 架构可以通过在架构导入和更新期间执行的自定义 Python 代码分配值
  • 架构可以包含识别对象关系的属性
  • 从用户模板生成输出
  • YACGEN 模板无需代码
  • YACGEN 与代码无关,与架构无关。输出不受任何语言、环境或平台的限制
  • 从 GUI 或命令行界面生成代码
  • 旨在支持多种数据库架构(目前仅支持 Microsoft SQL Server)

本文是关于 YACGEN 系列文章的第一部分。它涵盖了 YACGEN 的概念和设计,如何导入和维护数据库架构以及从模板生成输出。有关模板生成和维护的详细信息将在以后的文章中提供。

截至撰写本文时,YACGen 处于 Beta 发布阶段。YACGen 作为开源应用程序发布。项目可以在此处查看。

有关模板创建的文章可以在YACGen 模板生成中找到。

背景

我不会花太多时间讨论代码生成的优点,因为这方面已经有很多文章了。简而言之,代码生成可以消除耗时且重复的编码,并构建一致且(理论上)高质量且无错误的代码。

我强调“理论上”,因为生成的代码只取决于其所基于的模板。然而,代码生成的美妙之处在于,如果底层模板存在问题,可以轻松地重新生成代码。

YACGEN 的需求源于我处理大多数项目的方式(我认为这与大多数开发人员没有什么不同)。我通常从一个包含强定义关系的关系数据库开始。

我将通过 SQL 存储过程构建数据访问,提供支持的数据访问和业务层,最后是用户界面。对于一个 ASP.NET 3 层 C# 应用程序,这将为每个表包含 4-5 个文件。这些文件将涵盖存储过程、数据访问、业务逻辑和 ASP.NET 页面。

要求是创建一个可以存储数据库架构和应用程序特定信息的系统。我需要能够快速轻松地扩展已处理的数据库架构。因此,对于任何给定的字段,我都可以识别它是否包含在网格中,是否是子表单的一部分,或者是否需要以不同的方式处理,例如图片。这些属性不会硬编码在架构中,它们只是适当模板将读取的标志,以确定生成的输出。

好的,这听起来像许多其他可用的代码生成器。YACGEN 有何不同?YACGEN

  • 提供大量额外的架构字段
  • 允许在数据库处理期间对架构执行用户定义的脚本
  • 从无需代码的模板生成输出

广泛的架构支持

对于任何给定的表或字段对象,我希望能够存储大量信息,并使其易于访问。YACGEN 为任何给定字段存储 15 个用户可定义标志、多个消息、评估逻辑、描述、代码片段和布局坐标。如果这还不够,您可以添加任意数量的用户定义值。此信息显示在一个逻辑布局的表单上。

以下图像显示了每个字段可用的两页属性。粗体项目是从数据库布局导入的固定元素。所有其他元素都可以修改,相应的标签是建议。要确定属性名称,请将鼠标悬停在任何文本或复选框上几秒钟。

YACGENFieldPropT1.jpg

YACGENFieldPropT2.jpg

在架构处理期间执行脚本

YACGEN 可以在数据库架构处理期间执行用户定义的 Python 代码片段。这些代码片段可以填充 YACGEN 架构元素。

您可能会遇到异常或遗留的命名约定,您希望在不修改硬编码逻辑和重新编译应用程序的情况下更改它们。例如,如果您遇到带有 `tbl` 前缀的表,您可以轻松更改逻辑以在架构处理期间将其剥离。

对于给定的表,您可能拥有表示单个实例的 DAL 对象以及这些对象的集合。以 Northwind 数据库的 `Territory` 表为例,您将拥有一个 `Territory` 对象和一个 `Territories` 集合。当表被处理时,代码片段将使用适当的值填充 YACGEN 架构属性。

对于每个字段,您在表单上都应该有一个相应的标签。自然地,您希望将字段描述扩展为有意义的标签。因此 `TerritoryDescription` 将变为 **Territory Description**。通常您会在数据库架构处理后手动更新,但使用脚本方法可以在导入期间自动填充字段。

下图显示了表属性。备用名称和 SQL `select` 语句是在导入期间通过脚本填充的。

YACGENTablePropT1.jpg

Python 解释器使用 Microsoft IronPython 引擎实现。使用它的原因是它非常强大,提供了对应用程序对象的访问,并且不需要任何即时编译。缺点是又需要学习一门新语言。

Python 脚本位于“DB 布局设置”选项卡下的“表标志文本”选项卡下。它们存储在 *gpr* 文件中,默认的 *default.gpr* 在运行时加载。

无代码模板

YACGEN 无需代码即可生成输出。我注意到许多代码生成器的一个特点是它们需要代码来生成代码。这种方法本身没有错,它是一种强大的方法,因为您可以访问底层语言提供的所有编程结构和调试工具。

我个人觉得以编程方式为大量代码创建模板,尤其是包含大量 HTML 的 ASP.NET 页面,相当繁琐。对于此类模板,我会在 Visual Studio 中模拟适当的布局,将其粘贴到 YACGEN 模板中,然后进行适当的修改以插入字段属性。

YACGEN 采用的方法类似于报表生成器。它有几个级别,类似于报表区段,包含前置、后置和主体模板,类似于报表头、主体和页脚。未来的实现也可能使用代码模板。一个模板可以生成大量的代码模块。例如,其中一个包含的模板构建了实现 `delete`、`select`、`update`、`insert` 和 `paging` 方法的 C# 业务层。

YACGENTemplate.jpg

使用应用程序

YACGEN 分为 4 个主要区域

选项卡 描述
模板布局 设计和模板维护
数据库布局 数据库模式处理与维护
生成布局 从指定的模板生成输出
数据库布局设置 默认设置维护

导入数据库架构

  1. 选择“数据库布局”选项卡。
  2. 选择新建数据库。
    目前只支持 Microsoft SQL 服务器,尽管您可以选择 MySQL 或 Oracle。
  3. 在“服务器名称”文本框中输入 SQL 数据库的服务器名称或 IP 地址。
  4. 选中“使用 NT 身份验证”复选框以使用您的网络身份验证凭据,否则输入 SQL 用户 ID 和密码。
  5. 选择“填充数据库”按钮。
  6. 将出现一个对话框,列出可用数据库。选择一个或多个您希望进行盘点的数据库。

YagcgenPopopts.jpg

YACGEN 将继续盘点选定的数据库。如果给定数据库已存在于架构中,YACGEN 将更新任何更改。

创建模式后,您可以继续更新任何自定义值。要保存布局,请选择“保存数据库布局”按钮。这将提示您输入布局名称。布局存储在扩展名为 `.dbd` 的文件中。

生成输出

  1. 选择“生成输出”选项卡。
  2. 选择要生成代码的 * .tld 模板文件。
  3. 选择将生成结果的输出目录。
  4. 选择输出文件名。
  5. 选择数据库 * .dbd 文件和您希望使用的数据库。
  6. 选择要处理的对象,可以是所有表、所有表和视图,或单个视图或表。
  7. 选择“生成输出”按钮以生成输出。

其余字段是可选的。任何字段都可以包含在生成过程中替换的表属性。在以下示例中,输出文件名和类名使用表架构中定义的 `<#TableAltName#>` 属性指定。这些属性将在未来的文章中详细介绍。

YACGENGenerateOutput.jpg

随附的 *BuildSP.gpr* 生成文件使用 *TableSPs.tld* 模板为您指定的任何表构建 SQL Server 存储过程代码,以实现 `delete`、`insert`、`update`、`select` 和 `paging` 逻辑。

每个模板都包含一个输出文件的布局。因此,对于一个完整的 ASP.NET 3 层应用程序,将有一个存储过程、DAL、BLL 和 ASP.NET 模板文件。对于 ASP.NET,将有 2 个模板,一个用于设计器代码,一个用于后台代码。

下载包含 5 个示例模板

模板 描述
TablesSPs.tld 生成 SQL 服务器存储过程
ControllerObjectCS.tld BLL 逻辑
DAObjectCS.tld DAL 逻辑
GridODS.tld ASP.NET ODS 网格模板
GridODSCS.tld ASP.NET ODS 网格模板 C# 后台代码

使用 GUI 为大量表对象生成逻辑可能非常耗时。有一个命令行工具 `yacgencl` 可以生成输出。这允许项目批量构建。语法是

yacgencl gprfile.gpr (key1 value1, key2, value2 , keyn, valuen)

一个生成模板 * .gpr 文件是唯一必需的文件。以下命令行将根据 *buildsp.gpr* 中的设置生成输出

yacgencl "c:\program files\YACGEN\templates\buildsp.gpr" 

YACGencl 可以将任意数量的键值对作为参数。这允许在生成期间从命令行设置任何生成或表属性。以下命令行将生成更改 `TableName`、`OutputDirectory` 和 `Process` 属性的输出

C:\Program Files\YACGEN>yacgencl "c:\program files\YACGEN\templates\buildsp.gpr"
TableName Products OutputDirectory "c:\data\vs\nwind\sps\\" 
					Process "Single Table or View"

未来的增强

未来可能的增强功能包括改进的界面、更多的数据库支持和改进的模板处理。

历史

  • 2008 年 12 月 22 日 YACGen Beta 3 2008.12.22
    2008.12.22 版本更改了模板布局(增加了层级),因此现有模板必须重新加载并保存后才能使用。
    • 允许模板中包含多个根级别
    • 选择单个表或视图进行处理
    • 在模板布局下添加了 Python 条件表达式评估
    • 向属性页添加了大量额外字段和标志
  • 2008 年 8 月 14 日 YACGen Beta 2 2008.08.14
    • 添加了用于 ORM 支持的关联生成
    • 在表生成期间动态创建属性
    • 修复了字段 `null` 值未更新的错误
    • 更详细的错误信息
    • 启用条件字段更新
    • 将表模式添加到表屏幕
    • 添加数据库端口
    • 设置控制实体逻辑
    • 构建单个文件
    • 创建 BuildAssociations 标志
    • 处理不属于 dbo 架构的表
    • 添加自定义控件分配
    • 添加提供者 ID
  • 2008 年 7 月 17 日 YACGen Beta 1 2008.07.17 少量错误和界面修复
  • 2008 年 7 月 11 日 YACGen Beta 1 2008.07.11 少量更改,修复了界面怪癖
  • 2008 年 7 月 8 日 YACGen Beta 1

关于作者

Stein Borge 是一位居住在澳大利亚的开发人员。热爱计算机和相关技术,在计算机领域工作和玩耍超过 20 年。从 Turbo Pascal 开始,使用过 xBase、Clipper、C++、VB、VBScript、C# 以及许多后端技术。出版了 Windows 脚本书籍《管理企业系统》和《自动化 Windows 管理》。目前专注于基于 .NET 的 Web 开发和相关技术。

© . All rights reserved.