T4模板的简单易用上手用法

直接使用简单粗暴的手法修改T4模板

达到以下结果:
T4模板的简单易用上手用法_第1张图片
T4模板的简单易用上手用法_第2张图片

首先,找到EF映射之后的edmx文件下的t4文件

内容如下:
T4模板的简单易用上手用法_第3张图片
把该文件中的内容作为原型进行修改!
新建项目选择文本模板就行了,然后把它清空。
由于文件太长,就不展示了,只展示修改地方。

一、生成多个类文件

直接放改动之后的代码!

前半截:
<#@ template language="C#" debug="false" hostspecific="true"#>
<#@ include file="EF6.Utility.CS.ttinclude"#><#@ 
 output extension=".cs"#><#
//修改const string inputFile = @"NoteModel.edmx"; 为下方代码
string inputFile =Host.ResolveAssemblyReference("$(ProjectDir)").Replace("FFeat.Note.IDal","FFeat.Note.Model")+"/NoteModel.edmx";
var textTransform = DynamicTextTransformation.Create(this);
var code = new CodeGenerationTools(this);
var ef = new MetadataTools(this);
var typeMapper = new TypeMapper(code, ef, textTransform.Errors);
var fileManager = EntityFrameworkTemplateFileManager.Create(this);
var itemCollection = new EdmMetadataLoader(textTransform.Host, textTransform.Errors).CreateEdmItemCollection(inputFile);
var codeStringGenerator = new CodeStringGenerator(code, typeMapper, ef);

if (!typeMapper.VerifyCaseInsensitiveTypeUniqueness(typeMapper.GetAllGlobalItems(itemCollection), inputFile))
{
    return string.Empty;
}

WriteHeader(codeStringGenerator, fileManager);

foreach (var entity in typeMapper.GetItemsToGenerate(itemCollection))
{
    fileManager.StartNewFile("I"+entity.Name + "IDal_1.cs");//改处2 防止自动合并原有类文件
    //BeginNamespace(code); 命名空间语句头,强迫症,挪到了using语句下方
#>
//手动添加需要的命名空间
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using FFeat.Note.Model;
<#=codeStringGenerator.UsingDirectives(inHeader: false)#>
<#    BeginNamespace(code);#>//上面挪过来的
<#=codeStringGenerator.EntityClassOpening(entity)#>
{
    //删除了原型模板里的代码,删到命名空间结束之前的}符号为止。
}
<#
    EndNamespace(code);
}

第二部分:
修改方法:
    public string EntityClassOpening(EntityType entity)
    {
        return string.Format(
            CultureInfo.InvariantCulture,
            "{0} {1}partial interface I{2}Dal{3}:IBaseDal<"+entity.Name+""+">",//类名更改处,这里加上了统一继承
            Accessibility.ForType(entity),
            _code.SpaceAfter(_code.AbstractOption(entity)),
            _code.Escape(entity),
            _code.StringBefore(" : ", _typeMapper.GetTypeName(entity.BaseType)));
    }
 改之前是:
        public string EntityClassOpening(EntityType entity)
    {
        return string.Format(
            CultureInfo.InvariantCulture,
            "{0} {1}partial interface {2}{3}",
            Accessibility.ForType(entity),
            _code.SpaceAfter(_code.AbstractOption(entity)),
            _code.Escape(entity),
            _code.StringBefore(" : ", _typeMapper.GetTypeName(entity.BaseType)));
    }

上面更改后,可达到以下效果图:
T4模板的简单易用上手用法_第4张图片
T4模板的简单易用上手用法_第5张图片

二、如果是单文件

先上效果图:
T4模板的简单易用上手用法_第6张图片
代码修改如下:

<#@ template language="C#" debug="false" hostspecific="true"#>
<#@ include file="EF6.Utility.CS.ttinclude"#><#@ 
 output extension=".cs"#>
 <#
//这里依旧要改
string inputFile = Host.ResolveAssemblyReference("$(ProjectDir)").Replace("FFeat.Note.Factory","FFeat.Note.Model")+"/NoteModel.edmx"; 
var textTransform = DynamicTextTransformation.Create(this);
var code = new CodeGenerationTools(this);
var ef = new MetadataTools(this);
var typeMapper = new TypeMapper(code, ef, textTransform.Errors);
var fileManager = EntityFrameworkTemplateFileManager.Create(this);
var itemCollection = new EdmMetadataLoader(textTransform.Host, textTransform.Errors).CreateEdmItemCollection(inputFile);
var codeStringGenerator = new CodeStringGenerator(code, typeMapper, ef);

if (!typeMapper.VerifyCaseInsensitiveTypeUniqueness(typeMapper.GetAllGlobalItems(itemCollection), inputFile))
{
    return string.Empty;
}

WriteHeader(codeStringGenerator, fileManager);
//foreach (var entity in typeMapper.GetItemsToGenerate(itemCollection)) 这个方法挪到下方,用来生成有类名的语句块
//{
//  fileManager.StartNewFile(entity.Name + ".cs");
//    BeginNamespace(code);
#>
//手动添加的using块
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using FFeat.Note.IDal;
<#=codeStringGenerator.UsingDirectives(inHeader: false)#>
<#BeginNamespace(code);#>
//<#=codeStringGenerator.EntityClassOpening(entity)#> 换成下方固定的
    public partial class StaticDalFactory
    {
    public static string  AssemblyName = System.Configuration.ConfigurationManager.AppSettings["DALAssemblyName"];
     <#foreach(var entity in typeMapper.GetItemsToGenerate(itemCollection))//利用entity.Name 获得所有类名
     {#>
    public static I<#=entity.Name#>Dal Get<#=entity.Name#>Dal()=> Assembly.Load(AssemblyName).CreateInstance(AssemblyName + ".<#=entity.Name#>Dal") as I<#=entity.Name#>Dal;
    <#}#>

}
<#
    EndNamespace(code);

原理都挺简单的,相信大家看两眼就能看懂,这里只做一个抛砖引玉,我就不献丑了。
总的来说,改的地方也不多。三层架构中,把需要重复的动作都放一个T4模板进去。
以后需要增加model的话,也只需要菜单>生成>转换所有T4模板,就一步到位啦!

你可能感兴趣的:(MVC记录)