我正在深入研究重复编码任务的代码生成,并且已经看到了这两种方法.我在Microsoft .Net的Apress书籍代码生成中看到过XSLT方法,并且已经阅读了与MVC框架中的新内容相关的T4方法.
每种方法更适合哪种项目?快速浏览一下,告诉我T4是一个更轻量级的系统,是真的吗?
非常感谢...
错误是:
Error 48 A processor named 'PropertyProcessor' could not be found for the directive named 'property'. The transformation will not be run. The following Exception was thrown:
System.IO.FileNotFoundException: Failed to resolve type for directive processor PropertyProcessor.
at Microsoft.VisualStudio.TextTemplating.VSHost.TextTemplatingService.ResolveDirectiveProcessor(String processorName)
at Microsoft.VisualStudio.TextTemplating.Engine.ProcessCustomDirectives(ITextTemplatingEngineHost host, TemplateProcessingSession session, List`1 directivesToBeProcessed) Config.tt 2 4
Run Code Online (Sandbox Code Playgroud)
T4模板是:
<#@ template language="C#" #>
<#@ property name="serverName" processor="PropertyProcessor" type="System.String" #>
using System;
Run Code Online (Sandbox Code Playgroud)
我该如何解决这个错误?这是什么意思?
我试图使用T4模板获取Views文件夹中的文件夹名称,它不断给我以下错误:
错误3编译转换:当前上下文中不存在名称"Server"c:\ Projects\LearningASPMVC\LearningASPMVCSolution\LearningMVC\StronglyTypedViews.tt 20 47
错误4命名空间不直接包含字段或方法等成员C:\ Projects\LearningASPMVC\LearningASPMVCSolution\LearningMVC\StronglyTypedViews.cs 1 1 LearningMVC
这是T4模板:
<#@ template language="C#" debug="True" hostspecific="True" #>
<#@ output extension=".cs" #>
<#@ assembly name="System.Web" #>
<#@ import namespace="System.IO" #>
<#@ import namespace="System.Web" #>
using System;
namespace StronglyTypedViews
{
<#
string[] folders = Directory.GetDirectories(Server.MapPath("Views"));
foreach(string folderName in folders)
{
#>
public static class <#= folderName #> { }
<# } #>
}
Run Code Online (Sandbox Code Playgroud)
更新:使用物理路径工作:
<#@ template language="C#" debug="True" hostspecific="True" #>
<#@ output extension=".cs" #>
<#@ assembly name="System.Web" #>
<#@ assembly name="System.Web.Mvc" #> …Run Code Online (Sandbox Code Playgroud) 我正在使用T4生成一些DTO类+映射器.
我正在将文件拆分成许多可重用的位(其中一些包含常用方法,其他一些常用程序)并将它们包含在将生成输出的T4模板中 - 这一切都很好.
我的问题是,每次我对它们进行更改时,可重复使用的.tt文件将尝试生成自己的输出并失败(因为它们与其他一些.tt文件耦合),这很简单.
我很确定我在某处看到某些指令指定给定文件不应该尝试生成任何输出,但我似乎无法追踪它.
任何帮助赞赏!
有没有办法,使用Xamarin Studio,有一个运行T4模板的预构建命令?这有助于动态生成C#文件.
我正在尝试为一些EF 6.0内容构建一个简单的C#模板.我在定义所有Entity Framework对象的同一项目中创建了模板.但是,我似乎无法使用在Entity生成器中可以找到的某些类型,特别是TypeMapper.
这是我的Entity生成器T4文件的顶部:
<#@ template language="C#" debug="false" hostspecific="true"#>
<#@ include file="EF.Utility.CS.ttinclude"#>
<#@ output extension=".cs"#>
<#
const string inputFile = @"EpicCloudDB.edmx";
#>
<#@ include file="EdmxEnumFixer.t4" #>
<#
var textTransform = DynamicTextTransformation.Create(this);
var code = new CodeGenerationTools(this);
var ef = new MetadataTools(this);
var typeMapper = new TypeMapper(code, ef, textTransform.Errors);
var fileManager = EntityFrameworkTemplateFileManager.Create(this);
var itemCollection = new EdmMetadataLoader(textTransform.Host, textTransform.Errors).CreateEdmItemCollection(inputFile);
var codeStringGenerator = new CodeStringGenerator(code, typeMapper, ef);
#>
Run Code Online (Sandbox Code Playgroud)
这里没什么可疯狂的.但是,如果我创建一个模板并将其直接粘贴到它(同一个项目),则无法找到以下类型:
我只需要TypeMapper,但我不明白为什么相同的模板代码在新模板中不起作用,但在默认的EF文件中运行得很好.
这两个类都不容易找到文档.我想如果我能找到哪个程序集定义TypeMapper我可以手动添加引用并担心以后的一般怪异,但事实证明这比我预期的要困难.
那么如何才能将此类型导入我的模板?在我等待答案的时候,我会通过EF 6来源.
Database First(和Model First)方法有这个不错的DbContext Generator脚手架文件来生成上下文和模型; Model.Context.tt + Model.tt
由于它们具有内置辅助方法来检索导航属性,因此将它们用于其他目的也非常方便,例如创建控制器,视图等.ASP.NET Scaffolding也做类似的工作但在这种情况下,脚手架需要相反,这些T4文件会同时生成所有文件.
但是,它们仅使用"edmx"文件作为输入.是否可以使用/转换它们用于Code First方法?
实体框架版本6.1
我使用此MSDN链接中的方法(" 使用自定义主机处理文本模板 ").
这允许我以编程方式使用T4(模板可以在运行时使用).
但是有一个问题,在模板代码中我无法使用
<#@ Import Namespace="System.Xml" #>
Run Code Online (Sandbox Code Playgroud)
我会得到这样的消息:
错误CS0234:编译转换:命名空间"系统"中不存在类型或命名空间名称"Xml"(您是否缺少程序集引用?)
我该如何解决这个问题?
在visual studio中有两种类型的文本转换模板文件扩展名.T4vs.TT
我想知道他们的差异,当我想要扩展构建视图控制器和模型时,我应该使用它,当我从数据库中读取模式时
我也想知道.includes两者是否可以重复使用.
我正在尝试为我的数据库表的实体生成CRUD操作,就像要使用各自的端点一样.
它与visual studio生成用于Authentication(帐户控制器)的锅炉板代码相同,也以整个包的形式生成crud操作.
我遇到了t4模板,但没有得到如何使用它来为我的数据库表实体生成crud操作.
我还尝试使用应用程序名称,引用(dll),Controller等生成整个应用程序包.就像visual studio如何为实体框架的CRUD操作生成锅炉板代码一样.
我将传递sql服务器名称,数据库名称,我想要生成CRUD操作的表.
我想用我的控制台应用程序按需生成这个,所以它应该返回带有引用s(所有dll)的整个应用程序包,然后我将创建该包的zip并返回给用户.
对于Eg:我想基于"应用程序名称"生成我的整个应用程序包,如下面的WebApplication3项目所示,其中包含References,Controller包含crud操作
谁能告诉我怎么做?