小编是个实用主义者,并没有深入的去理解T4的原理。只是根据自己的需求,在博客园里的前辈哪里找的资料,结合自己的理解,在项目中使用了T4模板。
最近的项目用了他,很方便,节省了不少代码量。
想利用T4做个代码生成器,目前比较忙,使用一直没有时间去做。如果大家有好的思路或者方法,请多多指教。
小编比较懒,又不怎么会排版,所以就先截下图,让大家可以比较直观的先看看需要哪些文件和步骤。
首先,定义一个接口,代表一个领域实体。在定义一个实体集成这个接口
面向接口编程的各种好处就不提了。
/// <summary> /// 代表一个领域实体 /// </summary> public interface IEntity { Guid ID { get; } } public abstract class Entity : IEntity { public Guid ID { get; set; } //这里可以写一些领域实体的基本方法。面向对象么 有时总会有写对象自己的公用的方法.类似 freamework的 Object } public class User : Entity { }
之后新建一个T4模板文件。先上代码后面解释下关键的地方
<#@ template debug="false" hostspecific="true" language="C#" #> <#@ assembly name="System.Core" #> <#@ assembly name="$(SolutionDir)ModelinDebugModel.dll" #> <#@ import namespace="Model" #> <#@ import namespace="System.Linq" #> <#@ import namespace="System.Text" #> <#@ import namespace="System.Collections.Generic" #> <#@ import namespace="System.IO"#> <#@ import namespace="System"#> <#@ import namespace="System.Configuration"#> <#@ output extension=".cs" #> <#@include file="$(SolutionDir)packagesMultipleOutputHelper.ttinclude"#> <# var assembly = System.Reflection.Assembly.GetAssembly(typeof(IEntity)); var types = assembly.GetTypes().Where(x => typeof(IEntity).IsAssignableFrom(x) && !x.IsAbstract && !x.IsInterface); var manager = Manager.Create(Host, GenerationEnvironment); foreach (var type in types) { // 定义输出文件 manager.StartNewFile(type.Name+"TypeConfiguration.cs"); #> using System.ComponentModel.DataAnnotations.Schema; using System.Data.Entity.ModelConfiguration; using Model; namespace Data { public class <#=type.Name#>TypeConfiguration : EntityTypeConfiguration<<#=type.Name#>> { public <#=type.Name#>TypeConfiguration() { HasKey(c => c.ID); Property(c => c.ID) .IsRequired() .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity); ToTable("<#=type.Name#>"); } } } <# // 结束输出文件 manager.EndBlock(); } // 执行编译 manager.Process(true); #>
<#@ assembly name="$(SolutionDir)ModelinDebugModel.dll" #>//这个事为了获取领域实体所在的dll文件。之后需要反射这个dll获取集成实体接口。
$(SolutionDir) //这个是VS的宏命令,获取当前的解决方案路径。有不少的宏命令,具体可以找博客园里找下相关的内容,这里就不列举出来了。
<#@ import namespace="Model" #> //引用这个这个dll。类似using
<#@include file="$(SolutionDir)packagesMultipleOutputHelper.ttinclude"#>//这个文件很关键,是个老外写的,具体在哪里找不到了。她会帮助我们生成cs文件。这个文件在我上传附件的packages里面。
之后的步骤就是反射的操作了。
写得有些。。。望大家多见谅。
附件 : T4Demo.rar