MVC ---- T4模板的小练习
1、先建立两个模板文件 :Manger.ttinclude、DBHelper.ttinclude
- Manger.ttinclude
- <#@ assembly name="System.Core"#>
- <#@ assembly name="System.Data.Linq"#>
- <#@ assembly name="EnvDTE"#>
- <#@ assembly name="System.Xml"#>
- <#@ assembly name="System.Xml.Linq"#>
- <#@ import namespace="System"#>
- <#@ import namespace="System.CodeDom"#>
- <#@ import namespace="System.CodeDom.Compiler"#>
- <#@ import namespace="System.Collections.Generic"#>
- <#@ import namespace="System.Data.Linq"#>
- <#@ import namespace="System.Data.Linq.Mapping"#>
- <#@ import namespace="System.IO"#>
- <#@ import namespace="System.Linq"#>
- <#@ import namespace="System.Reflection"#>
- <#@ import namespace="System.Text"#>
- <#@ import namespace="System.Xml.Linq"#>
- <#@ import namespace="Microsoft.VisualStudio.TextTemplating"#>
- <#+
- // Manager class records the various blocks so it can split them up
- class Manager {
- private class Block {
- public String Name;
- public int Start, Length;
- }
- private Block currentBlock;
- private List<Block> files = new List<Block>();
- private Block footer = new Block();
- private Block header = new Block();
- private ITextTemplatingEngineHost host;
- private StringBuilder template;
- protected List<String> generatedFileNames = new List<String>();
- public static Manager Create(ITextTemplatingEngineHost host, StringBuilder template) {
- return (host is IServiceProvider) ? new VSManager(host, template) : new Manager(host, template);
- }
- public void StartNewFile(String name) {
- if (name == null)
- throw new ArgumentNullException("name");
- CurrentBlock = new Block { Name = name };
- }
- public void StartFooter() {
- CurrentBlock = footer;
- }
- public void StartHeader() {
- CurrentBlock = header;
- }
- public void EndBlock() {
- if (CurrentBlock == null)
- return;
- CurrentBlock.Length = template.Length - CurrentBlock.Start;
- if (CurrentBlock != header && CurrentBlock != footer)
- files.Add(CurrentBlock);
- currentBlock = null;
- }
- public virtual void Process(bool split) {
- if (split) {
- EndBlock();
- String headerText = template.ToString(header.Start, header.Length);
- String footerText = template.ToString(footer.Start, footer.Length);
- String outputPath = Path.GetDirectoryName(host.TemplateFile);
- files.Reverse();
- foreach(Block block in files) {
- String fileName = Path.Combine(outputPath, block.Name);
- String content = headerText + template.ToString(block.Start, block.Length) + footerText;
- generatedFileNames.Add(fileName);
- CreateFile(fileName, content);
- template.Remove(block.Start, block.Length);
- }
- }
- }
- protected virtual void CreateFile(String fileName, String content) {
- if (IsFileContentDifferent(fileName, content))
- File.WriteAllText(fileName, content);
- }
- public virtual String GetCustomToolNamespace(String fileName) {
- return null;
- }
- public virtual String DefaultProjectNamespace {
- get { return null; }
- }
- protected bool IsFileContentDifferent(String fileName, String newContent) {
- return !(File.Exists(fileName) && File.ReadAllText(fileName) == newContent);
- }
- private Manager(ITextTemplatingEngineHost host, StringBuilder template) {
- this.host = host;
- this.template = template;
- }
- private Block CurrentBlock {
- get { return currentBlock; }
- set {
- if (CurrentBlock != null)
- EndBlock();
- if (value != null)
- value.Start = template.Length;
- currentBlock = value;
- }
- }
- private class VSManager: Manager {
- private EnvDTE.ProjectItem templateProjectItem;
- private EnvDTE.DTE dte;
- private Action<String> checkOutAction;
- private Action<IEnumerable<String>> projectSyncAction;
- public override String DefaultProjectNamespace {
- get {
- return templateProjectItem.ContainingProject.Properties.Item("DefaultNamespace").Value.ToString();
- }
- }
- public override String GetCustomToolNamespace(string fileName) {
- return dte.Solution.FindProjectItem(fileName).Properties.Item("CustomToolNamespace").Value.ToString();
- }
- public override void Process(bool split) {
- if (templateProjectItem.ProjectItems == null)
- return;
- base.Process(split);
- projectSyncAction.EndInvoke(projectSyncAction.BeginInvoke(generatedFileNames, null, null));
- }
- protected override void CreateFile(String fileName, String content) {
- if (IsFileContentDifferent(fileName, content)) {
- CheckoutFileIfRequired(fileName);
- File.WriteAllText(fileName, content);
- }
- }
- internal VSManager(ITextTemplatingEngineHost host, StringBuilder template)
- : base(host, template) {
- var hostServiceProvider = (IServiceProvider) host;
- if (hostServiceProvider == null)
- throw new ArgumentNullException("Could not obtain IServiceProvider");
- dte = (EnvDTE.DTE) hostServiceProvider.GetService(typeof(EnvDTE.DTE));
- if (dte == null)
- throw new ArgumentNullException("Could not obtain DTE from host");
- templateProjectItem = dte.Solution.FindProjectItem(host.TemplateFile);
- checkOutAction = (String fileName) => dte.SourceControl.CheckOutItem(fileName);
- projectSyncAction = (IEnumerable<String> keepFileNames) => ProjectSync(templateProjectItem, keepFileNames);
- }
- private static void ProjectSync(EnvDTE.ProjectItem templateProjectItem, IEnumerable<String> keepFileNames) {
- var keepFileNameSet = new HashSet<String>(keepFileNames);
- var projectFiles = new Dictionary<String, EnvDTE.ProjectItem>();
- var originalFilePrefix = Path.GetFileNameWithoutExtension(templateProjectItem.get_FileNames()) + ".";
- foreach(EnvDTE.ProjectItem projectItem in templateProjectItem.ProjectItems)
- projectFiles.Add(projectItem.get_FileNames(), projectItem);
- // Remove unused items from the project
- foreach(var pair in projectFiles)
- if (!keepFileNames.Contains(pair.Key) && !(Path.GetFileNameWithoutExtension(pair.Key) + ".").StartsWith(originalFilePrefix))
- pair.Value.Delete();
- // Add missing files to the project
- foreach(String fileName in keepFileNameSet)
- if (!projectFiles.ContainsKey(fileName))
- templateProjectItem.ProjectItems.AddFromFile(fileName);
- }
- private void CheckoutFileIfRequired(String fileName) {
- var sc = dte.SourceControl;
- if (sc != null && sc.IsItemUnderSCC(fileName) && !sc.IsItemCheckedOut(fileName))
- checkOutAction.EndInvoke(checkOutAction.BeginInvoke(fileName, null, null));
- }
- }
- } #>
- DBHelper.ttinclude
<#+- public class DbHelper
- {
- #region GetDbTables
- public static List<DbTable> GetDbTables(string connectionString, string database, string tables = null)
- {
- if (!string.IsNullOrEmpty(tables))
- {
- tables = string.Format(" and obj.name in ('{0}')", tables.Replace(",", "','"));
- }
- #region SQL
- string sql = string.Format(@"SELECT
- obj.name tablename,
- schem.name schemname,
- idx.rows,
- CAST
- (
- CASE
- WHEN (SELECT COUNT(1) FROM sys.indexes WHERE object_id= obj.OBJECT_ID AND is_primary_key=1) >=1 THEN 1
- ELSE 0
- END
- AS BIT) HasPrimaryKey
- from {0}.sys.objects obj
- inner join {0}.dbo.sysindexes idx on obj.object_id=idx.id and idx.indid<=1
- INNER JOIN {0}.sys.schemas schem ON obj.schema_id=schem.schema_id
- where type='U' {1}
- order by obj.name", database, tables);
- #endregion
- DataTable dt = GetDataTable(connectionString, sql);
- return dt.Rows.Cast<DataRow>().Select(row => new DbTable
- {
- TableName = row.Field<string>("tablename"),
- SchemaName = row.Field<string>("schemname"),
- Rows = row.Field<int>("rows"),
- HasPrimaryKey = row.Field<bool>("HasPrimaryKey")
- }).ToList();
- }
- #endregion
- #region GetDbColumns
- public static List<DbColumn> GetDbColumns(string connectionString, string database, string tableName, string schema = "dbo")
- {
- #region SQL
- string sql = string.Format(@"
- WITH indexCTE AS
- (
- SELECT
- ic.column_id,
- ic.index_column_id,
- ic.object_id
- FROM {0}.sys.indexes idx
- INNER JOIN {0}.sys.index_columns ic ON idx.index_id = ic.index_id AND idx.object_id = ic.object_id
- WHERE idx.object_id =OBJECT_ID(@tableName) AND idx.is_primary_key=1
- )
- select
- colm.column_id ColumnID,
- CAST(CASE WHEN indexCTE.column_id IS NULL THEN 0 ELSE 1 END AS BIT) IsPrimaryKey,
- colm.name ColumnName,
- systype.name ColumnType,
- colm.is_identity IsIdentity,
- colm.is_nullable IsNullable,
- cast(colm.max_length as int) ByteLength,
- (
- case
- when systype.name='nvarchar' and colm.max_length>0 then colm.max_length/2
- when systype.name='nchar' and colm.max_length>0 then colm.max_length/2
- when systype.name='ntext' and colm.max_length>0 then colm.max_length/2
- else colm.max_length
- end
- ) CharLength,
- cast(colm.precision as int) Precision,
- cast(colm.scale as int) Scale,
- prop.value Remark
- from {0}.sys.columns colm
- inner join {0}.sys.types systype on colm.system_type_id=systype.system_type_id and colm.user_type_id=systype.user_type_id
- left join {0}.sys.extended_properties prop on colm.object_id=prop.major_id and colm.column_id=prop.minor_id
- LEFT JOIN indexCTE ON colm.column_id=indexCTE.column_id AND colm.object_id=indexCTE.object_id
- where colm.object_id=OBJECT_ID(@tableName)
- order by colm.column_id", database);
- #endregion
- SqlParameter param = new SqlParameter("@tableName", SqlDbType.NVarChar, ) { Value = string.Format("{0}.{1}.{2}", database, schema, tableName) };
- DataTable dt = GetDataTable(connectionString, sql, param);
- return dt.Rows.Cast<DataRow>().Select(row => new DbColumn()
- {
- ColumnID = row.Field<int>("ColumnID"),
- IsPrimaryKey = row.Field<bool>("IsPrimaryKey"),
- ColumnName = row.Field<string>("ColumnName"),
- ColumnType = row.Field<string>("ColumnType"),
- IsIdentity = row.Field<bool>("IsIdentity"),
- IsNullable = row.Field<bool>("IsNullable"),
- ByteLength = row.Field<int>("ByteLength"),
- CharLength = row.Field<int>("CharLength"),
- Scale = row.Field<int>("Scale"),
- Remark = row["Remark"].ToString()
- }).ToList();
- }
- #endregion
- #region GetDataTable
- public static DataTable GetDataTable(string connectionString, string commandText, params SqlParameter[] parms)
- {
- using (SqlConnection connection = new SqlConnection(connectionString))
- {
- SqlCommand command = connection.CreateCommand();
- command.CommandText = commandText;
- command.Parameters.AddRange(parms);
- SqlDataAdapter adapter = new SqlDataAdapter(command);
- DataTable dt = new DataTable();
- adapter.Fill(dt);
- return dt;
- }
- }
- #endregion
- }
- #region DbTable
- /// <summary>
- /// 表结构
- /// </summary>
- public sealed class DbTable
- {
- /// <summary>
- /// 表名称
- /// </summary>
- public string TableName { get; set; }
- /// <summary>
- /// 表的架构
- /// </summary>
- public string SchemaName { get; set; }
- /// <summary>
- /// 表的记录数
- /// </summary>
- public int Rows { get; set; }
- /// <summary>
- /// 是否含有主键
- /// </summary>
- public bool HasPrimaryKey { get; set; }
- }
- #endregion
- #region DbColumn
- /// <summary>
- /// 表字段结构
- /// </summary>
- public sealed class DbColumn
- {
- /// <summary>
- /// 字段ID
- /// </summary>
- public int ColumnID { get; set; }
- /// <summary>
- /// 是否主键
- /// </summary>
- public bool IsPrimaryKey { get; set; }
- /// <summary>
- /// 字段名称
- /// </summary>
- public string ColumnName { get; set; }
- /// <summary>
- /// 字段类型
- /// </summary>
- public string ColumnType { get; set; }
- /// <summary>
- /// 数据库类型对应的C#类型
- /// </summary>
- public string CSharpType
- {
- get
- {
- return SqlServerDbTypeMap.MapCsharpType(ColumnType);
- }
- }
- /// <summary>
- ///
- /// </summary>
- public Type CommonType
- {
- get
- {
- return SqlServerDbTypeMap.MapCommonType(ColumnType);
- }
- }
- /// <summary>
- /// 字节长度
- /// </summary>
- public int ByteLength { get; set; }
- /// <summary>
- /// 字符长度
- /// </summary>
- public int CharLength { get; set; }
- /// <summary>
- /// 小数位
- /// </summary>
- public int Scale { get; set; }
- /// <summary>
- /// 是否自增列
- /// </summary>
- public bool IsIdentity { get; set; }
- /// <summary>
- /// 是否允许空
- /// </summary>
- public bool IsNullable { get; set; }
- /// <summary>
- /// 描述
- /// </summary>
- public string Remark { get; set; }
- }
- #endregion
- #region SqlServerDbTypeMap
- public class SqlServerDbTypeMap
- {
- public static string MapCsharpType(string dbtype)
- {
- if (string.IsNullOrEmpty(dbtype)) return dbtype;
- dbtype = dbtype.ToLower();
- string csharpType = "object";
- switch (dbtype)
- {
- case "bigint": csharpType = "long"; break;
- case "binary": csharpType = "byte[]"; break;
- case "bit": csharpType = "bool"; break;
- case "char": csharpType = "string"; break;
- case "date": csharpType = "DateTime"; break;
- case "datetime": csharpType = "DateTime"; break;
- case "datetime2": csharpType = "DateTime"; break;
- case "datetimeoffset": csharpType = "DateTimeOffset"; break;
- case "decimal": csharpType = "decimal"; break;
- case "float": csharpType = "double"; break;
- case "image": csharpType = "byte[]"; break;
- case "int": csharpType = "int"; break;
- case "money": csharpType = "decimal"; break;
- case "nchar": csharpType = "string"; break;
- case "ntext": csharpType = "string"; break;
- case "numeric": csharpType = "decimal"; break;
- case "nvarchar": csharpType = "string"; break;
- case "real": csharpType = "Single"; break;
- case "smalldatetime": csharpType = "DateTime"; break;
- case "smallint": csharpType = "short"; break;
- case "smallmoney": csharpType = "decimal"; break;
- case "sql_variant": csharpType = "object"; break;
- case "sysname": csharpType = "object"; break;
- case "text": csharpType = "string"; break;
- case "time": csharpType = "TimeSpan"; break;
- case "timestamp": csharpType = "byte[]"; break;
- case "tinyint": csharpType = "byte"; break;
- case "uniqueidentifier": csharpType = "Guid"; break;
- case "varbinary": csharpType = "byte[]"; break;
- case "varchar": csharpType = "string"; break;
- case "xml": csharpType = "string"; break;
- default: csharpType = "object"; break;
- }
- return csharpType;
- }
- public static Type MapCommonType(string dbtype)
- {
- if (string.IsNullOrEmpty(dbtype)) return Type.Missing.GetType();
- dbtype = dbtype.ToLower();
- Type commonType = typeof(object);
- switch (dbtype)
- {
- case "bigint": commonType = typeof(long); break;
- case "binary": commonType = typeof(byte[]); break;
- case "bit": commonType = typeof(bool); break;
- case "char": commonType = typeof(string); break;
- case "date": commonType = typeof(DateTime); break;
- case "datetime": commonType = typeof(DateTime); break;
- case "datetime2": commonType = typeof(DateTime); break;
- case "datetimeoffset": commonType = typeof(DateTimeOffset); break;
- case "decimal": commonType = typeof(decimal); break;
- case "float": commonType = typeof(double); break;
- case "image": commonType = typeof(byte[]); break;
- case "int": commonType = typeof(int); break;
- case "money": commonType = typeof(decimal); break;
- case "nchar": commonType = typeof(string); break;
- case "ntext": commonType = typeof(string); break;
- case "numeric": commonType = typeof(decimal); break;
- case "nvarchar": commonType = typeof(string); break;
- case "real": commonType = typeof(Single); break;
- case "smalldatetime": commonType = typeof(DateTime); break;
- case "smallint": commonType = typeof(short); break;
- case "smallmoney": commonType = typeof(decimal); break;
- case "sql_variant": commonType = typeof(object); break;
- case "sysname": commonType = typeof(object); break;
- case "text": commonType = typeof(string); break;
- case "time": commonType = typeof(TimeSpan); break;
- case "timestamp": commonType = typeof(byte[]); break;
- case "tinyint": commonType = typeof(byte); break;
- case "uniqueidentifier": commonType = typeof(Guid); break;
- case "varbinary": commonType = typeof(byte[]); break;
- case "varchar": commonType = typeof(string); break;
- case "xml": commonType = typeof(string); break;
- default: commonType = typeof(object); break;
- }
- return commonType;
- }
- }
- #endregion
- #>
使用类,如果出现重复引用的,那就删掉重复的
- TextTemplate1.tt
- <#@ template debug="false" hostspecific="true" language="C#" #>
- <#@ assembly name="System.Configuration.dll" #>
- <#@ import namespace="System.Text" #>
- <#@ assembly name="System.Data.dll" #>
- <#@ assembly name="System.Data.DataSetExtensions.dll" #>
- <#@ import namespace="System" #>
- <#@ import namespace="System.Xml" #>
- <#@ import namespace="System.Linq" #>
- <#@ import namespace="System.Data" #>
- <#@ import namespace="System.Data.SqlClient" #>
- <#@ import namespace="System.Collections.Generic" #>
- <#@ import namespace="System.IO" #>
- <#@ assembly name="System.Core"#>
- <#@ assembly name="System.Data.Linq"#>
- <#@ assembly name="EnvDTE"#>
- <#@ assembly name="System.Xml"#>
- <#@ assembly name="System.Xml.Linq"#>
- <#@ import namespace="System"#>
- <#@ import namespace="System.CodeDom"#>
- <#@ import namespace="System.CodeDom.Compiler"#>
- <#@ import namespace="System.Collections.Generic"#>
- <#@ import namespace="System.Data.Linq"#>
- <#@ import namespace="System.Data.Linq.Mapping"#>
- <#@ import namespace="System.IO"#>
- <#@ import namespace="System.Linq"#>
- <#@ import namespace="System.Reflection"#>
- <#@ import namespace="System.Text"#>
- <#@ import namespace="System.Xml.Linq"#>
- <#@ import namespace="Microsoft.VisualStudio.TextTemplating"#>
- <#@ output extension=".txt" encoding="utf-8" #>
- <#@ include file="$(ProjectDir)Comm\Manger.ttinclude" #>
- <#@ include file="$(ProjectDir)Comm\DbHelper.ttinclude" #>
- <#
- for (int i = ; i < ; i++)
- {
- Write(i.ToString());
- #>
- i.ToString()<#= i+ #>
- <#
- }
- #>
MVC ---- T4模板的小练习的更多相关文章
- T4 模板 : 一种提升ASP.NET MVC开发速度方法
最近由于需要在框架中提供一些自定义模板的功能,找到了一篇博客,可惜似乎是翻译工具直接翻的,读不通顺,就试着自己翻译下,我不会完全翻译原文的句子,可能会对原文进行小范围的我认为更合适的句子并添加些注释, ...
- ASP.NET MVC+EF框架+EasyUI实现权限管理系列(12)-实现用户异步登录和T4模板
原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(12)-实现用户异步登录和T4模板 ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇) (1):框架搭建 ...
- MVC实用架构设计(三)——EF-Code First(3):使用T4模板生成相似代码
前言 经过前面EF的<第一篇>与<第二篇>,我们的数据层功能已经较为完善了,但有不少代码相似度较高,比如负责实体映射的 EntityConfiguration,负责仓储操作的I ...
- 快速开发框架,及库存管理系统,基于easyui框架和C#语言MVC、EntityFrameWork、T4模板技术。
快速开发框架,及库存管理系统,基于easyui框架和C#语言MVC.EntityFrameWork.T4模板技术. 产品界面如下图所示: 源码结构: 开放全部源码,如有需要请联系,QQ:1107141 ...
- [转]MVC实用架构设计(三)——EF-Code First(3):使用T4模板生成相似代码
本文转自:http://www.cnblogs.com/guomingfeng/p/mvc-ef-t4.html 〇.目录 一.前言 二.工具准备 三.T4代码生成预热 (一) 单文件生成:Hello ...
- 23、ASP.NET MVC入门到精通——业务层和数据层父类及接口-T4模板
本系列目录:ASP.NET MVC4入门到精通系列目录汇总 在上一篇中,我们已经把项目的基本框架搭起来了,这一篇我们就来实现业务层和数据层的父接口及父类. 1.我们先来定义一个业务层父接口IBaseB ...
- asp.net mvc 通过T4模板生成框架
http://www.cnblogs.com/rdst/archive/2012/08/13/2637210.html http://www.kuqin.com/shuoit/20140716/341 ...
- MVC 之 T4模板简介
个人网站地址:nee32.com 一.T4模板内容简介 为了更好地学习T4模板,我们安装一个插件tangible T4 Editor 在使用了EF生成实体类后,我们会发现一个.tt后缀的文件,它就是T ...
- Asp.net MVC企业级开发(09)---T4模板
T4即为Text Template Transformation Toolkit,一种可以由自己去自定义规则的代码生成器.根据业务模型可生成任何形式的文本文件或供程序调用的字符串 在VS中T4模板是没 ...
随机推荐
- 【剑指offer】旋转数组的最小数字
一.题目: 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素. 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个 ...
- 万恶之源 - Python基础数据类型一
整数 整数在Python中的关键字用int来表示; 整型在计算机中运于计算和比较 在32位机器上int的范围是: -2**31-2**31-1,即-2147483648-2147483647 在64 ...
- 5分钟带你入门vuex(vue状态管理)
如果你之前使用过vue.js,你一定知道在vue中各个组件之间传值的痛苦,在vue中我们可以使用vuex来保存我们需要管理的状态值,值一旦被修改,所有引用该值的地方就会自动更新,那么接下来我们就来学习 ...
- 优化Ubuntu 16.04系统的几件事
安装完Ubuntu 16.04后,要更换为国内的软件源: sudo gedit /etc/apt/sources.list #用文本编辑器打开源列表 在文件开头添加下面的阿里云的软件源: deb ht ...
- Mybatis的多对多映射
一.Mybatis的多对多映射 本例讲述使用mybatis开发过程中常见的多对多映射查询案例.只抽取关键代码和mapper文件中的关键sql和配置,详细的工程搭建和Mybatis详细的流程代码可参见& ...
- java map.entry
我希望要一个ArrayList<Entry>,类似C++中的pair, 但是Map.Entry是个接口,不能实例化,可以像下面这样写 HashMap<Integer, Integer ...
- C#导出Excel总结
一.asp.net中导出Execl的方法:在asp.net中导出Execl有两种方法,一种是将导出的文件存放在服务器某个文件夹下面,然后将文件地址输出在浏览器上:一种是将文件直接将文件输出流写给浏览器 ...
- hihocoder博弈游戏·Nim游戏·三
在这一次游戏中Alice和Bob决定在原来的Nim游戏上增加一条规则:每一次行动时,不仅可以选择一堆取走任意数量的石子(至少取1颗,至多取出这一堆剩下的所有石子),还可以选择将一堆石子分成两堆石子,但 ...
- 【kafka学习之三】kafka集群运维
kafka集群维护一.kafka集群启停#启动kafka/home/cluster/kafka211/bin/kafka-server-start.sh -daemon /home/cluster/k ...
- C/C++之Memcpy and memmove
memcpy与memmove的目的都是将N个字节的源内存地址的内容拷贝到目标内存地址中. 但当源内存和目标内存存在重叠时,memcpy会出现错误,而memmove能正确地实施拷贝,但这也增加了一点点开 ...