CodeSmith批量代码生成并存放到指定目录

其实CodeSmith自带的例子是很好的学习材料,其中一个例子就有批量生成所有表(指定表)并存放到指定目录的,但例子还是归例子,要符合实际需要的使用,还是得改一下的。下面发布下本人修改后的批量生成多种模板多个表的代码文件,并存放到指定目录下:

<%@ CodeTemplate Language="C#" TargetLanguage="C#" Src="" Inherits="" Debug="True" CompilerVersion="v3.5" ResponseEncoding="UTF-8" Description="输出所有模块文件" %>
<%-- Context --%>
<%-- Object --%>
<%@ Property Name="NameSpace" Type="System.String" Default="NameSpace" Category="Object" Description="项目的命名空间" %>
<%@ Property Name="Assembly" Type="System.String" Default="Assembly" Category="Object" Description="项目的程序集" %>
<%@ Property Name="TableDivideMark" Type="System.String" Default="_" Category="Object" Description="表名分隔符" %>
<%@ Property Name="TablePrefix" Type="System.Boolean" Default="true" Category="Object" Description="是否有表前缀,如果存在表前缀的,会自动把第一个表名分隔符前的表前缀删除掉。" %>
<%@ Property Name="TablePrefixLength" Type="System.Int32" Default="4" Category="Object" Description="表前缀长度,如果表前缀大于这个值,则认为没有表前缀" %>
<%@ Property Name="ColumnDivideMark" Type="System.String" Default="_" Category="Object" Description="字段名分隔符" %>
<%@ Property Name="ColumnPrefix" Type="System.Boolean" Default="false" Category="Object" Description="是否有字段前缀,如果存在字段前缀的,会自动把第一个字段名分隔符前的字段前缀删除掉。" %>
<%@ Property Name="ColumnPrefixLength" Type="System.Int32" Default="0" Category="Object" Description="字段前缀长度,如果字段前缀大于这个值,则认为没有字段前缀" %>
<%@ Property Name="ForceId" Type="System.Boolean" Default="true" Category="Object" Description="强制性自增量标识主键" %>
<%@ Property Name="ForceIdProperty" Type="System.String" Default="ID" Category="Object" Description="强制性自增量标识主键的属性名称" %>
<%@ Property Name="SourceTableNames" Type="System.String" Default="" Category="Object" Description="当指定表名时,只执行字符串中表名列表中的表" %>
<%-- Context --%>
<%@ Assembly Name="System.Design" %>
<%@ Assembly Name="SchemaExplorer" %>
<%@ Import Namespace="SchemaExplorer" %>
<%@ Import Namespace="System.IO" %>
<%@ Import Namespace="System.Xml" %>
<%@ Import Namespace="System.Text" %>
<%@ Import Namespace="System.Windows.Forms.Design" %>
<%@ Import Namespace="System.Text.RegularExpressions" %>
<%@ Import Namespace="System.Collections.Specialized" %>

<script runat="template">


    private DatabaseSchema _sourceDatabase;
    private string _outputDirectory;
    private bool _implementNotification = true;
    
    //模板对象列表(根据模板名称产生出来的模板对象)
    public CodeTemplate[] CurrentTemplates;
    //模板名称数组
    public string[] TemplateNames = {"piggy_projectFileInclue.cst","piggy_SqlMap.config.cst","piggy_dao.config.cst","piggy_service.config.cst","piggy_Model_Auto.cst","iBatis_sqlmap_Auto.cst","piggy_Service.cst","piggy_Model.cst","piggy_DAL.cst","piggy_BLL.cst","iBatis_sqlmap.cst"}; 
    //模板输出格式数组
    public string[] strFormats = {"projectFileInclue.txt","sqlmap.config","Dao_Auto.config","Service_Auto.config","{0}_Auto.cs","{0}_Auto.xml","I{0}BLL.cs","{0}.cs","{0}DAO.cs","{0}BLL.cs","{0}.xml"};
    //模板输出路径
    public string[] OutputPaths={"","\\Data","\\Data\\config","\\Data\\config","\\Data_Auto\\Model","\\Data_Auto\\Map","\\Data\\service","\\Data\\Model","\\Data\\DAL","\\Data\\BLL","\\Data\\Map"};
    [Category("Database")]
    [Description("Database that the mapping file should be based on.")]
    public DatabaseSchema SourceDatabase {
        get { return _sourceDatabase; }
        set { _sourceDatabase = value; }
    }

    [Editor(typeof(System.Windows.Forms.Design.FolderNameEditor), typeof(System.Drawing.Design.UITypeEditor))]
    [Category("Class")]
    [Description("The folder to save the generated class files.")]
    public string OutputDirectory
    {
        get {return _outputDirectory;}
        set {_outputDirectory= value;}
    }

    //根据模板名称产生出来的模板对象列表
    public void CreateTemplate()
    {
        if (CurrentTemplates==null)
        {
            CurrentTemplates=new CodeTemplate[TemplateNames.Length];
            for (int i = 0; i < TemplateNames.Length; i++)
            {
                CurrentTemplates[i]=CompileTemplate(CodeTemplateInfo.DirectoryName + TemplateNames[i]);
            }
        }
    }
    //单独生成一个模板对象
    public CodeTemplate CompileTemplate(string templateName)
    {
        CodeTemplateCompiler compiler = new CodeTemplateCompiler(templateName);
        compiler.Compile();

        if (compiler.Errors.Count == 0)
        {
            return compiler.CreateInstance();
        }
        else
        {
            for (int i = 0; i < compiler.Errors.Count; i++)
            {
                Response.WriteLine(compiler.Errors[i].ToString());
            }
            return null;
        }

    }

    //执行输出脚本
    public void Generate()
    {
        if (CurrentTemplates==null)
            CreateTemplate();
        StringCollection ExcludedTables=new StringCollection();
        if (SourceTableNames.Length>0)
        {
            int mIndex=-1;
            mIndex=SourceTableNames.IndexOf(',');
            while (mIndex>0) {
                ExcludedTables.Add(SourceTableNames.Substring(0,mIndex));
                SourceTableNames=SourceTableNames.Remove(0,mIndex+1);
                mIndex=SourceTableNames.IndexOf(',');
            }
            ExcludedTables.Add(SourceTableNames);
        }    
        foreach(TableSchema SourceTable in SourceDatabase.Tables)
        {
            if (SourceTableNames.Length>0)
            {
                if (!ExcludedTables.Contains(SourceTable.Name))
                    continue;
            }
            Response.Write(string.Format("Processing Table {0} ... ", SourceTable.Name));
            Response.WriteLine();
            try
            {
            string className = ClearDivideMarkAndPrefix(SourceTable.Name,TableDivideMark,TablePrefix,TablePrefixLength);
            for (int i = 0; i < TemplateNames.Length; i++)
                {
                string FileName;
                if (i<=3)
                {
                    CurrentTemplates[i].SetProperty("SourceDatabase", SourceDatabase);
                    FileName=strFormats[i];
                }
                else {
                    CurrentTemplates[i].SetProperty("SourceTable", SourceTable);
                    FileName=string.Format(strFormats[i],className);
                }
                FileName=Path.Combine(OutputDirectory+OutputPaths[i], FileName);
                //统一属性赋值
                CurrentTemplates[i].SetProperty("NameSpace",NameSpace);
                CurrentTemplates[i].SetProperty("Assembly",Assembly);
                CurrentTemplates[i].SetProperty("TableDivideMark",TableDivideMark);
                CurrentTemplates[i].SetProperty("TablePrefix",TablePrefix);
                CurrentTemplates[i].SetProperty("TablePrefixLength",TablePrefixLength);
                CurrentTemplates[i].SetProperty("ColumnDivideMark",ColumnDivideMark);
                CurrentTemplates[i].SetProperty("ColumnPrefix",ColumnPrefix);
                CurrentTemplates[i].SetProperty("ColumnPrefixLength",ColumnPrefixLength);
                CurrentTemplates[i].SetProperty("ForceId",ForceId);
                CurrentTemplates[i].SetProperty("ForceIdProperty",ForceIdProperty);
                
                Response.WriteLine(string.Format("{0} In {1} ", TemplateNames[i],FileName));
                CurrentTemplates[i].RenderToFile(FileName, true);
                }
            }
            catch (Exception ex)
            {
                Response.WriteLine("Error: " + ex);
            }
        }
    }
</script>

<% this.Generate();  %>
<!-- #include file="Function.inc" -->
下面是Function.inc文件的部分代码。截取出来的,如果有遗留了哪些代码,请指正:

<script runat="template">
private Regex cleanRegEx = new Regex(@"\s+|_|-|\.", RegexOptions.Compiled);
private Regex cleanID = new Regex(@"(_ID|_id|_Id|\.ID|\.id|\.Id|ID|Id)", RegexOptions.Compiled);

//清除字符串中的分隔符以及第一个分隔符前的字符串长度小于等于prefixLength的前缀
public string ClearDivideMarkAndPrefix(string name,string mark,bool prefix,int prefixLength)
{
    string strResult=name;
    //处理表前缀
    if (prefix)
    {
        int mIndex=name.IndexOf(mark);
        if (mIndex<=prefixLength)
            strResult=name.Remove(0,mIndex+mark.Length);
    }
    if (mark.Length>0)
        strResult=GetFirstUpStr(strResult,mark);
    return strResult;
}
//受字母大写且mark分隔符后第一个字母大写
    public string GetFirstUpStr(string strValue,string mark)
    {
        string m_Str=strValue.ToLower();
        System.Text.StringBuilder mResult=new System.Text.StringBuilder("");
        int mLen=m_Str.Length;
        int j=-1;
        j=m_Str.IndexOf(mark);
        while (j>0)
        {
            mResult.Append(m_Str.Substring(0,1).ToUpper());
            mResult.Append(m_Str.Substring(1,j-1));
            m_Str=m_Str.Remove(0,j+mark.Length);
            j=m_Str.IndexOf(mark);
        }
        if (m_Str.Length>0)
        {
            mResult.Append(m_Str.Substring(0,1).ToUpper());
            mResult.Append(m_Str.Substring(1,m_Str.Length-1));
            }
        return mResult.ToString();
    }
</script>
其实,这个批量输出的可以重复使用的,只需要把模板拷贝到对应的模板目录中后,修改变量TemplateNames、strFormats、OutputPaths为自己实际需要的参数就能应用到不同的模板库中了,十分方便,如果看官们的模板参数不一样,那就得修改“//统一属性赋值”下的SetProperty相关的属性就可以了。

原创作品出自努力偷懒,转载请说明文章出处http://blog.csdn.net/kfarvid或 http://www.cnblogs.com/kfarvid/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值