关于自定义代码生成器

在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}
    }
}


总结:其实这个代码生产器的实现并不难,难点在于要找出所有业务模块类似的东西,然后用替换的方法去整体修改。


系统地讲解了如何构建一个日常生产环境实用的基于Spring Boot并且集成springmvc + shiro + mybatis-plus + beetl的后台管理系统,可管理代码生成模版,管理连接生成代码的数据库. Guns框架自带的功能:1.用户管理 2.角色管理 3.部门管理 4.菜单管理 5.字典管理 6.业务日志 7.登录日志 8.监控管理 9.通知管理 10.代码生成 Guns特点: 1. 基于SpringBoot,简化了大量项目配置和maven依赖,让您更专注于业务开发,独特的分包方式,代码多而不乱。 2. 完善的日志记录体系,可记录登录日志,业务操作日志(可记录操作前和操作后的数据),异常日志到数据库,通过@BussinessLog注解和LogObjectHolder.me().set()方法,业务操作日志可具体记录哪个用户,执行了哪些业务,修改了哪些数据,并且日志记录为异步执行,详情请见@BussinessLog注解和LogObjectHolder,LogManager,LogAop类。 3. 利用beetl模板引擎对前台页面进行封装和拆分,使臃肿的html代码变得简洁,更加易维护。 4. 对常用js插件进行二次封装,使js代码变得简洁,更加易维护,具体请见webapp/static/js/common文件夹内js代码。 5. 利用ehcache框架对经常调用的查询进行缓存,提升运行速度,具体请见ConstantFactory类中@Cacheable标记的方法。 6. controller层采用map + warpper方式的返回结果,返回给前端更为灵活的数据,具体参见com.stylefeng.guns.modular.system.warpper包中具体类。 7. 防止XSS攻击,通过XssFilter类对所有的输入的非法字符串进行过滤以及替换。 8. 简单可用的代码生成体系,通过SimpleTemplateEngine可生成带有主页跳转和增删改查的通用控制器、html页面以及相关的js,还可以生成Service和Dao,并且这些生成项都为可选的,通过ContextConfig下的一些列xxxSwitch开关,可灵活控制生成模板代码,让您把时间放在真正的业务上。 9. 控制器层统一的异常拦截机制,利用@ControllerAdvice统一对异常拦截,具体见com.stylefeng.guns.core.aop.GlobalExceptionHandler类。 10. 页面统一的js key-value单例模式写法,每个页面生成一个唯一的全局变量,提高js的利用效率,并且有效防止多个人员开发引起的函数名/类名冲突,并且可以更好地去维护代码
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值