博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
分享改进 完全定制自己的代码生成器
阅读量:6942 次
发布时间:2019-06-27

本文共 10763 字,大约阅读时间需要 35 分钟。

codesmith确实是款不错的工具 但是它并不开源 对于一些有自己特殊需求的用户只能自己另想其他解决方案 例如我说想做一个web版本的代码生成器或者说用户没有c#基础

这里开源一个之前做过的工具 当初的目的主要是解决在框架当中局部更新的问题

因为在大部分orm框架当中都是简单的获取一个实体 然后这个实体某个值 然后更新的时候 还是传入这个改变的实体 不过严格意义上来说 在你传入更新实体的时候 它的其他字段说不定已经被其他请求更新过了 所以导致你的这次更新会覆盖掉别人的更新 当然也会有同一字段的问题 不过这里不深入讨论该问题 重点在代码生成上

另外一个意义 就是让大家了解一下一般的代码生成器的工作流程以及实现方法


Github地址 

使用方法很简单 先输入数据库连接字符串 下面会出现table和view,当然自己可以根据源代码加载更多的内容

我程序里主要生成实体层和数据处理层所以我提供了2个文本框 一个是实体层的命名空间 一个是数据处理层的命名的命名空间,这样就不用在模板里设置,可以在win界面或者web界面直接修改

选择好表和view并且设置好命名空间后点击启动 左下角提示成功后就可以打开目录 查看自己生成的文件

生成的实体文件

这里的PartiallyColumnAttribute主要就是用来解决局部更新问题,和代码生成本身无关联。

DA文件

//------------------------------------    //用途:表LitespeedActivity的数据处理类(工具自动生成)    //作者:杜兵    //时间:2015-03-11 05:43:32    //-------------------------------------    using System;    using System.Data;    using System.Data.Common;    using Model.Service;    using Ctrip.TMPay.Framework.Common;    using Ctrip.TMPay.DataAccess.Common;    namespace DataAccess.Service    {        public partial class LitespeedActivityDA : BaseDA
{ ///
/// 根据主键获取LitespeedActivity /// ///< param name="serverName"> ///< returns> public LitespeedActivityEntity GetLitespeedActivity(String serverName) { DbCommand dbCmd = DbObject.GetSqlStringCommand(SqlCommandConstants.LitespeedActivitySelectCommand); DbObject.AddInParameter(dbCmd, "@ServerName", DbType.String, serverName); LitespeedActivityEntity litespeedActivityEntity = null; using (IDataReader dataReader = DbObject.ExecuteReader(dbCmd)) { if (dataReader.Read()) { litespeedActivityEntity = new LitespeedActivityEntity{ ServerName = DbFieldHelper.GetString(dataReader, "ServerName"), ActivityID = DbFieldHelper.GetInt32(dataReader, "ActivityID"), DatabaseID = DbFieldHelper.GetInt32(dataReader, "DatabaseID"), ActivityTypeID = DbFieldHelper.GetInt32(dataReader, "ActivityTypeID"), StartTime = DbFieldHelper.GetDateTime(dataReader, "StartTime"), FinishTime = DbFieldHelper.GetDateTime(dataReader, "FinishTime"), StatusTypeID = DbFieldHelper.GetInt32(dataReader, "StatusTypeID"), DatabaseSize = DbFieldHelper.GetDouble(dataReader, "DatabaseSize"), PercentCompleted = DbFieldHelper.GetInt32(dataReader, "PercentCompleted"), ActivityDetail = DbFieldHelper.GetString(dataReader, "ActivityDetail"), ErrorMessage = DbFieldHelper.GetString(dataReader, "ErrorMessage"), ResultMessage = DbFieldHelper.GetString(dataReader, "ResultMessage"), ReplicateID = DbFieldHelper.GetGuid(dataReader, "ReplicateID"), LS = DbFieldHelper.GetByte(dataReader, "LS"), PID = DbFieldHelper.GetInt32(dataReader, "PID"), NativeSize = DbFieldHelper.GetDouble(dataReader, "NativeSize"), BackupSize = DbFieldHelper.GetDouble(dataReader, "BackupSize"), BackupTime = DbFieldHelper.GetDouble(dataReader, "BackupTime"), AttachedNativeSize = DbFieldHelper.GetDouble(dataReader, "AttachedNativeSize"), AttachedBackupSize = DbFieldHelper.GetDouble(dataReader, "AttachedBackupSize"), AttachedBackupTime = DbFieldHelper.GetDouble(dataReader, "AttachedBackupTime"), }; } } return litespeedActivityEntity; } ///
/// 根据主键获取LitespeedActivity /// ///< param name="activityID"> ///< returns> public LitespeedActivityEntity GetLitespeedActivity(Int32 activityID) { DbCommand dbCmd = DbObject.GetSqlStringCommand(SqlCommandConstants.LitespeedActivitySelectCommand); DbObject.AddInParameter(dbCmd, "@ActivityID", DbType.Int32, activityID); LitespeedActivityEntity litespeedActivityEntity = null; using (IDataReader dataReader = DbObject.ExecuteReader(dbCmd)) { if (dataReader.Read()) { litespeedActivityEntity = new LitespeedActivityEntity{ ServerName = DbFieldHelper.GetString(dataReader, "ServerName"), ActivityID = DbFieldHelper.GetInt32(dataReader, "ActivityID"), DatabaseID = DbFieldHelper.GetInt32(dataReader, "DatabaseID"), ActivityTypeID = DbFieldHelper.GetInt32(dataReader, "ActivityTypeID"), StartTime = DbFieldHelper.GetDateTime(dataReader, "StartTime"), FinishTime = DbFieldHelper.GetDateTime(dataReader, "FinishTime"), StatusTypeID = DbFieldHelper.GetInt32(dataReader, "StatusTypeID"), DatabaseSize = DbFieldHelper.GetDouble(dataReader, "DatabaseSize"), PercentCompleted = DbFieldHelper.GetInt32(dataReader, "PercentCompleted"), ActivityDetail = DbFieldHelper.GetString(dataReader, "ActivityDetail"), ErrorMessage = DbFieldHelper.GetString(dataReader, "ErrorMessage"), ResultMessage = DbFieldHelper.GetString(dataReader, "ResultMessage"), ReplicateID = DbFieldHelper.GetGuid(dataReader, "ReplicateID"), LS = DbFieldHelper.GetByte(dataReader, "LS"), PID = DbFieldHelper.GetInt32(dataReader, "PID"), NativeSize = DbFieldHelper.GetDouble(dataReader, "NativeSize"), BackupSize = DbFieldHelper.GetDouble(dataReader, "BackupSize"), BackupTime = DbFieldHelper.GetDouble(dataReader, "BackupTime"), AttachedNativeSize = DbFieldHelper.GetDouble(dataReader, "AttachedNativeSize"), AttachedBackupSize = DbFieldHelper.GetDouble(dataReader, "AttachedBackupSize"), AttachedBackupTime = DbFieldHelper.GetDouble(dataReader, "AttachedBackupTime"), }; } } return litespeedActivityEntity; } ///
/// 全参数更新LitespeedActivity /// ///< param name="litespeedActivityEntity">LitespeedActivityEntity ///< returns> public BizResult
UpdateLitespeedActivity(LitespeedActivityEntity litespeedActivityEntity) { FillParams(litespeedActivityEntity); return PartiallyUpdateLitespeedActivity(litespeedActivityEntity); } ///
/// 部分参数更新LitespeedActivity /// ///< param name="litespeedActivityEntity">LitespeedActivityEntity ///< returns> public BizResult
PartiallyUpdateLitespeedActivity(LitespeedActivityEntity litespeedActivityEntity) { return ExecuteSP(SqlProcedureConstants.LitespeedActivityUpdateSpName, CheckUpdate, litespeedActivityEntity); } ///
/// 创建LitespeedActivity /// ///< param name="litespeedActivityEntity">LitespeedActivityEntity ///< returns> public BizResult
CreateLitespeedActivity(LitespeedActivityEntity litespeedActivityEntity) { FillParams(litespeedActivityEntity); return ExecuteSP(SqlProcedureConstants.LitespeedActivityInsertSpName, null, litespeedActivityEntity); } ///
/// 删除LitespeedActivity /// ///< param name="litespeedActivityEntity">LitespeedActivityEntity ///< returns> public BizResult
DeleteLitespeedActivity(LitespeedActivityEntity litespeedActivityEntity) { FillPKParams(litespeedActivityEntity); return ExecuteSP(SqlProcedureConstants.LitespeedActivityDeleteSpName, null, litespeedActivityEntity); } } }

还有其他的一些文件就不一一列出了

原理很简单 也是根据模板。不过和codesmith不同的是 我这里用的是xsl模板包括语法

基于xml的语法并不难 就算不懂.net的人学习半个小时也可以自己定制模板了

举个例子

Table
//------------------------------------ //用途:表
的实体类(工具自动生成) //作者:杜兵 //时间:
//------------------------------------- using System; using System.Data; namespace
{ [Serializable] public partial class
Entity : BaseEntity {
System.Xml.Linq.XElement
rowversion
Variant
///
///
///
[PartiallyColumnAttribute(DbType =
, CanBeNull = false
, CanBeNull = true
, IsPrimaryKey = true
)] public
{ get; set; }
} }

  这里代码里模板实现主要是解决局部更新的功能,大家可以根据自己不同的需求来修改部分逻辑。

  核心的配置文件在config下CodeSet.xml

  主要的配置节点如下

  细节比较多,但是通过源代码大家应该理解都没有问题,如果有不清楚的地方可以给我留言。后续会放出更多以前做过的工具。


 希望对大家有帮助。

 

转载地址:http://wuinl.baihongyu.com/

你可能感兴趣的文章
开源项目AndroidReview学习小结(2)
查看>>
[转]Forms验证中的roles
查看>>
插图式主页
查看>>
【原创】P2P-NEXT测试结论和遗留问题
查看>>
【HIBERNATE框架开发之七】HIBERNATE使用ANNOTATION中各种关系映射的CRUD(增删改查)&&集合映射&&继承映射...
查看>>
搭建jekyll博客
查看>>
扒一扒北邮的安全问题[4]-一大波访问控制问题
查看>>
(unix domain socket)使用udp发送>=128K的消息会报ENOBUFS的错误
查看>>
Uvaoj 11248 Frequency Hopping(Dinic求最小割)
查看>>
Mac系统Git生成ssh公钥
查看>>
提高数据库查询速度的几个思路
查看>>
数据存储之第三方FMDB
查看>>
如何使用RDS创建Hive元数据库
查看>>
QT中QToolBox的使用,实现抽屉效果
查看>>
MySQL创建索引
查看>>
[JAVA &#183; 初级]:12.内部类
查看>>
私有静态内部类实现线程安全的单例
查看>>
hdu 1106 排序
查看>>
Distributed Systems-Materials
查看>>
linux文件系统实现浅析
查看>>