【Reship】use of tangible T4 template engine

1.first of all

以前在 「使用T4模板生成代碼 – 初探」 文章簡單的使用了T4模板的生成功能,但對於一個模板生成多個實例文件,如何實現這個方式呢?無心發現一個解決方案 「MultipleOutputHelper.ttinclude」 ,它讓基於T4模板批量生成文件實例變得簡單起來了。git

 什麼是MultipleOutputHelper.ttinclude

Damien Guard是一個在加利福尼亞州聖何塞的開發人員,他構建出處理使用T4模板輸出多文件的解決方案「MultipleOutputHelper.ttinclude」github

2.使用

1. 初始化app

獲取MultipleOutputHelper.ttinclude文件模板ide

注意: 文件能夠上github.com 託管上面獲取( https://github.com/damieng/DamienGKit/tree/master/T4/MultipleOutputHelperspa

在T4模板中使用include指令導入MultipleOutputHelper.ttinclude文件或者將MultipleOutputHelper.ttinclude的代碼複製在T4模板內。hibernate

而後初始化Manager對象,代碼以下:debug

 注意: 這裏的Manager.ttinclude 就是MultipleOutputHelper.ttinclude文件模板code

 

2. 文件塊對象

使用代碼標識區分生成的代碼塊的範圍blog

該代碼聲明瞭一個Employee.generated.cs文件,文件代碼內容爲:

1
public  class  Employee { ... }

 

3. 頁眉和頁腳

不少模板須要共享一個共同的頁眉和頁腳時,能夠使用import語句進行打開和關閉。簡單的使用StartHeader和StartFooter的代碼方法進行分割。

4. 編譯執行

使用Process方法,進行文件分割。

3.場景應用

基於以前的「使用T4模板生成代碼 – 初探」 文章的場景,進行基於NHibernate Mapper 來獲取Domain對象,而後進行批量生成多個代碼文件。

1. 自定義T4模板,文件名爲「EntityRepositoryTemplate.tt」,代碼以下:

<#@ template  language="C#"    debug="true" hostspecific="True"#> 

//  導入MultipleOutputHelper.ttinclude文件

<#@include file="$(SolutionDir)appT4MultipleOutputHelper.ttinclude"#> 

// 導入相關的DLL

<#@ Assembly Name="$(SolutionDir)libSharpArch.2.0.2NHibernate.dll" #>

<#@ Assembly Name="$(SolutionDir)libSharpArch.2.0.2SharpArch.NHibernate.dll" #>

<#@ Assembly Name="$(SolutionDir)libSharpArch.2.0.2SharpArch.Domain.dll" #>

<#@ Assembly Name="$(SolutionDir)libSharpArch.2.0.2FluentNHibernate.dll" #>

<#@ Assembly Name="$(SolutionDir)appCotide.Databin$(ConfigurationName)Cotide.Infrastructure.dll" #>

<#@ Assembly Name="$(SolutionDir)appCotide.Corebin$(ConfigurationName)Cotide.Domain.dll" #>

<#@ Assembly Name="$(SolutionDir)appCotide.Frameworkbin$(ConfigurationName)Cotide.Framework.dll" #>

<#@ import namespace="System.IO"#>

<#@ import namespace="System"#>

<#@ import namespace="System.Configuration"#>   

 <#  

    // 初始化

    SharpArch.NHibernate.NHibernateSession.CloseAllSessions();

    SharpArch.NHibernate.NHibernateSession.Reset();

    string projectPath = @"C:資料Person項目Codeplex電子商務app";

    string nhibernatePath = projectPath + @"Cotide.WebNHibernate.config";

    string[] mappingAssemblies = new[] { @"C:資料Person項目Codeplex電子商務appCotide.DatabinReleaseCotide.Infrastructure.dll" };

    // 加載配置

    NHibernate.Cfg.Configuration configuration = SharpArch.NHibernate.NHibernateSession.Init(

    new SharpArch.NHibernate.SimpleSessionStorage(), mappingAssemblies,

    new Cotide.Infrastructure.NHibernateMaps.AutoPersistenceModelGenerator().Generate(),

    nhibernatePath);

    // 獲取全部類映射

    var allClassMetadata = SharpArch.NHibernate.NHibernateSession.GetDefaultSessionFactory().GetAllClassMetadata();

    var manager = Manager.Create(Host, GenerationEnvironment);  

    foreach (var entry in allClassMetadata)

    {

       var entityName = entry.Value.EntityName.Split('.'); 

       var className = entityName[entityName.Length - 1];

        // 定義輸出文件

        manager.StartNewFile("I"+className+"Repository.cs");

       #>//-------------------------------------------------------------------

//版權全部:版權全部(C) 2012,Microsoft(China) Co.,LTD

//系統名稱: 

//文件名稱:I<#=className#>Repository.cs

//模塊名稱:

//模塊編號:

//做  者:xcli

//建立時間:2013/4/6 12:49:50 

//功能說明:

//-----------------------------------------------------------------

//修改記錄: 

//修改人:   

//修改時間: 

//修改內容: 

//-----------------------------------------------------------------  

using System;

using System.Collections.Generic;

using System.Linq; 

using System.Text;

using Cotide.Domain.Contracts.Repositories.Extension; 

namespace Cotide.Domain.Contracts.Repositories 

{ 

        public interface I<#=className#>Repository : IDbProxyRepository<<#=className#>>

        {


        } 

}

   <# 

       // 結束輸出文件

       manager.EndBlock();

    } 

       // 執行編譯

       manager.Process(true);  

    #> 
View Code

output result:

輸出文件效果:

Others:

link:

https://msdn.microsoft.com/zh-cn/library/bb126445.aspx

相關文章
相關標籤/搜索