- 浏览: 28866 次
- 性别:
- 来自: 武汉
文章分类
最新评论
关于自定义代码生成器
在2010年以前一直都喜欢用动软的代码生成器来生成三层结构,借此缩短开发时间,但是在做完ERP项目之后发现,有时代码本身就存在着相同或者类似的地方,只要我们用心去找还是可以找到很多的,在遇到这个问题的时候要么抽象成泛型接口,要么就用制定为项目而生的代码生成器来用,具体就是看项目本身和业务本身的需求了。最近也是在从事一款HR产品的编程,在整个产品的过程中因为周期短,项目量重,所以我把整个项目的服务层和业务层都使用代码生成器,生成特定的增删改查,不过遗憾的是这些只能满足单表操作。下面就是我的一段代码:
1. 业务实现类
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Transactions; using SD.LLBLGen.Pro.ORMSupportClasses; using Company.{0}.BusinessLogic.CommonTools.Utils; using Company.{0}.BusinessLogic.CommonTools.QueryBuilder; using Company.{0}.BusinessLogic.I{1}; using Company.{0}.BusinessEntity.{1}; using Company.DataAccess.{0}.I{1}Save; using Company.DataAccess.{0}.I{1}Linq; using Company.DataAccess.{0}.I{1}Read; using Company.DataModel.{0}.{1}.EntityClasses; using Company.DataModel.{0}.{1}.FactoryClasses; using Company.DataModel.{0}.{1}.HelperClasses; using Company.DataModel.{0}.{1}.DBAdapter; using Company.DataModel.{0}.{1}.Linq; using Company.Framework.Factory; using Company.Framework.ILinq; namespace Company.{0}.BusinessLogic.{1} { public class {Y} : I{Y} { #region 自生成代码 public virtual bool Add({Y}Model model) { bool result = false; I{X1}_{Y}Save {X2}{Y}Save = ObjectFactory.CreateObject<I{X1}_{Y}Save>(); {X1}{Y}Entity {X2}{Y}Entity = new {X1}{Y}Entity(); EntityUtil.CloneData<{Y}Model, {X1}{Y}Entity>(model, {X2}{Y}Entity); if ({X2}{Y}Save.Save({X2}{Y}Entity, true)) { result = true; } return result; } public virtual bool Add(List<{Y}Model> listModels) { bool result = true; using (TransactionScope scope = new TransactionScope()) { I{X1}_{Y}Save {X2}{Y}Save = ObjectFactory.CreateObject<I{X1}_{Y}Save>(); {X1}{Y}Entity {X2}{Y}Entity = new {X1}{Y}Entity(); foreach ({Y}Model model in listModels) { EntityUtil.CloneData<{X1}{Y}Entity, {Y}Model>({X2}{Y}Entity, model); if (!{X2}{Y}Save.Save({X2}{Y}Entity, true)) { result = false; break; } } if (result) { scope.Complete(); } } return result; } public virtual {Y}Model Read(int {Z}) { I{X1}_{Y}Read {X2}{Y}Read = ObjectFactory.CreateObject<I{X1}_{Y}Read>(); {X1}{Y}Entity {X2}{Y}Entity = new {X1}{Y}Entity({Z}); {X2}{Y}Read.Read({X2}{Y}Entity); {Y}Model {X2}{Y}Model = new {Y}Model(); EntityUtil.CloneData<{X1}{Y}Entity, {Y}Model>({X2}{Y}Entity, {X2}{Y}Model); return {X2}{Y}Model; } public virtual List<{Y}Model> ReadList(List<int> list{Z}) { I{X1}_{Y}Read {X2}{Y}Read = ObjectFactory.CreateObject<I{X1}_{Y}Read>(); List<{Y}Model> {X2}{Y}ModelList = new List<{Y}Model>(); foreach (int {Z} in list{Z}) { {X1}{Y}Entity {X2}{Y}Entity = new {X1}{Y}Entity({Z}); {X2}{Y}Read.Read({X2}{Y}Entity); {Y}Model {X2}{Y}Model = new {Y}Model(); EntityUtil.CloneData<{X1}{Y}Entity, {Y}Model>({X2}{Y}Entity, {X2}{Y}Model); {X2}{Y}ModelList.Add({X2}{Y}Model); } return {X2}{Y}ModelList; } public virtual List<{Y}Model> ReadList({Y}Model model) { List<{Y}Model> {X2}{Y}ModelList = new List<{Y}Model>(); DataAccessAdapter adpter = new DataAccessAdapter(); LinqMetaData context = new LinqMetaData(adpter); //var sql = QueryBuilder.Create<{X1}{Y}Entity>() /*var sql = QueryBuilder.Create<{X1}{Y}Entity>() .Like(c => c.{T}, model.{T});//构造搜索条件 List<{X1}{Y}Entity> {X2}{Y}EntityList = context.{X1}{Y}.Where(sql.Expression) .OrderBy(c => c.{Z}).ToList<{X1}{Y}Entity>(); //执行查询 EntityUtil.CloneData<{X1}{Y}Entity, {Y}Model>({X2}{Y}EntityList, {X2}{Y}ModelList);//将结果集 转成 业务层实体列表 */ return {X2}{Y}ModelList; } public virtual bool Save({Y}Model model) { bool result = false; {X1}{Y}Entity {X2}{Y}Entity = new {X1}{Y}Entity(); DataAccessAdapter adapter = new DataAccessAdapter(); {X2}{Y}Entity.{Z} = model.{Z}; adapter.FetchEntity({X2}{Y}Entity); EntityUtil.CloneData<{Y}Model, {X1}{Y}Entity>(model, {X2}{Y}Entity); if (adapter.SaveEntity({X2}{Y}Entity, true)) { result = true; } return result; } public virtual bool SaveList(List<{Y}Model> listModel) { bool result = true; using (TransactionScope scope = new TransactionScope()) { {X1}{Y}Entity {X2}{Y}Entity = new {X1}{Y}Entity(); DataAccessAdapter adapter = new DataAccessAdapter(); foreach ({Y}Model model in listModel) { {X2}{Y}Entity.{Z} = model.{Z}; adapter.FetchEntity({X2}{Y}Entity); EntityUtil.CloneData<{X1}{Y}Entity, {Y}Model>({X2}{Y}Entity, model); if (!adapter.SaveEntity({X2}{Y}Entity, true)) { result = false; break; } } if (result) { scope.Complete(); } } return result; } public virtual bool Delete(int {Z}) { bool result = false; {X1}{Y}Entity {X2}{Y}Entity = new {X1}{Y}Entity(); DataAccessAdapter adapter = new DataAccessAdapter(); {X2}{Y}Entity.{Z} = {Z}; adapter.FetchEntity({X2}{Y}Entity); {X2}{Y}Entity.RecordStatus = -1; if (adapter.SaveEntity({X2}{Y}Entity, true)) { result = true; } return result; } public virtual bool Delete({Y}Model model) { bool result = false; {X1}{Y}Entity {X2}{Y}Entity = new {X1}{Y}Entity(); DataAccessAdapter adapter = new DataAccessAdapter(); {X2}{Y}Entity.{Z} = model.{Z}; model.RecordStatus = -1; adapter.FetchEntity({X2}{Y}Entity); EntityUtil.CloneData<{X1}{Y}Entity, {Y}Model>({X2}{Y}Entity, model); if (adapter.SaveEntity({X2}{Y}Entity, true)) { result = true; } return result; } public virtual bool DeleteList(string list{Z}s) { bool result = true; using (TransactionScope scope = new TransactionScope()) { I{X1}_{Y}Save {X2}{Y}Save = ObjectFactory.CreateObject<I{X1}_{Y}Save>(); string[] PA = list{Z}s.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries); DataAccessAdapter adapter = new DataAccessAdapter(); foreach (string {Z} in PA) { {X1}{Y}Entity {X2}{Y}Entity = new {X1}{Y}Entity(); {X2}{Y}Entity.{Z} = int.Parse( {Z}); adapter.FetchEntity({X2}{Y}Entity); {X2}{Y}Entity.RecordStatus = -1; if (!adapter.SaveEntity({X2}{Y}Entity, true)) { result = false; break; } } if (result) { scope.Complete(); } } return result; } public virtual bool DeleteList(List<int> list{Z}s) { bool result = true; using (TransactionScope scope = new TransactionScope()) { I{X1}_{Y}Save {X2}{Y}Save = ObjectFactory.CreateObject<I{X1}_{Y}Save>(); DataAccessAdapter adapter = new DataAccessAdapter(); foreach (int {Z} in list{Z}s) { {X1}{Y}Entity {X2}{Y}Entity = new {X1}{Y}Entity(); {X2}{Y}Entity.{Z} = {Z}; adapter.FetchEntity({X2}{Y}Entity); {X2}{Y}Entity.RecordStatus = -1; if (!adapter.SaveEntity({X2}{Y}Entity, true)) { result = false; break; } } if (result) { scope.Complete(); } } return result; } public virtual bool DeleteList(List<{Y}Model> listModels) { bool result = true; using (TransactionScope scope = new TransactionScope()) { I{X1}_{Y}Save {X2}{Y}Save = ObjectFactory.CreateObject<I{X1}_{Y}Save>(); {X1}{Y}Entity {X2}{Y}Entity = new {X1}{Y}Entity(); DataAccessAdapter adapter = new DataAccessAdapter(); foreach ({Y}Model model in listModels) { {X2}{Y}Entity.{Z} = model.{Z}; adapter.FetchEntity({X2}{Y}Entity); {X2}{Y}Entity.RecordStatus = -1; if (!adapter.SaveEntity({X2}{Y}Entity, true)) { result = false; break; } } if (result) { scope.Complete(); } } return result; } #endregion } }2.实体类
using System; using System.Collections.Generic; using System.Linq; using System.Text; {5} namespace Company.{0}.{1}.{2} { {6} public class {3}{4} { {X} } }
总结:其实这个代码生产器的实现并不难,难点在于要找出所有业务模块类似的东西,然后用替换的方法去整体修改。
相关推荐
Qt自定义界面生成器,里面内置了7种默认界面,可以直接使用。也可以在默认界面的基础上进行修改。该软件会自动生成QSS代码,直接放入Qt即可。使用非常简单。
mybatis-puls自定义代码生成器,自动生成Api、service、dao、mapper
MyBatisPlus自带了一个代码生成器mybatis-plus-generator,可基于数据库库表,结合模板技术,自动生成程序源码,不过默认情况下,只支持Entity、Mapper、Service、Controller这些层次。如果想生成未预置的代码,如vo...
mybatis-plus3.5.1,代码生成器集成(自定义模板)
自定义大小LED点阵代码生成器,你可以生成任意大小的字模十六进制数据如:8*8 16*16 32 * 32
MyBatisPlus代码生成器自定义模板时的模板文件
一款低代码生成器,可根据自定义模板内容,快速生成代码,实现项目的快速开发、上线,减少重复的代码编写,开发人员只需专注业务逻辑即可
基于.net framework 2.0 的代码生成器,功能强大,操作灵活,可以生成任何一种代码文件。提供了数据源、模板、另存为、工具、数据扩展5种插件接口。 1、自定义模板。目前只有一个基础模板,是基于XML配置、字符...
一套基于模版的代码生成器, 可以通过模版文件, 生成任意代码
新手1分钟,新旺铺自定义CSS: 1.支持,自定义背景色,字体色,翻转色,激活色 2.支持背景图片自定义,支持字体自定义
淘宝全屏轮播-特效代码生成器专业免费版,可以生成淘宝轮播图等多种特效!
CocosCreator编辑器扩展-代码生成器,可以脚本里边的内容,可以下载下来学习和使用。 使用方法和介绍: https://blog.csdn.net/weixin_38531633/article/details/109769869
CodeSmith好用的代码生成器 代码生成器 自定义
找了很久的东西,mybatis+freemake自定义生成代码器,原来的代码生成器只能生成mapper,service,model感觉没多大用,自定义模板真的节约的好多时间
动软代码生成器是一款为程序员精心设计的代码自动生成器。该软件综合了开发中的经典思想和设计模式,支持生成不同架构的项目和代码,完全省去了大量的机械录入的时间和重复动作,让你更加有时间集中在业务逻辑的开发...
支持java类的自动生成,一键生成所有代码,方便修改,维护
系统地讲解了如何构建一个日常生产环境实用的基于Spring Boot并且集成springmvc + shiro + mybatis-plus + beetl的后台管理系统,可管理代码生成模版,管理连接生成代码的数据库. Guns框架自带的功能:1.用户管理 2....
Mybatisplus 代码生成器提供 Windows Desktop 和 IDEA Plugin 两个版本。 我的IDEA是2019.2版本的,没有问题,如果你是其他版本,不知道有没有问题,有问题可以给我反馈。 Windows & Mac Desktop 桌面版下载地址:...
用户自定义代码生成(可选择层,可选择生成的DAL函数) 用户批量生成代码文件(解决方案文件,项目文件,各个层的代码文件) 通过sql语句,生成视图字段实体。 可定义函数模板和类模板,使代码生成更加...
非常好用得多c#代码生成器,支持模板,可高度自定义代码内容