




免费预览已结束,剩余50页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
本 科 毕 业 论 文 面向B/S三层架构的代码生成技术B/S Three-layer Structure Oriented Code Generation Technology 姓 名: 学 号:学 院:软件学院系:软件工程专 业:软件工程年 级: 校外指导教师: 校内指导教师: 年 月摘 要代码生成技术,是近几年发展起来的一种自动生成高级语言代码的技术。它的主要原理是:先获取元数据,然后根据模板和特定规则来自动生成代码。使用代码生成技术,可以免去程序员的一些重复劳动,适应多变的需求,缩短开发时间,提高开发效率。当前代码生成研究,主要集中在生成数据库访问代码。因为访问数据库可以用比较固定的模式来实现。代码生成器的技术选择有两种:(1)采用以XML为元数据文件,用XSLT作为模板来转换,实现代码生成。这个方法可以直观的展示元数据的结构,并且对编程技术要求不高,但其读写IO比较耗时。(2)把模板封装成方法,在内存中直接进行代码生成。这个方法方便用户预览和修改代码,但对编程要求比较高。本文以三层网站开发结构为基础,结合对象关系映射(ORM)的理论,实现了一种代码生成方式。主要内容如下: 第一,分析了当前程序开发中对代码自动生成的需求。总结了国内外在代码生成技术上的研究,以及相应的软件产品介绍。第二,阐述了代码生成的概念、特点,以及优势和不足。同时分析了可以实现代码生成的技术和其对应的优缺点。第三,研究BS三层架构代码生成的设计理论。介绍了对象关系映射(ORM)的思想,和它在代码生成中的作用。同时,介绍了经典的三层架构设计,抽象出其中固定的模式。第四,实现一个C#代码生成器实例。介绍其整体架构和详细设计方法,并给出相应的实现效果。关键词:代码生成;三层结构 ;ORM AbstractCode generation technology, is a programming technology for generating high level languages code 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 duration 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 first 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 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 relational 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. Meanwhile, 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 structure 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 代码生成的优势和不足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 系统运行界面及运行结果324.4.1 系统界面设计324.4.2 运行结果384.5 本章总结42第五章 总结435.1 本文研究工作总结435.2 代码生成技术展望43参考文献45致谢语47ContentsChapter 1 Exordium11.1 Introduction11.2 Researches Aroud The World11.3 Main Tasks21.4 Summary.3Chapter 2 Code Generation Technology42.1 Concept Of Code Generation42.2 The Implemetaion Technology52.3 Advances and Disadvances62.4 Summary7Chapter 3 The Design Theory of Code Generator83.1 Object Relational Mapping83.1.1 The Concept of ORM83.1.2 The Advances of ORM93.2 Three-Layer Framework93.2.1 The Concept of Three-layer Framework93.2.2 Cooperation in Three-layer Framework103.2.3 Design of Data Access Layer133.3 Summary15Chapter 4 Code Generator Sample164.1 Backgroud164.2 General Design164.3 Detailed Design214.3.1 Code Generation 214.3.2 Stored Procedure Generation264.3.3 Script Generation294.3.4 Code Editor304.3.5 Query Analyzer314.4 User Interface and Results324.4.1 User Interface324.4.2 Results384.5 Summary42Chapter 5 Summary435.1 Summary for This Paper435.2 Future Prospects43绪论Reference45Acknowledgements47第一章 绪论1.1 引言随着互联网的普及,网站开发的需求量也随之增加。目前,在开发网站时,程序员在编写代码的过程中,会重复着一些不必要且耗时的技术性劳动;另一方面,业务需求时常发生变化,使得程序开发和维护的难度大大提高。如何能够快速而又高质量的开发网站成为一个至关紧要的问题。在长期的编程过程中,人们研究发现了一些代码的固定模式。如果可以将这些固定模式的代码生成自动化,将会在一定程度上提高软件开发的效率。于是,就出现了代码生成技术。它是一个专注于提高编程效率,用程序来编程的研究方向。用代码生成工具生成代码不仅能够提高开发效率,而且能够保证代码风格的一致,大大提高代码的可读性和可维护性。1.2 国内外研究综述目前,在代码生成技术方面,己经提出了许多工程设计的模型和方法。这些模型和方法在描述用户界面或生成代码方面各有独特的见解。但很多模型和方法是用于直接描述用户界面,即是一种用户界面的编码手段,而不支持从需求分析到模型设计直至编码的全过程。这种方式使界面设计还是停留在手工编码和脑力劳动阶段。FMP模型就是一种面向软件工程的用户界面设计和自动生成模型。它利用功能模型(F)和对象模型(CM)捕捉与界面相关的功能和数据信息,用交互模型(CM)表达这些信息及控制关系。然后依据交互模型的描述,利用表示模型(P)建立内部对象和外部显示元素的对应关系来规划界面布局,从而指导和实现用户界面的自动代码生成1。已经开发出来的代码生成软件,主要有三个类别:(1) IDE代码开发工具。如.NET语言的开发工具Visual Studio,Java语言的开发工具Eclipse,都能自动生成一些框架代码。这些框架代码大都与业务逻辑无关,只是注重窗体和控件的初始化代码,在一定程度上方便了程序员的开发工48绪论(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环境下的分布式对象的存储;Sun 公司的基于JDO开发的O/R Mapping 工具。(3) 基于网站开发的专业代码生成工具。如Hibernate(基于Java平台)和NHibernate(基于.Net平台)这两款比较主流的网站代码生成工具。Hibernate是一个强大的,高性能的数据库映射工具,它能让开发者继续使用Java通常的开发习惯,诸如派生、多态、组合和Java集合框架等来开发持久对象层;同时它还提供一个精简的面向对象的SQL语言扩展,而且支持几乎目前所有的主流应用的数据库。NHibernate是一个基于.NET环境的对象关系数据库映射工具。NHibernate来源于非常优秀的基于Java的Hibernate关系型持久化工具。NHibemate很好的实现关系型数据库到面向对象实体的映射,并且提供数据查询和获取数据的方法,从而大幅度减少开发时人工使用SQL和ADONET处理数据的时间,提高了效率和安全性2。本文主要结合后两类代码生成工具的特点,采用相应的代码转换技术,开发一款基于.NET 平台的,结合经典的三层架构和对象关系映射思想,适合中小型网站开发的代码生成工具SmartGenerator。1.3 本文的主要任务本文通过对代码生成技术的理论基础进行分析,设计并实现了一个代码生成器实例。其主要任务如下:(1) 介绍代码生成技术的概念、特点,以及它的优势和不足。分析在代码生成中可以采用的技术方法和它们的优缺点。(2) 研究经典的三层架构,抽象出其中固定的模式。同时介绍了对象关系映射(ORM)的思想和它在代码生成中的作用。(3) 提出一个代码生成器的实现。介绍其整体架构和详细设计方法,并给出相应的实现效果。(4) 总结本论文的研究工作,并对未来的代码生成技术提出构想。代码生成技术1.4 本章总结本章主要介绍了代码生成技术的一些背景知识。首先阐述了当前代码生成的需求,接着介绍了国内外代码生成方面的研究方向以及相应的软件产品和特点,最后对本文所要完成的任务做了一个概述。第二章 代码生成技术2.1 代码生成技术的概念代码生成技术是指能够自动生成高级语言代码(如 C, C+, C#, Java, Perl等)的软件技术2。代码生成器一个基本的工作模式是:读取元数据(meta-data),例如数据库模型,然后根据一定的模板和规则来生成相应的源代码。如图2-1可以说明代码生成的模型。图2-1:代码生成模型模式/模板:代码生成中不变的关系或者模式。体现了代码生成中的共性。域规则:用于约束域数据结构和行为的规则。通常被代码生成器所封装。域元数据:是指将在生成代码中模型化的元数据。比如相关对象的信息,包括名称、类型、长度等等。通常被开发人员提供的外部数据所参数化,是代码生成中的变化因素4。代码生成技术有四个特性5:(1) 质量(Quality):如果手工编写代码,代码质量会随着时间推移或者程序员能力参差不齐而不同。利用代码生成器中的模板来生成代码,就能在一定程度上保证代码的质量。同时,模板的质量越高,产生的代码也就越好。(2) 一致性(Consistency):采用代码生成器能够保证生成代码风格的一致。代码生成技术(3) 有了一致的类名、变量命名和方法签名,程序员就能够方便地使用这些代码进行业务逻辑的开发。(4) 生产力(Productivity):自动生成代码所需的时间远远小于程序员编写同样数量代码的时间。这样,程序员就可以把精力集中在需要手工编写的部分,而不是进行重复劳动。而且当需求发生变化时,使用代码生成器只需要改动相关模板和规则,就能迅速生成大量代码。这样的效率不是人工编写代码能够达到的。(5) 抽象性(Abstraction):代码生成器把输入需求存储为独立于程序语言的抽象形式,在设计和生成的基础代码之间设立了一个抽象层。在实际的软件开发中,程序员常常会陷入到代码的某个细节中,从而忽视了业务逻辑规则。而由代码生成器生成的代码,可以以一种明确的形式来保持这些业务模式和业务规则。关于代码生成技术,比较有争议的一个观点是,认为它仅仅是另一种形式代码的复制、粘贴,破坏了软件开发的一些理念。我们可以从以下几点来看待这个问题:首先,代码的复制、粘贴并不是一件坏事,它说明我们已经发现了一种有效的方式来重用代码。而代码生成器可以将这个过程自动化。假设有个需要复制、粘贴50次的代码,手工操作容易出现修改过程中的疏忽和代码遗漏。如果使用代码生成器,则代码的重用正确性会大大提高。其次,在程序结构日益复杂的今天,用手写代码来进行相似架构的开发,无疑是一种冗余的复杂劳动,而且开发过程中还会面临许多人工的疏忽,需要调试修正,这就耗费了大量的时间。最后,代码生成器是一种结合了经典架构和设计模式的抽象模型。手工编写的代码,未必能比由代码生成器生成的代码具有更好的可读性和可维护性。如果需要把业务规则写到代码中的话,最好就是将它们重构(Refactoring)6到独立的一层中。2.2 代码生成的实现技术代码生成的实现技术,也是代码生成研究的一个难点。目前可以选择的技术方法可有以下两种:(1) XML 和 XSLT方法该方法利用了XML的树形结构,可以很好的体现元数据(即数据库信息)的结构。利用现有XML开发工具,可以直观地显示元数据。同时,XML特有的有效性验证,可以方便地验证其有效性。XSLT的强大转换功能使得包含元数据的XML文件可以转换成任意想要的文件格式。利用XPath的定位元素能力可以方便的从XML文件中获取相应元素的属性和值。使用该技术,生成模板较为简单,代价较小。但是如果用户要对生成文件进行预览或者自定义操作时,就必须要经过IO的读写操作,大大增加了系统开销和运行时间。(2) 把模板封装成方法。该方法直接把代码生成的模板封装成类中的方法编写在程序中。这样每次生成的代码,可以让用户进行预览和自定义操作后,再导出生成代码。如果用户不需要自定义代码,则把读写IO操作放在后台运行,用户可以在生成代码的时候同时操作软件。经过两种技术比较,本文决定采用第二种方法,来实现代码生成器的实例。因为软件的目的主要是考虑最终用户的需求,所以能让用户有尽量多的便捷的自定义操作,会让软件更加方便使用。2.3 代码生成的优势和不足在软件开发过程中,使用代码生成器,有如下优点7: (1) 开发效率高。因为代码生成器将有固定模式的代码生成自动化,简化了程序员不必要的劳动。只需要在数据库选择表格,就能完成大量代码的生成。(2) 更新速度快。当需求发生变化时,只需要修改相应的模板就可以完成代码的更新。当数据库发生变化时,也只需要少量的时间就可以完成代码的更新。(3) 保证代码风格的一致。代码生成器是根据模板生成代码的,所以变量命名以及编程风格都是一致的,不会出现由于不同程序员的操作所导致命名冲突等情况。(4) 可定制功能。通常各种生成器都会提供定制的功能,用户可以根据需求定制特定的输入,从而生成相应的代码。(5) 引导良好的编程习惯。由于模板生成的代码都是参照经典的范例,可以使程序员也学习到这种开发风格,这有助于形成整个项目的代码规范的统一性。(6) 节省时间。模板生成代码可以使程序员把主要精力集中在业务逻辑的开发上,而不必花太多精力在一些固定模式化的代码部分。虽然代码生成器有着很多优点,但是也会在一些地方显示出不足:(1) 必须预先开发。如果开发代码生成器带来的效益小于手工编写的效益,那就会降低该软件的投资回报率。(2) 不是所有的程序代码都可以用代码生成器来生成,总是需要手工编写一定的代码。实际上,代码生成器的真正作用是作为手工代码的支撑作用。例如提供特定的业务逻辑处理类,在此类的开发过程中,容器提供了支撑代码的自动生成,但是具体的业务规则的类模块总是需要软件开发人员来设计和实施的。2.4 本章总结本章主要介绍了代码生成技术的概念、特性、代码生成可以选择的技术,以及代码生成技术的优缺点。通过对代码生成的技术比较,选择一种较为合理的技术来实现。代码生成器设计理论第三章 代码生成器设计理论3.1 对象关系映射3.1.1 对象关系映射的概念对象关系映射(Object Relational Mapping,简称ORM)是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术8。它必须按照预先定义的一组映射规则,将面向对象中对象属性、类以及继承、聚集和关联等关系与关系数据库语义结构形成映射。这样一组映射规则就构成了应用系统的对象/关系映射模式9。本质上就是将数据从一种形式转换到另外一种形式。举个最简单的应用,将SQL Server中表对象转换成程序中的类加上和这个类相关的一些业务逻辑方法,转换如图3-1所示:图3-1:对象关系转换示例对象关系映射其实是随着面向对象的思想产生而产生的。面向对象的开发方法是当今企业级应用开发环境中的主流开发方法,关系数据库是企业级应用环境中永久存放数据的主流数据存储系统。关系型数据库,是指采用了关系模型来组织数据的数据库。简单来说,关系模型指的就是二维表格模型,而一个关系型数据库就是由二维表及其之间的联系组成的一个数据组织。面向对象思想则要求把数据和操作封装类里进行程序开发。面向对象和关系模型是两种完全不同的思想。类之间存在关联和继承关系,而在数据库中,关系数据无法直接表达多对多关联和继承关系。因此,为了解决这个不匹配的现象,对象关系映射(ORM)技术应运而生。它一般以中间件的形式存在,主要实现程序对象到关系数代码生成器设计理论据库数据的映射8。3.1.2 使用对象关系映射的优点对象映射关系在软件开发周期中,主要有如下四个优点:(1) 大大降低了学习和开发成本。随着现代编程技术的不断发展,程序员往往不仅要学习面向对象思想、设计模式、各种高级语言,还要学习ADO.NET、JDBC等访问数据的技术。然而在实际的项目开发中,业务逻辑的开发则相对重要。使用对象关系映射使程序员节省在数据访问上耗费的时间,有更多的精力来完成业务逻辑的开发10。(2) 提高性能。对象关系映射将实际数据存储和业务逻辑隔离开来,能够对每一层进行单独跟踪,增加了性能优化的可能。同时通过使用缓存(Cache),进一步优化性能。(3) 减少出错概率。实现了对象关系映射,程序员对访问数据库的操作就变的相对简单,不易出错。(4) 分离了数据层,方便进行数据库移植。开发人员不需要关注实际数据库的形式,要转换数据库的形式,只需要修改配置文件,而不需要修改程序。3.2 三层架构介绍3.2.1 三层架构的概念三层架构是微软在Petshop中提出的一种网站开发的推荐架构。本文主要介绍Petshop4.0中的架构特性。三层架构即:表示层(Web Layer)、业务逻辑层(Business Logic Layer)、数据访问层(Data Access Layer),如图3-2所示:图3-2:三层架构图数据访问层(DAL):也称为持久层, 主要是负责对数据库的访问。除了实现基本的增(insert)、删(delete)、改(update)、查(select)功能,还可以执行带任意参数的存储过程等常用数据库操作。业务逻辑层(BLL):是系统的核心部分,有关领域模型和业务逻辑。调用数据访问层的代码来完成相关数据库操作。表示层(WEB):是系统的UI部分,负责用户与整个系统的交互。在这一层中,最理想的状态是仅包含与界面元素的逻辑代码,所有与界面无关的逻辑都在业务逻辑层(BLL)中8。3.2.2 三层架构之间的交互在数据访问层(DAL)中,采用DAL Interface抽象出数据访问逻辑,并以DAL Factory作为数据访问层对象的工厂模块。对于DAL Interface而言,分别有支持MS-SQL的SQL Server DAL和支持Oracle的Oracle DAL具体实现。而Model模块则包含了数据实体对象。其详细的模块结构图如图3-3所示:图3-3:DAL层模块结构图用户通过调用DALFactory来生成对应的数据库操作对象。这里使用的是简单工厂模式。虽然不能确切的认为这是一种设计模式,但也是一种比较好的编程习惯。使用简单工厂模式,在初始化时可以不依赖具体类。在数据访问层(DAL)中,Petshop完全采用了“面向接口编程”的思想。面向接口编程可以这样定义:在系统分析和架构中,分清层次和依赖关系,每个层次不是直接向其上层提供服务(即不是直接实例化在上层中),而是通过定义一组接口,仅向上层暴露其接口功能,上层对于下层仅仅是接口依赖,而不依赖具体类。11这样做的好处是显而易见的,首先对系统灵活性大有好处。当下层需要改变时,只要接口及接口功能不变,则上层不需做任何修改。甚至可以在不改动上层代码时将下层整个替换掉,使用接口的另一个好处就是不同部件或层次的开发人员可以并行开工,只要接口一致,设计合理,完全可以并行进行开发,从而提高效率。概括起来,面向接口编程的好处就是解耦合12。在Petshop中的IDAL,就使得程序与具体数据库解耦了,脱离了与具体数据库的依赖,便于程序和数据库移植。因为具体数据库的操作方法不尽相同,所以需要对具体数据库编写具体的代码,就有了相应的接口实现,比如SQLServerDAL、OracleDAL等等。这里以SQLServerDAL为例,这个模块在DALFactory里被创建,实现业务逻辑层所需的一些与数据库相关的操作包括最基本的增(insert)、删(delete)、改(update)、查(select)。解耦也体现在业务逻辑层(BLL)对数据访问层(DAL)的解耦。将IDAL这个接口抽象出来,业务逻辑层对其仅仅是接口依赖,而不依赖具体类。系统的灵活性就会相应得到提高。数据访问层(DAL)的修改,完全影响不到业务逻辑层(BLL)。其依赖关系如图3-4:图3-4:BLL层与DAL层交互图业务逻辑层(BLL)中包括了整个系统的业务逻辑,也是系统的核心模块。业务逻辑层(BLL)不直接对数据库操作,必须通过数据访问层(DAL)。BLL层通过调用IDAL来完成对数据库的访问。因为与具体的数据访问逻辑无关,所以层与层之间是松耦合的。如果此时需要修改数据访问层的具体实现,只要不涉及到IDAL的接口定义,那么业务逻辑层就不会受到任何影响。毕竟,具体实现的SQLServerDAL和OracalDAL根本就与业务逻辑层没有半点关系。业务逻辑层(BLL)和表现层(WEB)之间的调用关系比较简单。当表现层(WEB)需要调用有关业务逻辑的方法时,就从业务逻辑层(BLL)中获取。其关系如图3-5:图3-5:WEB层和BLL层交互3.2.3 数据访问层的设计数据访问层主要通过两种对象和数据交互第一类是数据实体(Entity) 13 。数据实体主要对应于数据库中列名。这样做就可以把关系型数据库,转化成面向对象编程的模式。数据访问层(DAL)和业务逻辑层(BLL)就可以通过数据实体操作一个表对象,对其进行增(insert)、删(delete)、改(update)、查(select)。在Petshop中,有Order,Product,Category,Inventory,Item这些实体。以Product为例,实体和表的对应如图3-6:图3-6:实体和表对应图这些对象并不具有持久化的功能,简单地说,它们是作为数据的载体,便于业务逻辑针对相应数据表进行读/写操作。虽然这些类的属性分别映射了数据表的列,而每一个对象实例也恰恰对应于数据表的每一行,但这些实体类却并不具备对应的数据库访问能力12。第二类是与业务逻辑相关的数据库操作对象每个实体相关操作都存储在IDAL和DBDAL模块中有对应接口和实现。以Product为例,在IProduct中,就有以下方法:GetProduct(),GetProductByCategory(),GetProductsSearch()。如图3-7所示:图3-7:接口和实现对应图将数据实体与相关的数据库操作分离出来,符合面向对象的精神。首先,它体现了“职责分离”的原则。将数据实体与其行为分开,使得两者之间依赖减弱,当数据行为发生改变时,并不影响Model模块中的数据实体对象。这种与实现无关的设计,保证了系统的可扩展性,同时也保证了数据库的可移植性。这里有个工厂模式的应用。Petshop中利用配置文件和反射功能来实现这个工厂模式。在配置文件中,直接指向具体的数据库对象实现类,例如PetShop.SQLServerDAL.IProduct15。 在数据访问层(DAL)中,还有一个模块为这类对象服务的,即DBHelper。在DBHelper中封装了各种SQL语句的执行和返回,以及存储过程的执行和返回。SQLHelper的结构如图3-8:图3-8:SQLHelper类结构这样做,就不会出现SQL语句遍布整个程序的状况了。所有SQL语句都只出现在数据访问层(DAL)层。调用存储过程时,也不用手动设置参数。因为在DBHelper中存储过程的参数被很好得封装了,不用担心类型,或者返回方式的设置。从数据访问层的分析,我们可以抽象出一些固定的编码模式。(1) DBHelper文件。因为封装了所有对数据库进行访问的代码是固定的,所以这个文件可以被多次利用。同样,也可以被代码生成器自动生成。(2) 因为在业务逻辑层上,基本上每个程序都需要添加、更新和删除记录,根据主键值获得一条记录和获得所有记录,所以在DAL层,可以预先定义这些基本操作,然后在BLL通过IDAL的接口,调用相应方法。这样就可以在BLL、IDAL、DAL模块自动生成部分代码。(3) 数据实体类。数据实体就是数据库中表,应用对象关系映射封装成类文件。这个文件可以由代码生成器,从数据库中获得相关信息,然后自动生成。3.3 本章总结代码生成器实例本章主要介绍了面向B/S三成架构代码生成技术的理论基础,主要是对象关系映射和三层架构。首先,阐述了对象关系映射技术在处理关系型数据库和面向对象编程矛盾中的作用。其次,介绍了三层架构的构成,并对其数据访问层进行详细分析,抽象出可以模式化生成代码的部分。第四章 代码生成器实例4.1 项目开发背景当今开发网站的需求大大增加,但是开发的人力和时间往往有限。如何能在较短的时间内,利用有限的资源开发网站,成为一个值得思考的问题。使用代码生成器,就是一个可行的方案。所以,开发一款能够自动生成固定模式化的代码,并且能够让用户进行一些自定义操作的代码生成器,是十分有意义的。本文采用了.NET框架中经典的三层架构的模式,并结合对象关系映射的思想,将数据表映射成C#语言中的类进行相关操作。因为三层架构的普及应用,使得该代码生成器更具实用价值。代码生成器中的编程和命名风格,也采用了被大家推崇的风格,具有良好的参考价值。4.2 项目总体设计SmartGenerator是一款为C#数据库程序员设计的自动代码生成器,SmartGenerator生成的代码基于面向对象的思想和三层架构设计,结合了Petshop中经典的思想和设计模式,融入了工厂模式,反射机制等等一些思想,支持Sql Server 和 Access两种数据库。采用DAL+BLL+Web的设计,主要实现在对应数据库中表的基类代码的自动生成,包括生成属性、添加、修改、删除、查询、存在性、Model类构造等基础代码片断,使程序员可以节省大量机械录入的时间和重复劳动,而将精力集中于核心业务逻辑的开发。SmartGenerator同时提供方便的多类型数据库管理,查询分析器,SQL脚本生成,存储过程生成等多项开发工作中常用到的功能,可以使程序员很方便轻松地进行项目开发。SmartGenerator要完成代码生成,需要从数据库中获取元数据,根据相应的模版,转换成三层架构的代码。它的代码生成工作原理如图4-1:图4-1:代码生成工作原理生成的代码文件在三层架构中的分布如图4-2:图4-2:代码生成文件分布(1) DALFactory: 生成DataCatch文件和用工厂模式生成IDAL接口的文件。(2) IDAL: 生成IDAL的接口文件。(3) SQLServerDAL: 生成IDAL接口对应于SQLServer的实现,还有进行数据库访问的DBHelperSQL文件。(4) Model: 生成名字为表名的数据实体文件。(5) BLL: 生成调用数据访问层(DAL)层接口文件的业务逻辑文件。SmartGenerator 主要功能模块有:生成基本代码、生成存储过程、生成脚本文件、代码编辑器和查询分析器。如图4-3所示:代码生成器实例图4-3:功能模块图SmartGenerator 中主要有五个窗体:FormLogin、FormLoginAccess、FormMain、FormExport、FormGenerate、FormQuickGenerate。它们之间调用关系如图4-4:图4-4:窗体调用关系图FormLogin:默认的SQL Server登陆界面,如果为其他数据库类型,则进一步调用其他数据库登录界面。如果为SQL Server数据,则进一步调用FormMain,进入主操作界面。FormLoginAccess:Access数据库的登录界面,选择相应Access数据库文件后,进入主操作界面FormMain。FormMain:主要操作界面,用户选择代码生成、存储过程生成、脚本生成、查询分析等功能。如果进行代码生成,就调用FromGenerate或者FormQuickGenerate。FormExport:用于导出用户自定义修改后代码的界面。FormGenerate:生成代码的界面,可以设置代码生成的各种参数,如命名空间,生成目标文件夹,所要生成的数据库表。FormQuickGenerate:快速生成代码的界面,可以在主界面中,直接选择表生成代码,参数都有设置默认值。 每个窗体除了调用自身的界面处理代码,还调用相关类方法来完成各种功能。主窗体FormMain所调用类的关系如图4-5所示:图4-5:主窗体所调用的类文件GenerateCs:产生C#代码的方法类,其生成方法的返回类型都为字符串。这样方便在代码编辑界面中使用。还需要是使用自定义的MyColumn类型,来存储相关列的信息。GenerateSP:自动生成存储过程的方法类。其自动生成的存储过程将显示在查询分析器中。GenerateScript:根据用户选择对象的类型,如果为表,则在查询分析器里生成表的脚本;如果为存储过程,则在查询分析器里生成存储过程的脚本。Util:包括从数据库中获取信息的方法,类型转换方法。生成代码的窗体FormGenerate和FormQuickGenerate所调用类的关系如图4-6所示:图4-6:窗体调用关系图WriteCs:需要调用GenerateCs,然后将CS文件生成到指定目录下。GenerateCs:在Util中完成类型转换,用 MyColumn对象处理列的信息。MyColumn: 封装列对象的类。4.3 项目详细设计4.3.1 生成基本代码模块生成基本代码需要解决两个问题,一是元数据的获取,二是模板的转换。本系统主要支持SQL Server和Access两种数据库作为数据源。由于两种数据库机制不同,所以元数据的获取方式也不相同。1. 获取SQL Server中元数据Master数据库中保存着该连接上的所有数据库的元数据。SQL Server中的每个数据库在sysdatabases表中占一行。最初安装 SQL Server 时sysdatabases 包含 master 、 model 、 msdb 、 mssqlweb 和 tempdb 数据库的项。获取所有数据库的名字可以用如下方式获得,表的结构和查询语句图4-7所示: 图4-7:sysdatabases表结构和查询语句在SQL Server数据库中,元数据主要存储在INFORMATION_SCHEMA表中。在INFORMATION_SCHEMA中,有几个只读表。它们实际上是视图,而不是基本表,因此,你将无法看到与之相关的任何文件。访问INFORMATION_SCHEMA中所含表的唯一方式是使用SELECT语句。不能在其中插入内容,不能更新它们,也不能删除其中的内容。INFORMATION_SCHEMA.TABLES表给出了关于数据库中的表的信息。所以我们可以用以下语句获取一个数据库中所有表名,表的结构和查询语句如图4-8所示:图4-8:SCHEMA.TABLES表结构和查询语句INFORMATION_SCHEMA.KEY_COLUMN_USAGE表中描述了表中具有约束的键列。要获取该表的主键,还需连接CONSTRAINTS表,根据表名和主键约束名字,得到表的主键列名,表的结构和查询语句如图4-9和图4-10:所示图4-9:KEY_COLUMN_USAGE和TABLE_CONSTRAINTS表结构图4-10:主键查询语句INFORMATION_SCHEMA. COLUMNS表给出了数据库表中的列的详细信息。在COLUMNS表中,可以得到列名,数据类型,默认值等。如果同时要获得该列的长度,则需要连接sys.syscolumns表,用列名取得,表的结构和查询语句如图4-11和图4-12所示:图4-11:SCHEMA.COLUMNS和sys.syscolumns连接图图4-12:列信息查询语句2. 获取Access中元数据 Access数据库中,不能简单得使用查询语句获得相关元数据。因为OleDb数据库只能通过预定义的架构行集合(schema rowsets)来获取架构信息,包括类型、表、列、索引、视图、约束等等。预定义的架构行集合主要用在动态编程中,比如在编译的时候没办法获得数据库的结构信息,就可以使用预定义的架构行集合15。架构行集合中包括下列成员,如表4-1:表4-1:架构行集合成员列表ASSERTIONSCATALOGSCONSTRAINT_TABLE_USAGECOLLATIONSCOLUMNSCOLUMN_PRIVILEGESPRIMARY_KEYSCHARACTER_SETSCONSTRAINT_COLUMN_USAGEFOREIGN_KEYSCHECK_CONSTRAINTSCOLUMN_DOMAIN_USAGEINDEXESKEY_COLUMN_USAGEPROCEDURE_COLUMNSPROCEDURESPROVIDER_TYPESPROCEDURE_PARAMETERsSQL_LANGUAGESSCHEMATATABLE_CONSTRAINTSSTATISTICSTABLE_PRIVILEGEREFERENTIAL_CONSTRAINTSTABLESTRANSLATIONSVIEW_COLUMN_USAGEVIEWSUSAGE_PRIVILEGESVIEW_TABLE_USAGE所以,在获取Access数据库中的元数据时,我们需要调用能够与OleDb中架构行集合交互的方法,即OleDbConnection.GetOleDbSchemaTable。使用该方法可以设置相关限制条件从数据源中获取架构信息。返回的结果是一个OleDbSchemaGuid架构表,表中的行结构与OLEDB数据库中行集合(rowset)的结构是一样的。我们可以设置表名、类型、所有者、架构等限制条件,以数组的形式作为参数传入方法。如果将一个空数组传入,则会返回一个默认形式的架构信息表。OleDbSchemaGuid架构表中的每个元素其实都是对应于OLEDB数据库中的行集合(rowset)。比如,在限制条件数组中的第一个元素,对于与行集合中的第一列。获取
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 顶岗老师班会课件模板
- 金属冶炼负责人安管人员培训
- 音乐课国防教育课件
- 水肌酸产品项目运营管理方案
- 电网侧独立储能示范项目经济效益和社会效益分析报告
- 城镇污水管网建设项目人力资源管理方案(模板范文)
- xx片区城乡供水一体化项目建设管理方案
- 先进金属材料行动计划
- 无人驾驶配送车辆定位精度提升
- 2025年井下多功能测振仪项目建议书
- (高清版)DB11∕T 2429-2025 补充耕地质量调查与评价技术规范
- 2025年贵州省6月28日纳雍事业单位教师岗考试真题及答案
- 提高冠脉介入手术术前准备的合格率护理品管圈QCC成果汇报课件(完整内容可编辑修改)
- 机关档案管理工作培训PPT课件
- 油轮、化学品船的基本知识
- 25T汽车吊检验报告
- 变频空调中的永磁电机电感分析
- 高考常考语法填空词性转换汇总
- AOI自动光学检测设备程序编写
- 厦门护士延续注册体检表
- GB∕T 386-2021 柴油十六烷值测定法
评论
0/150
提交评论