有一些T4模板的情况

时间:2011-09-21 16:28:10

标签: c# asp.net templates t4 tangible-t4-editor

我正在尝试为自定义控制器(带服务)创建T4模板。但是,我遇到了一些问题。我目前使用有形的免费T4工具编辑器和TextTemplatingFileGenerator作为自定义工具。我在试验时遇到了几个问题:

1:我尝试使用MvcTextTemplateHost mvcHost =(MvcTextTemplateHost)(Host);并且它说“找不到类型或命名空间名称MvcTextTemplateHost(你是否缺少using指令或程序集引用?)。它说要清除自定义工具,但我想知道如何我可以查看生成的T4文件清除工具?

2:另一种方法是Steve Sanderson的CustomTemplate,但是我遇到了没有找到DynamicTransform的问题,并且想知道我在哪里可以获得使用它所需的文件。如果我需要清除此工具,那么如何查看生成的示例文件?非常感谢你。

Max Gilman

一些示例代码:

<#@ Template Language="C#" HostSpecific="True" Inherits="DynamicTransform" #>
<#@ Output Extension="cs" #>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Text;

namespace someNamespace
{ 

<#  
    var modelType = (CodeType)Model.ModelType; 
    var modelName = modelType.Name; 
    var modelNamePlural = Model.ModelTypePluralized; 
    var modelVariable = modelName.ToLower(); 
    var relatedEntities = ((IEnumerable)Model.RelatedEntities).OfType<RelatedEntityInfo>();
    var primaryKeyProperty = modelType.VisibleMembers().OfType<CodeProperty>().Single(x => x.Name == Model.PrimaryKey); 
    var routingName = Regex.Replace(Model.ControllerName, "Controller$", "", RegexOptions.IgnoreCase);
    var isObjectContext = ((CodeType)Model.DbContextType).IsAssignableTo<System.Data.Objects.ObjectContext>();
#>
    public class foo
    {
        //This is a basic comment.
    }
}

1 个答案:

答案 0 :(得分:2)

在这两种情况下,您似乎都在尝试在Visual Studio项目中使用T4模板,并使用TextTemplatingFileGenerator作为自定义工具从模板生成代码。

1:MvcTextTemplatingHost是一个自定义T4主机,只有在使用ASP.NET MVC添加视图或添加控制器对话框时才可用。使用TextTemplatingFileGenerator自定义工具时,它将无法使用,也无法正确初始化。

2:史蒂夫桑德森的MvcScaffolding / T4Scaffolding使用自己的自定义T4主机,所以你在这里遇到类似的问题。如果您将NuGet包管理器控制台与自定义T4脚手架模板一起使用,那么它应该可以工作,但它不能与TextTemplatingFileGenerator自定义工具一起使用。 DynamicTransform类本身不存在。如果您查看CodePlex上的T4Scaffolding source code,在InvokeScaffoldTemplateCmdlet类中,您将看到实际上删除了Inherits =“DynamicTransform”指令,并替换为对动态模型对象的引用。当您构建控制器时,会在自定义主机和动态模型对象上设置各种属性(例如Model.ModelType),然后再将其传递给T4模板进行处理。

在上述两种情况下,使用带有TextTemplatingFileGenerator的T4模板都不会起作用,因为它们使用的自定义模板主机需要在T4模板使用之前进行初始化。

我认为你的选择是:

  1. 使用“添加控制器”对话框创建自定义ASP.NET MVC T4模板并使用ASP.NET工具生成自定义控制器。
  2. 创建自定义脚手架T4模板,并使用NuGet Package Manager控制台生成自定义控制器。
  3. 创建您自己的自定义工具,初始化可以从T4模板中使用的自定义主机。
  4. 选项2)可能是你最好的选择,因为我相信MvcScaffolding可以在不删除现有代码的情况下更新现有的控制器代码。