编辑模板文件


  在【模板】窗口中双击模板文件,打开编辑。由于每一种模板引擎的语法不一样,因此编写时应该遵循模板语法,以下分别就 T4、Razor 和 NVelocity 模板的编写进行简单介绍。


一、T4 模板

  T4 的全称为 Text Template Transformation Toolkit,Visual Studio 本身已经集成了 T4 模板引擎,CodeBuilder 只是将其植入了进来。T4 模板的语法基本如下:

  首先要说明一下 Host,它是 T4 模板上的核心对象,它有以下属性:

名称 类型 说明
Current dynamic 根据 PartitionLoop 不同,值也不同。比如循环 Tables 时,此时为 Table 对象,当循环为 None 时,此值为 null
Profile dynamic 所定义的变量对象
Tables List<Table> 需要生成的 Table 集合,包含扩展属性
References List<Reference> 表间的关系集合
Guids GuidDispatcher 是一个用来存放 Guid 的字典,一般用在解决方法或项目文件中
Debugger Debugger 调试器,可以使用 Write 输出或 Alert 弹出显示信息3.4

  Guids 的用法如下(详见 Abp + EfCore 完整项目(.net6) solution.tt):

Project("<#= host.Guids["solution"] #>") = "<#= host.Profile.ProjectCode #>.WebApi", "<#= host.Profile.ProjectCode #>.WebApi\<#= host.Profile.ProjectCode #>.WebApi.csproj", "<#= host.Guids["webapi"] #>"
EndProject

  Debugger 用法,Write 输入信息到“输出”窗口中,Alert 使用对话框弹出消息。

<#@ template hostSpecific="true" debug="true" #>
<#@ output extension=".cs" #>
<#@ include file="public\base.tt" #>
<# 
    TemplateHost host = (TemplateHost)Host;
    var table = host.Current;
#>
using System;

namespace <#= host.Profile.Namespace #>.Models
{
    /// <summary>
    /// <#= table.Description #>。
    /// </summary>
    public class <#= table.ClassName #>
    {
<#
    host.Debugger.Alert("类名称" + table.ClassName);
    foreach (var column in table.Columns)
    {
        host.Debugger.Write("表字段" + column.Name);
#>
        /// <summary>
        /// <#= column.Description #>。// <#= column.Owner.Name #>
        /// </summary>
        public <#= column.PropertyType #> <#= column.PropertyName #> { get; set; }

<#
    }
#>
    }
}

  另外 Host 有一个方法:

名称 说明
HasPartition(string) 判断是否需要生成指定的部件

  用法如下(详见 Abp + EfCore 完整项目(.net6) Application app.tt)

<#
    if (host.HasPartition("DomainService"))
    {
#>
        private readonly <#= table.ClassName #>Manager _<#= ToCamel(table.ClassName) #>Manager;

        public <#= table.ClassName #>AppService(<#= table.ClassName #>Manager <#= ToCamel(table.ClassName) #>Manager)
        {
            _<#= ToCamel(table.ClassName) #>Manager = <#= ToCamel(table.ClassName) #>Manager;
        }
<#
    }
    else
    {
#>
        private readonly <#= table.ClassName #>Repository _<#= ToCamel(table.ClassName) #>Repository;

        public <#= table.ClassName #>AppService(<#= table.ClassName #>Repository <#= ToCamel(table.ClassName) #>Repository)
        {
            _<#= ToCamel(table.ClassName) #>Repository = <#= ToCamel(table.ClassName) #>Repository;
        }
<#
    }
#>

  如果你不知道变量或架中有何物,可右键弹出菜单,从【插入】菜单中选择需要的字段插入,如下图所示:



💡 多说一句

  编写完模板后,从右键菜单中单击【校验...】菜单,即可对模板进行编译校验,如果语法有误,CodeBuilder 会弹出错误提示。

  T4 模板语法可参考 T4系列文章之3:T4语法的介绍


二、Razor 模板

  Razor 模板也是比较出色的模板引擎。模板是的核心对象是 Model,和 T4 模板的 Host 对象相类似,Model 对象提供了 Profile、Current、Tables 和 References 四个属性。示例如下:

using System;

namespace @(Model.Profile.Namespace).Models
{
    /// <summary>
    /// @(Model.Current.Description)
    /// </summary>
    public partial class @Model.Current.ClassName
    {
@foreach(var c in Model.Current.Columns)
{
@("        /// <summary>
")
@("        /// " + c.Description + "。
")
@("        /// </summary>
")
@("        public " + @c.PropertyType + " " + @c.PropertyName + "{ get; set; }

")
}
    }
}

三、NVelocity 模板

  NVelocity 模板提供了 Profile、Current、Tables 和 References 四个属性。示例如下:

#parse("../public/base.vm")
using System;

namespace ${Profile.Namespace}.Models
{
    /// <summary>
    /// $Current.Description。
    /// </summary>
    public class ${Current.ClassName}
    {
#foreach ($column in $Current.Columns)
        /// <summary>
        /// 获取或设置${column.Description}。
        /// </summary>
        public $column.PropertyType ${column.PropertyName} { get; set; }

#end
    }
}

💡 注意事项

  尽量不要去改动 CodeBuilder 内置的模板,以免模板版本更新后被覆盖,你应该复制出一个副本进行修改。