1.first of all

之前在 “使用T4模板生成代码 – 初探” 文章简单的使用了T4模板的生成功能,但对于一个模板生成多个实例文件,如何实现这个方式呢?无意发现一个解决方案 “MultipleOutputHelper.ttinclude” ,它让基于T4模板批量生成文件实例变得简单起来了。

什么是MultipleOutputHelper.ttinclude

Damien Guard是一个在加利福尼亚州圣何塞的开发人员,他构建出处理使用T4模板输出多文件的解决方案“MultipleOutputHelper.ttinclude”

2.使用

1. 初始化

获取MultipleOutputHelper.ttinclude文件模板

注意: 文件可以上github.com 托管上面获取(https://github.com/damieng/DamienGKit/tree/master/T4/MultipleOutputHelper

在T4模板中使用include指令导入MultipleOutputHelper.ttinclude文件或者将MultipleOutputHelper.ttinclude的代码复制在T4模板内。

然后初始化Manager对象,代码如下:

 注意: 这里的Manager.ttinclude 就是MultipleOutputHelper.ttinclude文件模板

2. 文件块

使用代码标识区分生成的代码块的范围

该代码声明了一个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 - ];

        // 定义输出文件

        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:

输出文件效果:

Others:

link:

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

【Reship】use of tangible T4 template engine的更多相关文章

  1. 【Egret】在WebStorm里使用Egret Engine 的注意点

    1.开启代码提示 2.修改egret code后,自动编译新egret code 按照下图进行设置: ①打开"File-settings" ② ③ (PS:webstorm打开目录 ...

  2. 【Vue】详解Vue生命周期

    Vue实例的生命周期全过程(图) (这里的红边圆角矩形内的都是对应的Vue实例的钩子函数) 在beforeCreate和created钩子函数间的生命周期 在beforeCreate和created之 ...

  3. Python开发【项目】:学员管理系统(mysql)

    需求: 用户角色,讲师\学员, 用户登陆后根据角色不同,能做的事情不同,分别如下 讲师视图: 管理班级,可创建班级,根据学员qq号把学员加入班级 可创建指定班级的上课纪录,注意一节上课纪录对应多条学员 ...

  4. WPF Template模版之DataTemplate与ControlTemplate【一】

    WPF Template模版之DataTemplate与ControlTemplate[一] 标签: Wpf模版 2015-04-19 11:52 510人阅读 评论(0) 收藏 举报  分类: -- ...

  5. 【GDKOI2014】JZOJ2020年8月13日提高组T4 内存分配

    [GDKOI2014]JZOJ2020年8月13日提高组T4 内存分配 题目 Description Input Output 输出m行,每行一个整数,代表输入中每次程序变化后系统所需要的空闲内存单位 ...

  6. 【译】微型ORM:PetaPoco【不完整的翻译】

    PetaPoco是一款适用于.Net 和Mono的微小.快速.单文件的微型ORM. PetaPoco有以下特色: 微小,没有依赖项……单个的C#文件可以方便的添加到任何项目中. 工作于严格的没有装饰的 ...

  7. 【译】微型ORM:PetaPoco

    PetaPoco是一款适用于.Net 和Mono的微小.快速.单文件的微型ORM. PetaPoco有以下特色: 微小,没有依赖项……单个的C#文件可以方便的添加到任何项目中. 工作于严格的没有装饰的 ...

  8. 【译】微型ORM:PetaPoco【不完整的翻译】(转)

    出处:http://www.cnblogs.com/youring2/archive/2012/06/04/2532130.html PetaPoco是一款适用于.Net 和Mono的微小.快速.单文 ...

  9. 【转】.NET(C#):浅谈程序集清单资源和RESX资源 关于单元测试的思考--Asp.Net Core单元测试最佳实践 封装自己的dapper lambda扩展-设计篇 编写自己的dapper lambda扩展-使用篇 正确理解CAP定理 Quartz.NET的使用(附源码) 整理自己的.net工具库 GC的前世与今生 Visual Studio Package 插件开发之自动生

    [转].NET(C#):浅谈程序集清单资源和RESX资源   目录 程序集清单资源 RESX资源文件 使用ResourceReader和ResourceSet解析二进制资源文件 使用ResourceM ...

随机推荐

  1. 【Java_Spring】java解析多层嵌套json字符串

    java解析多层嵌套json字符串    

  2. 第1 章初识Python

    1.print()—输出 print()函数的基本用法如下: print(输出内容) 其中,输出内容可以是数字和字符串(使用引号括起来),此类内容将直接输出,也可以是包含运算符的表达式,此类内容将计算 ...

  3. 五、Shell 基本运算符

    Shell 基本运算符 Shell 和其他编程语言一样,支持多种运算符,包括: 算数运算符 关系运算符 布尔运算符 字符串运算符 文件测试运算符 原生bash不支持简单的数学运算,但是可以通过其他命令 ...

  4. 浅谈JavaScript字符串拼接

    本文给大家汇总介绍了几种javascript中字符串拼接的方法,十分的简单实用,有需要的小伙伴可以参考下. 在JavaScript中会经常遇到字符串拼接,但是如果要拼接的字符串过长就比较麻烦了. 如果 ...

  5. jQuery具体实例介绍什么时候用ajax,ajax应该在什么地方使用

    网站开发时,ajax是一个非常方便的工具,它具有和表单相同的功能完成前端和后台之间的交互!它起到局部刷新的功能!那什么时候用ajax呢?下面给大家介绍几个实例,首先应该分为两类:  一.在用表单和aj ...

  6. 饭卡 HDU - 2546(dp)

    电子科大本部食堂的饭卡有一种很诡异的设计,即在购买之前判断余额.如果购买一个商品之前,卡上的剩余金额大于或等于5元,就一定可以购买成功(即使购买后卡上余额为负),否则无法购买(即使金额足够).所以大家 ...

  7. 【N-Quens II】cpp

    题目: Follow up for N-Queens problem. Now, instead outputting board configurations, return the total n ...

  8. MFC深入浅出读书笔记第三部分1

    第八章 Document-View 深入探讨(总结) 1.Document Document 在MFC 的CDocument 里头被具体化.CDocument 本身并无任何具体数据,它只是提供一个空壳 ...

  9. Python基础-week08 并发编程

    一 背景知识 顾名思义,进程即正在执行的一个过程.进程是对正在运行程序的一个抽象. 进程的概念起源于操作系统,是操作系统最核心的概念,也是操作系统提供的最古老也是最重要的抽象概念之一.操作系统的其他所 ...

  10. nginx在基于域名访问的时候是下载的界面

    刚才在做nginx实验时候出现访问域名的时候是下载页面一直下载了好多文件,使用IP访问就正常,在配置文件中找到一个sendfile的参数,把参数值改为off或者直接注释掉这个参数就可以访问了.