• 用T4生成EF框架下的DAL、IDAL、BLL、IBLL


    (一)什么是T4模板?

    T4,即4个T开头的英文字母组合:Text Template Transformation Toolkit。

    T4文本模板,即一种自定义规则的代码生成器。根据业务模型可生成任何形式的文本文件或供程序调用的字符串。(模型以适合于应用程序域的形式包含信息,并且可以在应用程序的生存期更改) 

    (二)T4基本结构

    T4模板可以分为:指令块、文本块、控制块。

    指令块 - 向文本模板化引擎提供关于如何生成转换代码和输出文件的一般指令。
    文本块 - 直接复制到输出的内容。
    控制块 - 向文本插入可变值并控制文本的条件或重复部件的程序代码,不能在控制块中嵌套控制块。

    (三)设计时模板和运行时模板

    T4文本模板分为:设计时模板和运行时模板 

    (四)技巧

    快速编写模板:

    用T4生成EF框架下的DAL、IDAL、BLL、IBLL 四层为例:

    DAL:

    <#@ template debug="true" hostspecific="true" language="C#" #>
    <#@ template language="C#" debug="false" hostspecific="true"#>
    <#@ output extension=".cs" #>
    <#@ assembly name="System.Data" #>
    <#@ assembly name="D:huacodeHuaDllMySql.Data.dll"#>
     
    <#@ assembly name="System.Xml" #>
    <#@ import namespace="System" #>
    <#@ import namespace="System.Xml" #>
    <#@ import namespace="System.Data" #>
    <#@ import namespace="MySql.Data.MySqlClient" #>
    <#@ import namespace="System.Collections.Generic"#>
    <#@ Import Namespace="System.Text" #> 
    <#@ import namespace="System.IO" #> 
    <#@ Import Namespace="System.Reflection"#>
    <#@ include file="../Manager.ttinclude" #>
     
    <#
        var manager = Manager.Create(Host, GenerationEnvironment); 
        MySqlConnection con = new MySqlConnection("");
        DataTable dt;
        MySqlCommand cmd = con.CreateCommand();
        cmd.CommandText = "SELECT TABLE_NAME FROM USER_TABLES";
        cmd.CommandType = CommandType.Text;
    
        MySqlDataAdapter adapter = new MySqlDataAdapter(cmd);
        DataSet ds = new DataSet(); 
        adapter.Fill(ds);
        dt = ds.Tables[0];
        List<string> list = new List<string>();
        if (dt!=null&&dt.Rows.Count>0)
        {
            for (int i = 0; i < dt.Rows.Count; i++)
            {
                list.Add(dt.Rows[i]["TABLE_NAME"].ToString());
            } 
        }
        foreach (var item in list)
        {    
            string tableName=item;
    #>
    <#    
        manager.StartNewFile("D_"+tableName+".cs");
    #>
     
    using Model;
    using IDAL;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
     
    namespace DAL
    {
        public class D_<#=tableName#> : D_Base<<#=tableName#>>,ID_<#=tableName#>
        {
        }
    }
     
    <# 
            // 结束输出文件
            manager.EndBlock();
        } 
        // 执行编译
        manager.Process(true);  
    #> 

    IDAL

    <#@ template debug="true" hostspecific="true" language="C#" #>
    <#@ template language="C#" debug="false" hostspecific="true"#>
    <#@ output extension=".cs" #>
    <#@ assembly name="System.Data" #>
    <#@ assembly name="D:huacodeHuaDllMySql.Data.dll"#>
     
    <#@ assembly name="System.Xml" #>
    <#@ import namespace="System" #>
    <#@ import namespace="System.Xml" #>
    <#@ import namespace="System.Data" #>
    <#@ import namespace="MySql.Data.MySqlClient"  #>
    <#@ import namespace="System.Collections.Generic"#>
    <#@ Import Namespace="System.Text" #> 
    <#@ import namespace="System.IO" #> 
    <#@ Import Namespace="System.Reflection" #>
    <#@ include file="../Manager.ttinclude" #>
     
    <#
        var manager = Manager.Create(Host, GenerationEnvironment); 
        MySqlConnection con = new MySqlConnection("");
        DataTable dt;
        MySqlCommand cmd = con.CreateCommand();
        cmd.CommandText = "SELECT TABLE_NAME FROM USER_TABLES";
        cmd.CommandType = CommandType.Text;
    
        MySqlDataAdapter adapter = new MySqlDataAdapter(cmd);
        DataSet ds = new DataSet(); 
        adapter.Fill(ds);
        dt = ds.Tables[0];
        List<string> list = new List<string>();
        if (dt!=null&&dt.Rows.Count>0)
        {
            for (int i = 0; i < dt.Rows.Count; i++)
            {
                list.Add(dt.Rows[i]["TABLE_NAME"].ToString());
            } 
        }
        foreach (var item in list)
        {
            string tableName=item;
    #>
    <#    
        manager.StartNewFile("ID_"+tableName+".cs");
    #>
     
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
     
    namespace IDAL
    {
        public interface ID_<#=tableName#> : ID_Base<Model.<#=tableName#>>  
        {
        }
    }
     
    <# 
            // 结束输出文件
            manager.EndBlock();
        } 
        // 执行编译
        manager.Process(true);  
    #>

    BLL

    <#@ template debug="true" hostspecific="true" language="C#" #>
    <#@ template language="C#" debug="false" hostspecific="true"#>
    <#@ output extension=".cs" #>
    <#@ assembly name="System.Data" #>
    <#@ assembly name="D:huacodeHuaDllMySql.Data.dll"#>
     
    <#@ assembly name="System.Xml" #>
    <#@ import namespace="System" #>
    <#@ import namespace="System.Xml" #>
    <#@ import namespace="System.Data" #>
    <#@ import namespace="MySql.Data.MySqlClient" #>
    <#@ import namespace="System.Collections.Generic"#>
    <#@ Import Namespace="System.Text" #> 
    <#@ import namespace="System.IO" #> 
    <#@ Import Namespace="System.Reflection"#>
    <#@ include file="../Manager.ttinclude" #>
     
    <#
     
        var manager = Manager.Create(Host, GenerationEnvironment); 
        MySqlConnection con = new MySqlConnection("");
        DataTable dt;
        MySqlCommand cmd = con.CreateCommand();
        cmd.CommandText = "SELECT TABLE_NAME FROM USER_TABLES";
        cmd.CommandType = CommandType.Text;
    
        MySqlDataAdapter adapter = new MySqlDataAdapter(cmd);
        DataSet ds = new DataSet(); 
        adapter.Fill(ds);
        dt = ds.Tables[0];
        List<string> list = new List<string>();
        if (dt!=null&&dt.Rows.Count>0)
        {
            for (int i = 0; i < dt.Rows.Count; i++)
            {
                list.Add(dt.Rows[i]["TABLE_NAME"].ToString());
            } 
        }
        foreach (var item in list)
        {
            string tableName=item;
    #>
    <#    
        manager.StartNewFile("B_"+tableName+".cs");
    #>
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using Model;
    using IDAL;
    using IBLL;
    namespace BLL
    {
     
        public class B_<#=tableName#> : B_Base<<#=tableName#>>, IB_<#=tableName#>
        {
            private ID_<#=tableName#> nowDAL = DALContainer.UnityIOC.Resolve<ID_<#=tableName#>>();
            public override void SetDal()
            {
                Dal = nowDAL;
            }
        }
    }
     
    <# 
            // 结束输出文件
            manager.EndBlock();
        } 
        // 执行编译
        manager.Process(true);  
    #> 

    IBLL

    <#@ template debug="true" hostspecific="true" language="C#" #>
    <#@ template language="C#" debug="false" hostspecific="true"#>
    <#@ output extension=".cs" #>
    <#@ assembly name="System.Data" #>
    <#@ assembly name="D:huacodeHuaDllMySql.Data.dll" #>
     
    <#@ assembly name="System.Xml" #>
    <#@ import namespace="System" #>
    <#@ import namespace="System.Xml" #>
    <#@ import namespace="System.Data" #>
    <#@ import namespace="MySql.Data.MySqlClient"  #>
    <#@ import namespace="System.Collections.Generic"#>
    <#@ Import Namespace="System.Text" #> 
    <#@ import namespace="System.IO" #> 
    <#@ Import Namespace="System.Reflection" #>
    <#@ include file="../Manager.ttinclude" #>
     
    <#
        var manager = Manager.Create(Host, GenerationEnvironment); 
        MySqlConnection con = new MySqlConnection("");
        DataTable dt;
        MySqlCommand cmd = con.CreateCommand();
        cmd.CommandText = "SELECT TABLE_NAME FROM USER_TABLES";
        cmd.CommandType = CommandType.Text;
    
        MySqlDataAdapter adapter = new MySqlDataAdapter(cmd);
        DataSet ds = new DataSet(); 
        adapter.Fill(ds);
        dt = ds.Tables[0];
        List<string> list = new List<string>();
        if (dt!=null&&dt.Rows.Count>0)
        {
            for (int i = 0; i < dt.Rows.Count; i++)
            {
                list.Add(dt.Rows[i]["TABLE_NAME"].ToString());
            } 
        }
        foreach (var item in list)
        {
            string tableName=item;
    #>
    <#    
        manager.StartNewFile("IB_"+tableName+".cs");
    #>
    using Model;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
     
    namespace IBLL
    {
        public interface IB_<#=tableName#> : IB_Base<<#=tableName#>>
        {
        }
       
    }
    <# 
            // 结束输出文件
            manager.EndBlock();
        } 
        // 执行编译
        manager.Process(true);  
    #>
  • 相关阅读:
    服务器的计时器的Interval最大能设置为多大?
    IE页面嵌入复杂WinForm控件不能正常激活
    自动升级组件居然把我那提供升级的站点目录整个删除了!
    自动升级失败,缺少System.resources.dll?
    字频分析结果出来了
    原来是2003 Server的问题
    一直这么渴望执着不一定能成功,只是活着就是执着
    模拟生态系统自己编写"生命"
    微软的Soap样例是错误的!
    对哈希表进行排序
  • 原文地址:https://www.cnblogs.com/zhaoshujie/p/12052409.html
Copyright © 2020-2023  润新知