0

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

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

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

马克斯·吉尔曼

一些示例代码:

<#@ 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.
    }
}
4

1 回答 1

2

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

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

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

在上述两种情况下,将 T4 模板与 TextTemplatingFileGenerator 一起使用是行不通的,因为它们使用了一个自定义模板主机,该主机需要在 T4 模板使用之前进行初始化。

我认为你的选择是:

  1. 创建自定义 ASP.NET MVC T4 模板并使用 ASP.NET 工具通过“添加控制器”对话框生成自定义控制器。
  2. 创建自定义基架 T4 模板并使用 NuGet 包管理器控制台生成自定义控制器。
  3. 创建您自己的自定义工具,用于初始化可从您的 T4 模板使用的自定义主机。

选项 2) 可能是您最好的选择,因为我相信 MvcScaffolding 可以在不删除现有代码的情况下更新现有控制器代码。

于 2011-09-22T20:36:35.307 回答