以前在 「使用T4模板生成代碼 – 初探」 文章簡單的使用了T4模板的生成功能,但對於一個模板生成多個實例文件,如何實現這個方式呢?無心發現一個解決方案 「MultipleOutputHelper.ttinclude」 ,它讓基於T4模板批量生成文件實例變得簡單起來了。git
Damien Guard是一個在加利福尼亞州聖何塞的開發人員,他構建出處理使用T4模板輸出多文件的解決方案「MultipleOutputHelper.ttinclude」github
1. 初始化app
獲取MultipleOutputHelper.ttinclude文件模板ide
注意: 文件能夠上github.com 託管上面獲取( https://github.com/damieng/DamienGKit/tree/master/T4/MultipleOutputHelper)spa
在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方法,進行文件分割。
基於以前的「使用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); #>
output result:
輸出文件效果:
link:
https://msdn.microsoft.com/zh-cn/library/bb126445.aspx