ePe*_*man 5 c# templates code-generation asp.net-mvc-3
我正在开发一些代码生成器,用于生成基于数据库表的模型,控制器和视图,因此我可以创建一个Asp.Net MVC3网站.我现在可以使用CodeDOM生成模型和控制器但是为了生成视图,我需要制作模板的东西,比如从.cs生成.cshtml,我认为T4会是个好主意,但我的一些同事坚持不使用T4,是还有其他方法吗?谢谢
我不确定为什么他们反对使用T4作为很多代码库,包括实体框架使用它们.听起来你正在做我刚刚完成的事情.我喜欢使用Pre-Processed T4模板,因此我可以从C#代码中将数据提供给它们并以这种方式生成文件.这允许您输出多个文件,基本上是用于传入数据的参数.
我使用它的方式是..我创建了一个类,用于收集有关数据库的所有信息..包含或排除哪些表...然后有关每个列的信息,如pk或身份可空等等.我插入了预处理的t4模板,信息能够生成所有的SQL,视图,模型,控制器信息..每当数据库发生变化时......我只是运行我的控制台应用程序并将其全部重新生成.
预处理:http: //odetocode.com/Blogs/scott/archive/2011/01/03/preprocessed-t4-templates.aspx
实体框架:http: //msdn.microsoft.com/en-us/data/gg558520.aspx
MVCScaffolding:http: //blog.stevensanderson.com/2011/04/06/mvcscaffolding-overriding-the-t4-templates/
T4MVC:http://mvccontrib.codeplex.com/wikipage?title = T4MVC
我再次知道这无助于回答你的问题,但T4令人惊讶,我很想听听关于为什么不使用T4的争论......它甚至内置!
顺便说一下这里有一些智能感受!:http://t4-editor.tangible-engineering.com/T4-Editor-Visual-T4-Editing.html
如果你有任何问题请随时打我,我喜欢T4,我愿意回答任何问题.
下面是我用来生成POCO模型的模板的示例..由于使用我的普通c#方法传入数据的预处理能力,已经提取了很多.这个模板为我创建了55个模型,基于数据库中的表.
我的"SchemeCollector"使用我创建持有我需要的所有模式的DatabaseInfo,TableInfo和ColumnInfo类.然后我有9个其他t4模板也使用SchemaCollector类来填充数据.
这是我用来将数据传递到模板中进行生成的扩展.我有这个设置也使用XML文件进行配置但是没必要我只是希望它真的可以重用.
public partial class PocoGenerator
{
public string Namespace { get; set; }
public string Inherit { get; set; }
public DatabaseInfo Schema { get; set; }
public bool Contract { get; set; }
public string SavePath { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
这是我用来调用和填充模板并保存它的方法.
static void GeneratePoco(Config config)
{
var template = config.Poco;
template.Schema = config.DatabaseInfo;
File.WriteAllText(template.SavePath, template.TransformText());
Console.WriteLine(" - POCOs generated for " + config.DatabaseInfo.DatabaseName + " complete");
}
Run Code Online (Sandbox Code Playgroud)
这是模板
<#@ template debug="true" hostSpecific="true" #>
<#@ output extension=".cs" #>
<#@ Assembly Name="System.Core.dll" #>
<#@ Assembly Name="System.Windows.Forms.dll" #>
<#@ import namespace="System" #>
<#@ import namespace="System.IO" #>
<#@ import namespace="System.Diagnostics" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.Collections" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ assembly name="System.Xml.dll" #>
<#@ assembly name="System.Data.dll" #>
<#@ import namespace="System.Data" #>
<#@ import namespace="System.Data.SqlClient" #>
<#@ import namespace="CodeGenerator.Utilities" #>
using System;
using System.Runtime.Serialization;
namespace My.Models
{ <#
List<TableInfo> tables = Schema.Tables;
#>
//#########################################################################################################
// This file has been generated from the tables contained in the <#= Schema.DatabaseName #> database.
// Changes to this file will be overwritten when the file is regenerated. Generated: <#= DateTime.Now #>
//#########################################################################################################
<#
foreach (TableInfo table in tables)
{
#>
[DataContract]
public class <#= table.Name #> : IConfigTable
{
<#
PushIndent(" ");
foreach (ColumnInfo col in table.Columns)
{
if(col.IsKey || col.IsIdentity)
WriteLine("[Key]");
WriteLine("[DataMember]");
if(col.IsNullable && col.Type != "string")
WriteLine("public " + col.Type + "? " + col.Name+ " { get; set; }");
else
WriteLine("public " + col.Type + " " + col.Name+ " { get; set; }");
}PopIndent();#>
}
<# } #>
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5573 次 |
| 最近记录: |