1、 本 科 毕 业 论 文面向 B/S 三层架构的代码生成技术B/S Three-layer Structure Oriented Code Generation Technology 姓 名: 学 号:学 院:软件学院系:软件工程专 业:软件工程年 级: 校外指导教师: 校内指导教师: 年 月摘 要代码生成技术,是近几年发展起来的一种自动生成高级语言代码的技术。它的主要原理是:先获取元数据,然后根据模板和特定规则来自动生成代码。使用代码生成技术,可以免去程序员的一些重复劳动,适应多变的需求,缩短开发时间,提高开发效率。当 前 代 码 生 成 研 究 , 主 要 集 中 在 生 成 数 据 库
2、访 问 代 码 。 因 为 访 问 数据 库 可 以 用 比 较 固 定 的 模 式 来 实 现 。 代码生成器的技术选择有两种:(1)采用以 XML 为元数据文件,用 XSLT 作为模板来转换,实现代码生成。这个方法可以直观的展示元数据的结构,并且对编程技术要求不高,但其读写IO 比较耗时。 (2)把模板封装成方法,在内存中直接进行代码生成。这个方法方便用户预览和修改代码,但对编程要求比较高。本文以三层网站开发结构为基础,结合对象关系映射(ORM)的理论,实现了一种代码生成方式。主要内容如下: 第一,分析了当前程序开发中对代码自动生成的需求。总结了国内外在代码生成技术上的研究,以及相应的软件
3、产品介绍。第二,阐述了代码生成的概念、特点,以及优势和不足。同时分析了可以实现代码生成的技术和其对应的优缺点。第三,研究 BS 三层架构代码生成的设计理论。介绍了对象关系映射(ORM)的思想,和它在代码生成中的作用。同时,介绍了经典的三层架构设计,抽象出其中固定的模式。第四,实现一个 C#代码生成器实例。介绍其整体架构和详细设计方法,并给出相应的实现效果。关键词:代码生成;三层结构 ;ORM AbstractCode generation technology, is a programming technology for generating high level languages co
4、de automatically which is grown up these years. Its main principle is, acquiring the meta-data first and then generating code according to the templates and certain rules. By using code generation technology, we can avoid some redundant labors, adapting to the various requirements, reducing the dura
5、tion of software development, and improving the efficiency finally.Currently, code generation technology is mainly focused on accessing the databases for the reason that there can be a fixed style found in the database access process. For implementing code generation, there are two options. The firs
6、t one is taking XML files as meta-data and using XSLT files for transformation. This method will show the structure of meta-data clearly and do not require high programming skills. But its accessing IO process will lower its performance. The second one is encapsulating the templates into methods and
7、 generating code directly in memory. In this way, user will preview and modify the generated code conveniently. However, its requirement on programming skill is relatively high.This paper implements a code generator which is based on three-layer structure and combines the concept of object relationa
8、l mapping. The content is as follows:First, this paper analyzes the requirements of code generation and the researches around the world including the relative software products.Second, this paper introduces the concept, characters, advantages and disadvantages of code generation technology. Meanwhil
9、e, it analyzes the optional chooses for generating code and their strongpoint and shortcomings.Third, this paper shows the theory foundation of code generation. It explains the concept of object relational mapping and ORMs applying in code generation. And then it illustrates the three-layer structur
10、e and extracts the fixed pattern inside it.Forth, this paper realizes a code generator and explains its main frameworks and detailed design.Key words: Code Generation; Three-layer Structure; ORM目 录第一章 绪论 11.1 引言 11.2 国内外研究综述 11.3 本文的主要任务 21.4 本章总结 3第二章 代码生成技术 42.1 代码生成技术的概念 42.2 代码生成的实现技术 52.3 代码生成的
11、优势和不足 62.4 本章总结 7第三章 代码生成器设计理论 83.1 对象关系映射 83.1.1 对象关系映射的概念 83.1.2 使用对象关系映射的优点 93.2 三层架构介绍 93.2.1 三层架构的概念 93.2.2 三层架构之间的交互 103.2.3 数据访问层的设计 133.3 本章总结 15第四章 代码生成器实例 164.1 项目开发背景 164.2 项目总体设计 164.3 项目详细设计 214.3.1 生成基本代码模块 214.3.2 生成存储过程模块 264.3.3 生成脚本文件模块 294.3.4 代码编辑器模块 304.3.5 查询分析器 314.4 系统运行界面及运行
12、结果 324.4.1 系统界面设计 324.4.2 运行结果 384.5 本章总结 42第五章 总结 435.1 本文研究工作总结 435.2 代码生成技术展望 43参考文献 45致谢 语 47ContentsChapter 1 Exordium 11.1 Introduction11.2 Researches Aroud The World.11.3 Main Tasks21.4 Summary.3Chapter 2 Code Generation Technology42.1 Concept Of Code Generation42.2 The Implemetaion Technolog
13、y52.3 Advances and Disadvances62.4 Summary.7Chapter 3 The Design Theory of Code Generator 83.1 Object Relational Mapping .83.1.1 The Concept of ORM83.1.2 The Advances of ORM .93.2 Three-Layer Framework.93.2.1 The Concept of Three-layer Framework.93.2.2 Cooperation in Three-layer Framework103.2.3 Des
14、ign of Data Access Layer133.3 Summary.15Chapter 4 Code Generator Sample 164.1 Backgroud.164.2 General Design .164.3 Detailed Design .214.3.1 Code Generation 214.3.2 Stored Procedure Generation 264.3.3 Script Generation 294.3.4 Code Editor .304.3.5 Query Analyzer .314.4 User Interface and Results 324
15、.4.1 User Interface 324.4.2 Results .384.5 Summary.42Chapter 5 Summary.435.1 Summary for This Paper .435.2 Future Prospects.43Reference45Acknowledgements.47绪论1第一章 绪论1.1 引言随着互联网的普及,网站开发的需求量也随之增加。目前,在开发网站时,程序员在编写代码的过程中,会重复着一些不必要且耗时的技术性劳动;另一方面,业务需求时常发生变化,使得程序开发和维护的难度大大提高。如何能够快速而又高质量的开发网站成为一个至关紧要的问题。在长期
16、的编程过程中,人们研究发现了一些代码的固定模式。如果可以将这些固定模式的代码生成自动化,将会在一定程度上提高软件开发的效率。于是,就出现了代码生成技术。它是一个专注于提高编程效率,用程序来编程的研究方向。用代码生成工具生成代码不仅能够提高开发效率,而且能够保证代码风格的一致,大大提高代码的可读性和可维护性。1.2 国内外研究综述目前,在代码生成技术方面,己经提出了许多工程设计的模型和方法。这些模型和方法在描述用户界面或生成代码方面各有独特的见解。但很多模型和方法是用于直接描述用户界面,即是一种用户界面的编码手段,而不支持从需求分析到模型设计直至编码的全过程。这种方式使界面设计还是停留在手工编码
17、和脑力劳动阶段。FMP 模型就是一种面向软件工程的用户界面设计和自动生成模型。它利用功能模型(F)和对象模型(CM )捕捉与界面相关的功能和数据信息,用交互模型(CM)表达这些信息及控制关系。然后依据交互模型的描述,利用表示模型(P )建立内部对象和外部显示元素的对应关系来规划界面布局,从而指导和实现用户界面的自动代码生成 1。已经开发出来的代码生成软件,主要有三个类别:(1) IDE 代码开发工具。如.NET 语言的开发工具 Visual Studio,Java 语言的开发工具 Eclipse,都能自动生成一些框架代码。这些框架代码大都与业务逻辑无关,只是注重窗体和控件的初始化代码,在一定程
18、度上方便了程序员的开发工绪论2(2) 对象关系映射(Object Relational Mapping,简称 ORM 工具) 。已经商业化的工具有: Cocobase 公司的 Dynamic O/R Mapping 产品,它主要就是针对于 J2EE 体系结构,Visual Studio 2005 的 Alpha 版本中提供的ObjectSpaces 工具,它是在 ADO 数据层之上的 O/R Mapping 框架;ObjectMatter 公司的 The Visual Business Sight Framework v 2.41(VBSF)支持对象到关系数据库的自动存储,也支持 C/S 环境
19、下的分布式对象的存储;Sun 公司的基于 JDO 开发的 O/R Mapping 工具。(3) 基于网站开发的专业代码生成工具。如 Hibernate(基于 Java 平台)和 NHibernate(基于.Net 平台) 这两款比较主流的网站代码生成工具。Hibernate 是一个强大的,高性能的数据库映射工具,它能让开发者继续使用 Java 通常的开发习惯,诸如派生、多态、组合和 Java 集合框架等来开发持久对象层;同时它还提供一个精简的面向对象的 SQL 语言扩展,而且支持几乎目前所有的主流应用的数据库。NHibernate 是一个基于.NET 环境的对象关系数据库映射工具。NHiber
20、nate来源于非常优秀的基于 Java 的 Hibernate 关系型持久化工具。 NHibemate 很好的实现关系型数据库到面向对象实体的映射,并且提供数据查询和获取数据的方法,从而大幅度减少开发时人工使用 SQL 和 ADONET 处理数据的时间,提高了效率和安全性 2。本文主要结合后两类代码生成工具的特点,采用相应的代码转换技术,开发一款基于.NET 平台的,结合经典的三层架构和对象关系映射思想,适合中小型网站开发的代码生成工具 SmartGenerator。1.3 本文的主要任务本文通过对代码生成技术的理论基础进行分析,设计并实现了一个代码生成器实例。其主要任务如下:(1) 介绍代码
21、生成技术的概念、特点,以及它的优势和不足。分析在代码生成中可以采用的技术方法和它们的优缺点。(2) 研究经典的三层架构,抽象出其中固定的模式。同时介绍了对象关系绪论3映射(ORM)的思想和它在代码生成中的作用。(3) 提出一个代码生成器的实现。介绍其整体架构和详细设计方法,并给出相应的实现效果。(4) 总结本论文的研究工作,并对未来的代码生成技术提出构想。1.4 本章总结本章主要介绍了代码生成技术的一些背景知识。首先阐述了当前代码生成的需求,接着介绍了国内外代码生成方面的研究方向以及相应的软件产品和特点,最后对本文所要完成的任务做了一个概述。代码生成技术4第二章 代码生成技术2.1 代码生成技
22、术的概念代码生成技术是指能够自动生成高级语言代码(如 C, C+, C#, Java, Perl 等)的软件技术 2。代码生成器一个基本的工作模式是:读取元数据(meta-data) ,例如数据库模型,然后根据一定的模板和规则来生成相应的源代码。如图 2-1 可以说明代码生成的模型。模式 / 模板 域规则 域元数据生成代码图 2-1:代码生成模型模式/模板:代码生成中不变的关系或者模式。体现了代码生成中的共性。域规则:用于约束域数据结构和行为的规则。通常被代码生成器所封装。域元数据:是指将在生成代码中模型化的元数据。比如相关对象的信息,包括名称、类型、长度等等。通常被开发人员提供的外部数据所参
23、数化,是代码生成中的变化因素 4。代码生成技术有四个特性 5:(1) 质量(Quality):如果手工编写代码,代码质量会随着时间推移或者程序员能力参差不齐而不同。利用代码生成器中的模板来生成代码,就能在一定程度上保证代码的质量。同时,模板的质量越高,产生的代码也就越好。(2) 一致性(Consistency):采用代码生成器能够保证生成代码风格的一代码生成技术5致。(3) 有了一致的类名、变量命名和方法签名,程序员就能够方便地使用这些代码进行业务逻辑的开发。(4) 生产力(Productivity):自动生成代码所需的时间远远小于程序员编写同样数量代码的时间。这样,程序员就可以把精力集中在需
24、要手工编写的部分,而不是进行重复劳动。而且当需求发生变化时,使用代码生成器只需要改动相关模板和规则,就能迅速生成大量代码。这样的效率不是人工编写代码能够达到的。(5) 抽象性(Abstraction):代码生成器把输入需求存储为独立于程序语言的抽象形式,在设计和生成的基础代码之间设立了一个抽象层。在实际的软件开发中,程序员常常会陷入到代码的某个细节中,从而忽视了业务逻辑规则。而由代码生成器生成的代码,可以以一种明确的形式来保持这些业务模式和业务规则。关于代码生成技术,比较有争议的一个观点是,认为它仅仅是另一种形式代码的复制、粘贴,破坏了软件开发的一些理念。我们可以从以下几点来看待这个问题:首先
25、,代码的复制、粘贴并不是一件坏事,它说明我们已经发现了一种有效的方式来重用代码。而代码生成器可以将这个过程自动化。假设有个需要复制、粘贴 50 次的代码,手工操作容易出现修改过程中的疏忽和代码遗漏。如果使用代码生成器,则代码的重用正确性会大大提高。其次,在程序结构日益复杂的今天,用手写代码来进行相似架构的开发,无疑是一种冗余的复杂劳动,而且开发过程中还会面临许多人工的疏忽,需要调试修正,这就耗费了大量的时间。最后,代码生成器是一种结合了经典架构和设计模式的抽象模型。手工编写的代码,未必能比由代码生成器生成的代码具有更好的可读性和可维护性。如果需要把业务规则写到代码中的话,最好就是将它们重构(R
26、efactoring) 6到独立的一层中。代码生成技术62.2 代码生成的实现技术代码生成的实现技术,也是代码生成研究的一个难点。目前可以选择的技术方法可有以下两种:(1) XML 和 XSLT 方法该方法利用了 XML 的树形结构,可以很好的体现元数据(即数据库信息)的结构。利用现有 XML 开发工具,可以直观地显示元数据。同时, XML 特有的有效性验证,可以方便地验证其有效性。XSLT 的强大转换功能使得包含元数据的 XML 文件可以转换成任意想要的文件格式。利用 XPath 的定位元素能力可以方便的从 XML 文件中获取相应元素的属性和值。使用该技术,生成模板较为简单,代价较小。但是如
27、果用户要对生成文件进行预览或者自定义操作时,就必须要经过 IO 的读写操作,大大增加了系统开销和运行时间。(2) 把模板封装成方法。该方法直接把代码生成的模板封装成类中的方法编写在程序中。这样每次生成的代码,可以让用户进行预览和自定义操作后,再导出生成代码。如果用户不需要自定义代码,则把读写 IO 操作放在后台运行,用户可以在生成代码的时候同时操作软件。经过两种技术比较,本文决定采用第二种方法,来实现代码生成器的实例。因为软件的目的主要是考虑最终用户的需求,所以能让用户有尽量多的便捷的自定义操作,会让软件更加方便使用。2.3 代码生成的优势和不足在软件开发过程中,使用代码生成器,有如下优点 7
28、: (1) 开发效率高。因为代码生成器将有固定模式的代码生成自动化,简化了程序员不必要的劳动。只需要在数据库选择表格,就能完成大量代码的生成。(2) 更新速度快。当需求发生变化时,只需要修改相应的模板就可以完成代码的更新。当数据库发生变化时,也只需要少量的时间就可以完成代码生成技术7代码的更新。(3) 保证代码风格的一致。代码生成器是根据模板生成代码的,所以变量命名以及编程风格都是一致的,不会出现由于不同程序员的操作所导致命名冲突等情况。(4) 可定制功能。通常各种生成器都会提供定制的功能,用户可以根据需求定制特定的输入,从而生成相应的代码。(5) 引导良好的编程习惯。由于模板生成的代码都是参
29、照经典的范例,可以使程序员也学习到这种开发风格,这有助于形成整个项目的代码规范的统一性。(6) 节省时间。模板生成代码可以使程序员把主要精力集中在业务逻辑的开发上,而不必花太多精力在一些固定模式化的代码部分。虽然代码生成器有着很多优点,但是也会在一些地方显示出不足:(1) 必须预先开发。如果开发代码生成器带来的效益小于手工编写的效益,那就会降低该软件的投资回报率。(2) 不是所有的程序代码都可以用代码生成器来生成,总是需要手工编写一定的代码。实际上,代码生成器的真正作用是作为手工代码的支撑作用。例如提供特定的业务逻辑处理类,在此类的开发过程中,容器提供了支撑代码的自动生成,但是具体的业务规则的
30、类模块总是需要软件开发人员来设计和实施的。2.4 本章总结本章主要介绍了代码生成技术的概念、特性、代码生成可以选择的技术,以及代码生成技术的优缺点。通过对代码生成的技术比较,选择一种较为合理的技术来实现。代码生成技术8第三章 代码生成器设计理论3.1 对象关系映射3.1.1 对象关系映射的概念对象关系映射(Object Relational Mapping,简称 ORM)是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术 8。它必须按照预先定义的一组映射规则,将面向对象中对象属性、类以及继承、聚集和关联等关系与关系数据库语义结构形成映射。这样一组映射规则就构成了应用系统的对象/关系映
31、射模式 9。本质上就是将数据从一种形式转换到另外一种形式。举个最简单的应用,将 SQL Server 中表对象转换成程序中的类加上和这个类相关的一些业务逻辑方法,转换如图 3-1 所示:图 3-1:对象关系转换示例对象关系映射其实是随着面向对象的思想产生而产生的。 面 向 对 象 的 开 发方 法 是 当 今 企 业 级 应 用 开 发 环 境 中 的 主 流 开 发 方 法 , 关 系 数 据 库 是 企 业 级 应用 环 境 中 永 久 存 放 数 据 的 主 流 数 据 存 储 系 统 。关系型数据库,是指采用了关系模型来组织数据的数据库。简单来说,关系模型指的就是二维表格模型,而一个关
32、系型数据库就是由二维表及其之间的联系组成的一个数据组织。面向对代码生成器设计理论9象思想则要求把数据和操作封装类里进行程序开发。面向对象和关系模型是两种完全不同的思想。类之间存在关联和继承关系,而在数据库中,关系数据无法直接表达多对多关联和继承关系。因此,为了解决这个不匹配的现象,对象关系映射(ORM)技术应运而生。它一般以中间件的形式存在,主要实现程序对象到关系数据库数据的映射 8。3.1.2 使用对象关系映射的优点对象映射关系在软件开发周期中,主要有如下四个优点:(1) 大大降低了学习和开发成本。随着现代编程技术的不断发展,程序员往往不仅要学习面向对象思想、设计模式、各种高级语言,还要学习
33、 ADO.NET、JDBC 等访问数据的技术。然而在实际的项目开发中,业务逻辑的开发则相对重要。使用对象关系映射使程序员节省在数据访问上耗费的时间,有更多的精力来完成业务逻辑的开发 10。(2) 提高性能。对象关系映射将实际数据存储和业务逻辑隔离开来,能够对每一层进行单独跟踪,增加了性能优化的可能。同时通过使用缓存(Cache) ,进一步优化性能。(3) 减少出错概率。实现了对象关系映射,程序员对访问数据库的操作就变的相对简单,不易出错。(4) 分离了数据层,方便进行数据库移植。开发人员不需要关注实际数据库的形式,要转换数据库的形式,只需要修改配置文件,而不需要修改程序。代码生成器设计理论10
34、3.2 三层架构介绍3.2.1 三层架构的概念三层架构是微软在 Petshop 中提出的一种网站开发的推荐架构。本文主要介绍 Petshop4.0 中的架构特性。三层架构即:表示层(Web Layer) 、业务逻辑层(Business Logic Layer) 、数据访问层(Data Access Layer) ,如图 3-2 所示:表示层 W E B业务逻辑层 B L L数据访问层 D A LS Q L S e rv e r D B O ra c le D B O th e r D B图 3-2:三层架构图数据访问层(DAL):也称为持久层, 主要是负责对数据库的访问。除了实现基本的增(in
35、sert)、删(delete)、改(update)、查(select)功能,还可以执行带任意参数的存储过程等常用数据库操作。业务逻辑层(BLL):是系统的核心部分,有关领域模型和业务逻辑。调用数据访问层的代码来完成相关数据库操作。代码生成器设计理论11表示层(WEB):是系统的 UI 部分,负责用户与整个系统的交互。在这一层中,最理想的状态是仅包含与界面元素的逻辑代码,所有与界面无关的逻辑都在业务逻辑层(BLL)中 8。3.2.2 三层架构之间的交互在数据访问层(DAL)中,采用 DAL Interface 抽象出数据访问逻辑,并以DAL Factory 作为数据访问层对象的工厂模块。对于 D
36、AL Interface 而言,分别有支持 MS-SQL 的 SQL Server DAL 和支持 Oracle 的 Oracle DAL 具体实现。而Model 模块则包含了数据实体对象。其详细的模块结构图如图 3-3 所示:DALFactory IDAL ModelSQLServerDAL OracleDAL业 业 业 业 业 业 业DAL业 业业 业 业 业 业业 业 业 业 业业 业 业 业 业 业 业 业 业 业 业 业 业业 业 业 业 业 业 业 业 业 业业 业 SQL Server业 业 业 业业 业 IDAL业 业业 业 Oracle业 业 业 业业 业 IDAL业 业图
37、3-3:DAL 层模块结构图用户通过调用 DALFactory 来生成对应的数据库操作对象。这里使用的是简单工厂模式。虽然不能确切的认为这是一种设计模式,但也是一种比较好的编程习惯。使用简单工厂模式,在初始化时可以不依赖具体类。在数据访问层(DAL)中,Petshop 完全采用了“ 面向接口编程”的思想。面向接口编程可以这样定义:在系统分析和架构中,分清层次和依赖关系,每个层次不是直接向其上层提供服务(即不是直接实例化在上层中),而是通过定义一组接口,仅向上层暴露其接口功能,上层对于下层仅仅是接口依赖,而代码生成器设计理论12不依赖具体类。 11这样做的好处是显而易见的,首先对系统灵活性大有好
38、处。当下层需要改变时,只要接口及接口功能不变,则上层不需做任何修改。甚至可以在不改动上层代码时将下层整个替换掉,使用接口的另一个好处就是不同部件或层次的开发人员可以并行开工,只要接口一致,设计合理,完全可以并行进行开发,从而提高效率。概括起来,面向接口编程的好处就是解耦合 12。在 Petshop 中的 IDAL,就使得程序与具体数据库解耦了,脱离了与具体数据库的依赖,便于程序和数据库移植。因为具体数据库的操作方法不尽相同,所以需要对具体数据库编写具体的代码,就有了相应的接口实现,比如SQLServerDAL、OracleDAL 等等。这里以 SQLServerDAL 为例,这个模块在DALF
39、actory 里被创建,实现业务逻辑层所需的一些与数据库相关的操作包括最基本的增(insert )、删(delete)、改(update )、查(select)。解耦也体现在业务逻辑层(BLL)对数据访问层(DAL)的解耦。将 IDAL这个接口抽象出来,业务逻辑层对其仅仅是接口依赖,而不依赖具体类。系统的灵活性就会相应得到提高。数据访问层(DAL)的修改,完全影响不到业务逻辑层(BLL)。其依赖关系如图 3-4:IBLLStrategyBLLDALFactory IDAL Model业 业 业 业 业 业业 业 业 业 业 业 业图 3-4:BLL 层与 DAL 层交互图代码生成器设计理论13
40、业务逻辑层(BLL)中包括了整个系统的业务逻辑,也是系统的核心模块。业务逻辑层(BLL)不直接对数据库操作,必须通过数据访问层(DAL)。BLL 层通过调用 IDAL 来完成对数据库的访问。因为与具体的数据访问逻辑无关,所以层与层之间是松耦合的。如果此时需要修改数据访问层的具体实现,只要不涉及到 IDAL 的接口定义,那么业务逻辑层就不会受到任何影响。毕竟,具体实现的 SQLServerDAL 和 OracalDAL 根本就与业务逻辑层没有半点关系。业务逻辑层(BLL)和表现层(WEB)之间的调用关系比较简单。当表现层(WEB)需要调用有关业务逻辑的方法时,就从业务逻辑层(BLL)中获取。其关
41、系如图 3-5:WEBBLL图 3-5:WEB 层和 BLL 层交互3.2.3 数据访问层的设计数据访问层主要通过两种对象和数据交互第一类是数据实体(Entity) 13 。数据实体主要对应于数据库中列名。这样做就可以把关系型数据库,转化成面向对象编程的模式。数据访问层(DAL)和业务逻辑层(BLL)就可以通过数据实体操作一个表对象,对其进行增(insert)、删(delete)、改(update)、查(select)。在 Petshop 中,有 Order,Product ,Category ,Inventory,Item 这些实体。代码生成器设计理论14以 Product 为例,实体和表的
42、对应如图 3-6:图 3-6:实体和表对应图这些对象并不具有持久化的功能,简单地说,它们是作为数据的载体,便于业务逻辑针对相应数据表进行读/写操作。虽然这些类的属性分别映射了数据表的列,而每一个对象实例也恰恰对应于数据表的每一行,但这些实体类却并不具备对应的数据库访问能力 12。第二类是与业务逻辑相关的数据库操作对象每个实体相关操作都存储在 IDAL 和 DBDAL 模块中有对应接口和实现。以 Product 为例,在 IProduct 中,就有以下方法:GetProduct() ,GetProductByCategory(), GetProductsSearch()。如图 3-7 所示:图
43、3-7:接口和实现对应图将数据实体与相关的数据库操作分离出来,符合面向对象的精神。首先,它体现了“职责分离”的原则。将数据实体与其行为分开,使得两者之间依赖减弱,当数据行为发生改变时,并不影响 Model 模块中的数据实体对象。这种代码生成器设计理论15与实现无关的设计,保证了系统的可扩展性,同时也保证了数据库的可移植性。这里有个工厂模式的应用。Petshop 中利用配置文件和反射功能来实现这个工厂模式。在配置文件中,直接指向具体的数据库对象实现类,例如PetShop.SQLServerDAL.IProduct15。 在数据访问层(DAL)中,还有一个模块为这类对象服务的,即DBHelper。
44、在 DBHelper 中封装了各种 SQL 语句的执行和返回,以及存储过程的执行和返回。SQLHelper 的结构如图 3-8:图 3-8:SQLHelper 类结构这样做,就不会出现 SQL 语句遍布整个程序的状况了。所有 SQL 语句都只出现在数据访问层(DAL)层。调用存储过程时,也不用手动设置参数。因为在 DBHelper 中存储过程的参数被很好得封装了,不用担心类型,或者返回方式的设置。从数据访问层的分析,我们可以抽象出一些固定的编码模式。(1) DBHelper 文件。因为封装了所有对数据库进行访问的代码是固定的,所以这个文件可以被多次利用。同样,也可以被代码生成器自动生成。(2)
45、 因为在业务逻辑层上,基本上每个程序都需要添加、更新和删除记录,根据主键值获得一条记录和获得所有记录,所以在 DAL 层,可以预先定义这些基本操作,然后在 BLL 通过 IDAL 的接口,调用相应方法。这样就可以在 BLL、IDAL、DAL 模块自动生成部分代码。(3) 数据实体类。数据实体就是数据库中表,应用对象关系映射封装成类代码生成器设计理论16文件。这个文件可以由代码生成器,从数据库中获得相关信息,然后自动生成。3.3 本章总结本章主要介绍了面向 B/S 三成架构代码生成技术的理论基础,主要是对象关系映射和三层架构。首先,阐述了对象关系映射技术在处理关系型数据库和面向对象编程矛盾中的作
46、用。其次,介绍了三层架构的构成,并对其数据访问层进行详细分析,抽象出可以模式化生成代码的部分。第四章 代码生成器实例4.1 项目开发背景当今开发网站的需求大大增加,但是开发的人力和时间往往有限。如何能在较短的时间内,利用有限的资源开发网站,成为一个值得思考的问题。使用代码生成器,就是一个可行的方案。所以,开发一款能够自动生成固定模式化的代码,并且能够让用户进行一些自定义操作的代码生成器,是十分有意义的。本文采用了.NET 框架中经典的三层架构的模式,并结合对象关系映射的思想,将数据表映射成 C#语言中的类进行相关操作。因为三层架构的普及应用,使得该代码生成器更具实用价值。代码生成器中的编程和命
47、名风格,也采用了被大家推崇的风格,具有良好的参考价值。4.2 项目总体设计SmartGenerator 是一款为 C#数据库程序员设计的自动代码生成器,SmartGenerator 生成的代码基于面向对象 的思想和三层架构设计,结合了Petshop 中经典的思想和设计模式,融入了工厂模式,反射机制等等一些思想,支持 Sql Server 和 Access 两种数据库。采用 DAL +BLL+Web 的设计,主要实代码生成器实例17现在对应数据库中表的基类代码的自动生成,包括生成属性、添加、修改、删除 、查询、存在性、Model 类构造等基础代码片断 ,使程序员可以节省大量机械录入的时间和 重复
48、劳动,而将精力集中于核心业务逻辑的开发。SmartGenerator 同时提供方便的多类型数据库管理,查询分析器,SQL 脚本生成,存储过程生成等多项开发工作中常用到的功能,可以使程序员很方便轻松地进行项目开发。SmartGenerator 要完成代码生成,需要从数据库中获取元数据,根据相应的模版,转换成三层架构的代码。它的代码生成工作原理如图 4-1:S Q L S e r v e r D BA c c e s s F i l eO t h e r D B根据模板转换M o d e l . c sI D A L . c sD A L . c sD a t a C a c h e . c sD
49、 A L F a c t o r y . c sB L L . c s元数据 生成代码文件D B H e l p e r . c s图 4-1:代码生成工作原理生成的代码文件在三层架构中的分布如图 4-2:代码生成器实例18D A L F a c t o r y . c sI D A L . c sD a t a C a c h e . c sD A L . c sM o d e l . c s B L L . c sD B H e l p e r . c sD A L 层B L L 层W E B 层图 4-2:代码生成文件分布(1) DALFactory: 生成 DataCatch 文件和用工厂模式生成 IDAL 接口的文件。(2) IDAL: 生成 IDAL 的接口文件。(3) SQLServerDAL: 生成 IDAL 接口对应于 SQLServer 的实现,还有进行数据库访问的 DBHelperSQL 文件。(4) Model: 生成名字为表名的数据实体文件。(5) BLL: 生成调用数据访问层(DAL)层接口文件的业务逻辑文件。SmartGenerator 主要功能模块