我正在尝试为自定义控制器(带服务)创建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.
}
}
答案 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模板使用之前进行初始化。
我认为你的选择是:
选项2)可能是你最好的选择,因为我相信MvcScaffolding可以在不删除现有代码的情况下更新现有的控制器代码。