Ear*_*rlz 8 c# t4 refactoring unit-testing code-generation
我有一个相当复杂的东西塞进T4模板.基本上我采取类似的东西
{= foo =}更多文字...
并将其转换为类(视图),如下所示:
public class MyView
{
public string foo{get;set;}
public string Write()
{
return foo+@" more text...";
}
}
Run Code Online (Sandbox Code Playgroud)
生成的代码当然要复杂得多.无论如何,T4模板现在超过600行代码,并且真正变得难以管理.我认为主要问题是混合代码和"内容"(即静态代码).我不确定如何干净地解决这个问题(当然不会影响生成的代码).我也没有看到任何可行的单元测试我的T4代码的方法,除了简单地测试它的T4执行错误.当然,似乎几乎不可能测试它生成的代码.
我可以使用任何"模型 - 视图"类型的框架或技术来使我的T4模板代码更干净吗?
恕我直言,编写复杂模板时最重要的两个概念是
不那么重要但很好
分离模型/视图的示例:
<#
// 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" #>
Run Code Online (Sandbox Code Playgroud)
然后,视图遍历模型并生成依赖项属性.
然后,依赖项属性的行为将作为部分方法实现
partial void Changed_Columns(
ObservableCollection<WColumnDefinition> oldValue,
ObservableCollection<WColumnDefinition> newValue
)
{
HookUpColumns(oldValue, null);
HookUpColumns(newValue, this);
}
Run Code Online (Sandbox Code Playgroud)
请注意,将此特定行为放入模型会使模型复杂化.
最后; 即使是一个称职的程序员也需要时间才能胜任地编写元程序.我花了多次尝试之前,我来到了一个风格,我认为这是维护的,但对我来说是值得的,因为我可以出货质量更快.
我希望这有帮助...
PS.我不认为有人会认为T4是优雅的,但它仍然是有用的.