用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:\hua\code\Hua\Dll\MySql.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:\hua\code\Hua\Dll\MySql.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:\hua\code\Hua\Dll\MySql.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:\hua\code\Hua\Dll\MySql.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);  
#>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM