代码生成器设计说明书.docx
- 文档编号:11242082
- 上传时间:2023-02-26
- 格式:DOCX
- 页数:19
- 大小:741.70KB
代码生成器设计说明书.docx
《代码生成器设计说明书.docx》由会员分享,可在线阅读,更多相关《代码生成器设计说明书.docx(19页珍藏版)》请在冰豆网上搜索。
代码生成器设计说明书
代码生成器设计说明书
作者:
何鹏
版本号:
1.0
时间:
2009-12-11
修改时间:
版权所有:
1引言
编写目的
说明编写这份总体设计说明书的目的,指出预期的读者。
本文档为.net平台中代码生成器的开发、测试提供依据、指导。
预期的读者主要包括相关开发人员,测试人员。
设计目标
从现有数据库中生成ADNet1.0标准框架中的数据访问层,包括实体对象,IDAL,DAL,BLL层代码,并根据数据库自动生成解决方案,每层的项目文件及各个表的代码文件。
下图就是ADNet平台体系架构图。
ADNet平台体系架构图
背景
项目程序员在一个项目开发中需要花很多时间编写与数据库相关的数据访问层相关的代码,而这些代码结构相同,内容相似,与数据库联系紧密,代码量大。
为了让项目程序员从这些繁重的重复的代码编写工作解脱出来,专心于业务逻辑的代码编写,我们需要设计一个根据数据库中的表自动产生数据访问层相关的代码文件。
由于Model,IDAL,DAL,BLL层代码结构固定,变化不大,使自动生成代码成为可能。
所以我们在这个基础上设计了代码生成器。
定义
列出本文件用到的专门术语的定义和外文首字母组词的原词组。
参考资料
●动软.Net代码生成器(参考其程序结构功能)
●ADNetDemo代码文件(参考其代码几层的结构及规范)
2框架设计
●应用架构
我们从数据库抽取,代码生成两个结构来说明。
●体系结构
●总体架构
●体系结构
3代码生成器详细设计
3.1.1概述
代码生成器主要实现数据字段的读取和代码文字的组装,然后就是利用控件TextEditorControl实现对SQL语句和C#代码的高亮显示;最后我们界面利用DotNetBar控件做成类似于VS2005的界面风格。
3.1.2功能
列出主要功能:
◆访问三种不同数据库
◆产生数据库的树形列表
◆查看数据库属性(表,视图,存储过程,字段)
◆通过表名自动产生SQL基本语句(select,insert,update,delete)
◆执行sql语句并返回结果
◆获得视图,存储过程的sql定义
◆用户自定义代码生成(可选择层,可选择生成的DAL函数)
◆用户批量生成代码文件(解决方案文件,项目文件,各个层的代码文件)
3.1.3解决方案
总体组件包结构:
下面是代码生成器主要结构包图。
说明:
●接口IDAL主要功能是获取不同数据库的各个名称,内容,以及获取表结构,字段结构,视图,存储过程定义,并提供接口执行SQL语句。
●TextCodeUtility类,主要通过字段信息按照规范组装C#代码。
●ADFactroyModelCodeEdit类,主要通过TextCodeUtility类生成各个层代码并写入TextCode控件或者生成cs文件。
●DocEditFramework该包,主要生成SQL执行页面和数据库属性页面,用于动态创建。
●DBUtility用于提供访问各个数据库通用接口。
Ø类图
Ø参与者和职责
Ø策略
Ø相关模式
为了实现对不同数据库访问,我们主要使用了工厂模式。
Ø效果
4关键应用场景代码片断
//获取字段明细
publicSystem.Data.DataTableGetTableColDetails(stringDBName,stringTableName)
{
StringBuildersqlDetails=newStringBuilder();
sqlDetails.Append("selectORDINAL_POSITIONas序号,COLUMN_NAMEas列名,DATA_TYPEas字段类型,");
sqlDetails.Append("ifnull(CHARACTER_MAXIMUM_LENGTH,0)+ifnull(NUMERIC_PRECISION,0)as长度,");
sqlDetails.Append("caseIS_NULLABLEwhen'YES'thentrueelsefalseendas是否为空,");
sqlDetails.Append("caseCOLUMN_KEYwhen'PRI'thentrueelsefalseendas是否主键");
sqlDetails.Append(string.Format(@"frominformation_schema.COLUMNSwhereTABLE_SCHEMA='{0}'andTABLE_NAME='{1}';",DBName,TableName));
returnDB.ExecuteQuery(sqlDetails.ToString());
}
//根据需要获取表,视图,存储过程列表
publicSystem.Data.DataTableGetDBTableDetails(stringDBName,DBOBJTypetype)
{
StringBuildersqlDetails=newStringBuilder();
sqlDetails.Append(@"selectTABLE_NAMEAS名称,caseTABLE_TYPEwhen'BASETABLE'THEN'基础表'when'VIEW'then'视图'");
sqlDetails.Append(@"when'SYSTEMVIEW'then'系统视图'else'表'endas类型,'dbo'as所有者,CREATE_TIMEas创建时间");
sqlDetails.Append("frominformation_schema.TABLES");
switch(type)
{
caseDBOBJType.A:
sqlDetails.Append(string.Format("whereTABLE_SCHEMA='{0}'union",DBName));
sqlDetails.Append("selectnameas名称,'存储过程'as类型,'dbo'as所有者,createdas创建时间");
sqlDetails.Append(string.Format("frommysql.procwheredb='{0}'",DBName));
break;
caseDBOBJType.U:
sqlDetails.Append(string.Format("whereTABLE_SCHEMA='{0}'andTABLE_TYPE='BASETABLE'",DBName));
break;
caseDBOBJType.V:
sqlDetails.Append(string.Format("whereTABLE_SCHEMA='{0}'andTABLE_TYPE='VIEW'",DBName));
break;
caseDBOBJType.P:
sqlDetails.Remove(0,sqlDetails.Length);
sqlDetails.Append("selectnameas名称,'存储过程'as类型,'dbo'as所有者,createdas创建时间");
sqlDetails.Append(string.Format("frommysql.procwheredb='{0}'",DBName));
break;
}
sqlDetails.Append("orderby类型,名称;");
returnDB.ExecuteQuery(sqlDetails.ToString());
}
//获取sql语句
publicstringGetDDLScriptFromName(stringDBName,stringTableName,DDLddl)
{
stringsqlstring;
switch(ddl)
{
caseDDL.SELECT:
sqlstring=GetSelectTableScriptFromName(DBName,TableName);
break;
caseDDL.INSERT:
sqlstring=GetInsertScriptFromName(DBName,TableName);
break;
caseDDL.UPDATE:
sqlstring=GetUpdateTableScriptFromName(DBName,TableName);
break;
caseDDL.DELETE:
sqlstring=GetDelScriptFromName(DBName,TableName);
break;
default:
sqlstring=GetSelectTableScriptFromName(DBName,TableName);
break;
}
returnsqlstring;
}
下面列几个组装代码的函数
privateList
{
List
stringstrdefine="";
List
ExistsCode.AddRange(FunctionExpress("是否存在该记录"));
stringstrsql="publicboolExists(";
if(listpk.Count>0)
strdefine=GetPKListDefine(listpk);
strsql+=strdefine+")";
ExistsCode.Add(strsql);
ExistsCode.Add("{");
ExistsCode.Add("stringSQL;");
ExistsCode.Add(string.Format(@"SQL=""SelectCount(*)From{0}"";",tableName));
strsql="";
if(listpk.Count>0)
{
strsql=@"SQL+=""where";
foreach(ColumnDetailscolinlistpk)
{
strsql+=string.Format("{0}=@{0}and",col.ColName);
}
strsql=strsql.Substring(0,strsql.Length-4)+@""";";
ExistsCode.Add(strsql);
ExistsCode.AddRange(AddParmList(listpk));
}
ExistsCode.Add("returnthis.Session.Exists(CommandType.Text,SQL,parameters);");
ExistsCode.Add("}");
returnExistsCode;
}
publicList
{
List
dallist.Add(string.Format("publicclass{0}_DAO:
I{0}_DAO",tableName));
dallist.Add("{");
dallist.Add("publicISessionSession{get;set;}");
dallist.Add(string.Format("#regionI{0}_DAO成员",this.tableName));
if(mlist.IsGetMaxID)
dallist.AddRange(GetMaxIDDALCode());
if(mlist.IsExists)
{
dallist.AddRange(GetExistsDALCode());
dallist.AddRange(GetExistsWhereDALCode());
}
if(mlist.IsAdd)
{
dallist.AddRange(GetAddDALCode());
}
if(mlist.IsUpdate)
{
dallist.AddRange(GetUpdateDALCode());
dallist.AddRange(GetUpdatesWhereDALCode());
}
if(mlist.IsDelete)
{
dallist.AddRange(GetDeleteDALCode());
dallist.AddRange(GetDeletesWhereDALCode());
}
if(mlist.IsGetModel)
{
dallist.AddRange(GetEntityDALCode());
dallist.AddRange(GetEntitysWhereDALCode());
}
if(mlist.IsGetList)
{
dallist.AddRange(GetListDALCode());
}
dallist.Add("#endregion");
dallist.Add("}");
returndallist;
}
privateList
{
List
DALList.Add("usingSystem;");
DALList.Add("usingSystem.Collections.Generic;");
DALList.Add("usingSystem.Linq;");
DALList.Add("usingADNet.DBUtility;");
DALList.Add("usingSystem.Data;");
DALList.Add("usingSystem.Text;");
DALList.Add(string.Format("using{0}.IDAL;",topspacename));
DALList.Add("usingSystem.Collections;");
DALList.Add(string.Format("using{0};",DataAcess.DBusing));
DALList.Add(string.Format("using{0}.Entity;",topspacename));
DALList.Add("usingADNet.Com;");
DALList.Add(string.Format("namespace{0}.{1}DAL",topspacename,DataAcess.DB));
DALList.Add("{");
DALList.AddRange(codeUtlity.GetDALCode(methodlist));
DALList.Add("}");
returnDALList;
}
5接口API
编写组件代码,并在代码中描述接口的功能、定义和返回值;
通过C#的XMLtag,自动生成描述文档;
5.1扩展属性接口
5.2事件接口
5.3应用服务接口
6单元测试
每个组件对应一个单元测试工程;
单元测试的覆盖率必须满足“单元测试规范”的要求;
7数据库设计
描述该部分的数据库设计;
设计符合“数据库设计规范”;
7.1概述
7.2实体关系图:
8用户使用说明
下面针对几个重要的操作步骤做一些说明。
Ø添加数据库列表
选择点击右键
选择数据库,点击下一步
输入各个名称,点确定,测试连接,生成列表。
MySql,Oracle操作类似,就不再重复了。
如果已经添加的服务器,直接点连接就可以了,如下图:
连接成功后,就会出现如下图的列表:
Ø查看数据库属性
点击按钮属性,选择树形列表中的数据库,表等查看属性。
如下图:
ØSQL执行
选择某一个表名点右键,如下图:
可以生成SELECT,INSERT,UPDATE,DELETE等标准语句。
点击工具栏的执行sql语句,可以执行sql语句,并返回结果。
如下图:
Ø查看视图,存储过程定义
选择对象,点击右键,选择定义,如下图:
就可以查看对象sql内容。
Ø代码生成
选择表,点右键,点击代码生成器,如下图:
窗口右边就有如下显示:
写入命名空间,类名,选择代码类型,选择方法,就会生成如下图的代码
Ø代码批量生成
选择列表中的某一个数据,点右键,点代码批量生成,如下图:
选择需要生成的表到右边,输入顶级空间名,项目空间名,选择存储位置,点击生成,就会自动生成各个代码文件。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 代码 生成器 设计 说明书