首页 > 学院 > 开发设计 > 正文

重写代码生成器支持模板(多层架构,MVC),多语言c#,java;支持mysql和sqlserver,动态编译

2019-11-17 02:13:38
字体:
来源:转载
供稿:网友

重写代码生成器支持模板(多层架构,MVC),多语言c#,java;支持MySQL和sqlserver,动态编译

多年前用过李天平前辈的,自己改过,后来李老师做动软了,不给源码,修改不是很方便。加上我目前需要转java方向,于是决定自己搞。到目前为止花了整整一个星期了,看看目前的成果。

QQ图片20150729212121

QQ截图20150729212205

QQ截图20150729213325

QQ截图20150729213412

QQ截图20150729213436

QQ截图20150729213529

最后是代码工程文件,用c#开发的,IDE是vs2010

QQ截图20150729214011

为了实现最大的模板自由,设计了专有的模板语法。基于C#,但是已经做到尽量简化,对有一点开发经验的同行应该是很好上手的。

目前c#的代码模板已经做了一些通用样例,接下来做java的开发代码模板。

总之,为了提高效率,并且规范项目团队成员的代码书写。

下面把核心的代码两个类文件贴出来,分别是动态编译和模板解析

  1 using System;  2 using System.Collections.Generic;  3 using System.Linq;  4 using System.Text;  5 using System.CodeDom.Compiler;  6 using System.Reflection;  7   8 namespace CodeMaker.Engine  9 { 10     public class Compiler 11     { 12         /// <summary> 13         /// 普通代码编译执行出字符串 14         /// </summary> 15         /// <param name="strCode"></param> 16         /// <returns></returns> 17         public static string DoCompile(string strCode) 18         { 19              20             StringBuilder strResults = new StringBuilder(); 21  22             CodeDomPRovider provider = CodeDomProvider.CreateProvider("CSharp"); 23  24             //CompilerParameters 编译参数 25             CompilerParameters objCompilerParameters = new CompilerParameters(); 26             objCompilerParameters.ReferencedAssemblies.Add("System.dll"); 27             objCompilerParameters.ReferencedAssemblies.Add("System.Core.dll"); 28             objCompilerParameters.ReferencedAssemblies.Add("System.Data.dll"); 29             objCompilerParameters.ReferencedAssemblies.Add("CodeMaker.BLL.dll"); 30             objCompilerParameters.ReferencedAssemblies.Add("CodeMaker.DALFactory.dll"); 31             objCompilerParameters.ReferencedAssemblies.Add("CodeMaker.IDAL.dll"); 32             objCompilerParameters.ReferencedAssemblies.Add("CodeMaker.Model.dll"); 33             objCompilerParameters.ReferencedAssemblies.Add("CodeMaker.MySqlDAL.dll"); 34             objCompilerParameters.ReferencedAssemblies.Add("CodeMaker.SqlDAL.dll"); 35             objCompilerParameters.ReferencedAssemblies.Add("CodeMaker.Engine.dll"); 36             objCompilerParameters.GenerateExecutable = false; 37             objCompilerParameters.GenerateInMemory = true; 38              39             // CompilerResults 40             CompilerResults cr = provider.CompileAssemblyFromSource(objCompilerParameters, strCode); 41  42             if (cr.Errors.HasErrors) 43             { 44                 Console.WriteLine("编译错误:"); 45                 foreach (CompilerError err in cr.Errors) 46                 { 47                     strResults.Append(err.ErrorText); 48                     strResults.Append(Environment.NewLine); 49                     strResults.Append(err.Line); 50                     strResults.Append(Environment.NewLine); 51                     strResults.Append(err.ToString()); 52                     strResults.Append(Environment.NewLine); 53                  54                 } 55             } 56             else 57             { 58                 // 通过反射,调用OutPut的输出方法 59                 Assembly objAssembly = cr.CompiledAssembly; 60                 object objHelloWorld = objAssembly.CreateInstance("DynamicCodeGenerate.CodeGenerate"); 61                 MethodInfo objMI = objHelloWorld.GetType().GetMethod("OutPut"); 62  63                 strResults.Append(objMI.Invoke(objHelloWorld, null)); 64                 strResults.Append(Environment.NewLine); 65                66             } 67              68              69             return strResults.ToString(); 70         } 71  72         public static string DoCodeMakerCompile(string strDBType,string DALAssemblyPath, string strDataBase,string strTableName, string strEntityName,string strCode) 73         { 74              75              76             StringBuilder sb = new StringBuilder(); 77             //加上要编译部分代码的头部和尾部 78             //头部 79             sb.Append("using System;"); 80             sb.Append("using System.Data;"); 81             sb.Append("using System.Text;"); 82             sb.Append("using System.Linq;"); 83             sb.Append("using System.Globalization;"); 84             sb.Append("using System.Collections.Generic;"); 85             sb.Append("using CodeMaker.Model;"); 86             sb.Append("using CodeMaker.BLL;"); 87             sb.Append("using CodeMaker.Engine;"); 88             sb.Append("namespace DynamicCodeGenerate"); 89             sb.Append("{"); 90  91              92  93             sb.Append("   public class CodeGenerate"); 94             sb.Append("   {"); 95             sb.Append("        public string OutPut()"); 96             sb.Append("        {"); 97  98             //读取数据实体的属性的代码段 99             sb.Append(GetEntity(strDBType, DALAssemblyPath, strDataBase, strTableName, strEntityName));100 101             sb.Append(strCode);102 103             //返回值,字符串104             sb.Append("         return s.ToString(); ");105             sb.Append("        }");106             //fOutPut方法结束107             //首字母大写方法108             sb.Append("        public string ToTitleCase(string str)");109             sb.Append("        {");110             sb.Append("          return str.Substring(0,1).ToUpper()+str.Substring(1);");111             sb.Append("        }");112             //首字母小写方法113             sb.Append("        public string ToLowerCase(string str)");114             sb.Append("        {");115             sb.Append("          return str.Substring(0,1).ToLower()+str.Substring(1);");116             sb.Append("        }");117             118             sb.Append("   }");119             sb.Append("}");120 121             return DoCompile(sb.ToString());122         }123 124         private static string GetEntity(string strDBType, string DALAssemblyPath, string strDataBase, string strTableName, string strEntityName)125         {126             StringBuilder sb = new StringBuilder();127             sb.Append("CodeMaker.BLL.EntityBLL bll = new CodeMaker.BLL.EntityBLL(/"" + DALAssemblyPath + "/");");128             sb.Append("IList<CodeMaker.Model.Entity> es = bll.GetEntityList(/"" + strDataBase + "/", /"" + strTableName + "/");");129             sb.Append("string EntityName=/"" + strEntityName + "/";");//实体名,供模板中的代码段使用130             sb.Append("
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表