编辑模板文件
在【模板】窗口中双击模板文件,打开编辑。由于每一种模板引擎的语法不一样,因此编写时应该遵循模板语法,以下分别就 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 内置的模板,以免模板版本更新后被覆盖,你应该复制出一个副本进行修改。