恕我直言,编写复杂模板时最重要的两个概念是
- 分离模型和视图- 这有助于将模板逻辑保持在最低限度(通常是维护问题的原因)。我个人认为这不需要一个框架,它只需要你去做。
- Partial 是你的朋友——我通常使用 T4 从模型生成骨架代码。特定的行为可能不值得在模型中投入精力,最好经常通过使用部分类或方法来允许该行为进入。
不那么重要但很好
- 使代码可搜索- 我不依赖 T4 插件,因为我发现它们都不够好,由于缺少 IntelliSense 来导航代码,我必须使代码可搜索。它可以很简单,而不是调用 Column 属性名称,我将其称为 ColumnName。
- 在输出中插入“标签” - 更容易找到生成该部分输出的代码。
分离模型/视图的示例:
<#
// Model for Dependency Pooperties
Model = new []
{
new ClassDefinition ("MyDataGrid")
{
P ("CultureInfo" , "CultureInfo"),
P ("Pen" , "CellBorderPen"),
P ("IEnumerable<object>" , "Rows"),
C ("WColumnDefinition" , "Columns"),
},
};
#>
// Include the view
<#@ include file="..\T4\DependencyProperties.ttinclude" #>
然后视图遍历模型并生成依赖属性。
然后依赖属性的行为被实现为部分方法
partial void Changed_Columns(
ObservableCollection<WColumnDefinition> oldValue,
ObservableCollection<WColumnDefinition> newValue
)
{
HookUpColumns(oldValue, null);
HookUpColumns(newValue, this);
}
请注意,将这种特定行为放入模型中会使模型显着复杂化。
最后; 即使是一个称职的程序员也需要时间来胜任地编写元程序。在我找到一种我认为可以维护的风格之前,我进行了几次尝试,但对我来说,这是值得的,因为我能够更快地交付质量。
我希望这有帮助...
PS。我认为没有人会争辩说 T4 曾经很优雅,但它仍然非常有用。