t4模板中获取当前项目或解决方案路径_第1页
t4模板中获取当前项目或解决方案路径_第2页
t4模板中获取当前项目或解决方案路径_第3页
t4模板中获取当前项目或解决方案路径_第4页
t4模板中获取当前项目或解决方案路径_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

t4 模板中获取当前项目或解决方案路径篇一:使用 T4 模板批量生成代码使用 T4 模板批量生成代码 什么是 T4T4(Text Template Transformation Toolkit)是微软官方在VisualStudio XX 中开始使用的代码生成引擎。在 Visual Studio 中, “T4 文本模板”是由一些文本块和控制逻辑组成的混合模板,它可以生成文本文件。 在 Visual C# 或 Visual Basic 中,控制逻辑编写为程序代码的片段。生成的文件可以是任何类型的文本,例如网页、资源文件或任何语言的程序源代码。现在的 VS 中只要与代码生成相关的场景基本上都能找 T4 的身影,比如 MVC 的视图模板,Entity Framwork 的 DataContext 模板等等。 什么是MultipleOutputHelper 标准的 T4 模板语法每个 tt 文件生成的类代码在同一文件,如果类很多,查看类代码就不方便了,MultipleOutputHelper 是一个改进的 tt 文件代码,可用MultipleOutputHelper 构建出输出多文件的 T4 解决方案,可在搜索引擎中搜索 “”获取代码。 复制文件 获取到代码将其保存为,将 复制到项目文件夹下,如项目文件夹下的WebApplication7 目录下,并包含到项目中。 包含文件 新建文本模板,并包含文件: 同时设置 hostspecific=“true“: 初始化 初始化 Manager 对象: 页眉 使用 StartHeader (位于之前)可这是生成文件页眉。 / Header1 定义输出文件 使用代码标识区分生成的代码块的范围,可重复多个。(tb_name+“.cs“); /代码块 (); 示例代码: using System; using ; using ; using ; namespace WebApplication7 public class Class1 public int MyProperty get; set; 页脚 使用 StartFooter (位于之后)可这是生成文件页脚。 / Footer1 编译执行 使用 Process 方法,进行文件分割: 生成文件截图 完整代码 以下是文件的完整代码: / Header1 using System; using ; using ; using ; namespace WebApplication7 public class Class1 public int MyProperty get; set; / Footer2 / Header1 using System; using ; using ; using ; namespace WebApplication7 public class Class2 public int MyProperty get; set; / Footer2 生成文件代码 以下是生成的文件完整代码: / Header1 using System; using ; using ; using ; namespace WebApplication7 publicclassClass1 publicint MyProperty get; set; / Footer2 篇二:T4 模板根据 DB 生成实体类T4 模板根据 DB 生成实体类 阅读目录 1.前言 2.原理 1.前言 为什么会有这篇文章了,最近看到了一些框架,里面要写的代码太多了,故此就想偷懒,要 是能写出一个 T4 模板,在数据库添加表后,根据模板就可以自动生成了类文件了,这样多 好,心动不如行动。记得使用 T4 模板还是 2 年前,那个时候听波波老师讲课做我们的最后 一个大项目 CRM,简简单单的写了一下模板,保存一下,所有的类文件就出来了,当时那个 膜拜,油然而生。 同时在工作中,我们公司自己开发的一个 ORM,实体类都要自己写,一个数据库表的字段 太多,写的真是手抽筋。如果你对 T4 基础语法不是很了解,可以参考我前面写的一篇文章 T4 语法快速入门。 回到顶部 2.原理 我们要做的事情是通过数据库表生成实体类。 第一步 我们要查询出当前用户下的所有数据库表。 第二步 查询出数据库表的结构,比如字段的名称,字段的类型,字段的长度大小,是否为 空等等。 工作中 oracle 用的比较多,在这里我就分析 oracle和 mssql 回到顶部 查询当前用户所有的表。 SELECT TABLE_NAME FROM USER_TABLES; 根据表名查询表结构数据 复制代码 SELECT _name 字段名, _type 数据类型, _length 长度, _precision 整数位, _Scale 小数位, 允许空值, _default 缺省值, 备注, _NAME 表名 FROM user_tab_columns A, user_col_comments B WHERE _NAME = _name AND _Name = _Name AND _Name = AFFIXINFO 复制代码 来源与网上,作用是生成一个一个单独的类文件,即文件。复制代码 (); # ModelManager manager = new ModelManager(); List list=(); # foreach (var item in list) string tableName=item; DataTable table= (tableName); # (tableName+“.cs“); # using System; using ; using ; namespace Model / / 数据表实体类: / Serializable() public class foreach(DataRow row in ) # / / / public “# get; set; # # public class ModelManager / / 数据库连接字符串 / private const string CONNECTION_STRING = “Data Source=orcl;Persist Security Info=True;User ID=jjmis;Password=jjmis;Unicode=True“; / / 用户信息表名 / private const string PERSONINFO_TABLE_NAME = “USERINFO“; / / 根据表名查询表结构信息 / private const string SELECT_SCHEMA_BY_TABLE_NAME = “SELECT _name 字段名, _type 数据类型, _length 长度, _precision 整数位, _Scale 小数位,允许空值, _default 缺省值, 备注, _NAME 表名 user_tab_columns A, user_col_comments B _NAME = _name _Name = _Name _Name = 0“; / / 获得数据连接 / / private OracleConnection GetConnection() return new OracleConnection(CONNECTION_STRING); / / 得到当前用户的所有表名 / / public List GetTableList() string sql = “SELECT * FROM USER_TABLES“; DataTable dt = (sql); List list = new List(); if (dt!=null i (i“TABLE_NAME“.ToString(); return list; FROM WHERE AND AND / / 释放连接 / / private void ReleaseConnection(OracleConnection con) if (con != null) if ( = ) (); public DataTable GetTableSchema(string tableName) DataTable dt; using (OracleConnection con = GetConnection() (); OracleCommand cmd = (); (SELECT_SCHEMA_BY_TABLE_NAME,tableName); = ; OracleDataAdapter adapter = new OracleDataAdapter(cmd); DataSet ds = new DataSet(); (ds); dt = 0; return dt; / / SQL不完善,需要的自己改造 / / / public string TransFromSqlType(string type) if (type) = 篇三:Visual Studio 下的代码生成-T4 模板使用说明Visual Studio 下的代码生成: T4 模板使用说明 在基于 T4 的代码生成方式中,我对 T4 模板的组成结构、语法,以及 T4 引擎的工作原理进行了大体的介绍,并且编写了一个 T4 模板实现了如何将一个 XML 转变成 C#代码。为了让由此需求的读者对 T4 有更深的了解,我(转 载 于: 小 龙文 档 网:t4 模板中获取当前项目或解决方案路径)们通过 T4 来做一些更加实际的事情SQL Generator。在这里,我们可以通过 SQL Generator 为某个数据表自动生成进行插入、修改和删除的存储过程。文中源代码从这里下载 一、代码生成器的最终使用效果 我们首先来看看通过直接适用我们基于 T4 的 SQL 生成模板达到的效果。右图(点击看大图)是 VSXX 的Solution Explorer,在 Script 目录下面,我定义了三个后缀名为.tt 的 T4 模板。它们实际上是基于同一个数据表(T_PRODUCT)的三个存储过程的生成创建的模板文件,其中 P_PRODUCT_、P_PRODUCT_和 P_PRODUCT_分别用于记录的删除、插入和修改。自动生成的扩展名为.sql 的同名附属文件就是相应的存储过程。 基于三种不同的数据操作(Insert、Update 和Delete) ,我创建了 3 个重用的、与具体数据表无关的模板: InsertProcedureTemplate、UpdateProcedureTemplate 和DeleteProcedureTemplate。这样做的目的为为了实现最大的重用,如果我们需要为某个数据表创建相应的存储过程的时候,我们可以直接使用它们传入相应的数据表名就可以了。实际上,P_PRODUCT_、P_PRODUCT_和 P_PRODUCT_这三个 T4 模板的结构很简单,它们通过指令将定义着相应ProcedureTemplate 的 T4 模板文件包含进来。最 终的存储过程脚本通过调用 ProcudureTempalte 的Render 方法生成。其中构造函数的参数表示的分别是连接字符串名称(在配置文件中定义)和数据表的名称。new DeleteProcedureTemplate(“TestDb“,“T_PRODUCT“).Render(); # new InsertProcedureTemplate(“TestDb“,“T_PRODUCT“).Render(); # new UpdateProcedureTemplate(“TestDb“,“T_PRODUCT“).Render(); # 二、安装 T4 工具箱(ToolBox)和编辑器 VS 本身只提供一套基于 T4 引擎的代码生成的执行环境,为了利于你的编程你可以安装一些辅助性的东西。T4 ToolBox 是一个 CodePlex 上开源的工具,它包含一些可以直接使用的代码生成器,比如 Enum SQL View、AzMan wrapper、LINQ to SQL classes、LINQ to SQL schema 和Entity Framework DAL 等。T4 ToolBox 还提供一些基于 T4方面的 VS 的扩展。当你按照之后,在“Add New Item”对话框中就会多出一个命名为“Code Generation”的类别,其中包括若干文件模板。下面提供的 T4 模板的编辑工作依赖于这个工具。 为了提高编程体验,比如智 能感知以及代码配色,我们还可以安装一些第三方的T4 编辑器。我使用的是一个叫做 Oleg Sych 的 T4 Editor。它具有免费版本和需要付费的专业版本,当然我使用的免费的那款。成功按装了,它也会在 Add New Item”对话框中提供相应的基于 T4 的文件模板。 三、创建数据表 T4 模板就是输入和输出的一个适配器,这与 XSLT 的作用比较类似。对于我们将要实现的 SQL Generator 来说,输入的是数据表的结构(Schema)输出的是最终生成的存储过程的 SQL 脚本。对于数据表的定义,不同的项目具有不同标准。我采用的是我们自己的数据库标准定义的数据表:T_PRODUCT(表示产品信息) ,下面是创建表的脚本。 CREATE TABLE dbo.T_PRODUCT( ID VARCHAR(50) NOT NULL, NAME NVARCHAR NOT NULL, PRICE float NOT NULL, TOTAL_PRICE FLOAT NOT NULL, DESC NVARCHAR NULL, CREATED_BY VARCHAR(50) NULL, CREATED_ON DATETIME NULL, LAST_UPDATED_BYVARCHAR(50) NULL, LAST_UPDATED_ONDATETIME NULL, VERSION_NO TIMESTAMP NULL, TRANSACTION_ID VARCHAR(50) NULL, CONSTRAINT PK_T_PRODUCT PRIMARY KEY CLUSTERED( ID ASC)ON PRIMARY) 每一个表中有 6 个公共的字段:CREATED_BY、CREATED_ON、LAST_UPDATED_BY、LAST_UPDATED_ON、VERSION_NO 和 TRANSACTION_ID 分别表示记录的创建者、创建时间、最新更新者、最新更新时间、版本号(并发控制)和事务 ID。四、创建抽象的模板:ProcedureTemplate 我们需要为三不同的数据操作得存储过程定义不同的模板,但是对于这三种存储过程的 SQL 结构都是一样的,基本结果可以通过下面的 SQL 脚本表示。 IF OBJECT_ID( , P ) IS NOT NULL DROP PROCEDURE GO CREATE PROCEDURE ( ) AS GO 为此我定义了一个抽象的模板:ProcedureTemplate。为了表示 CUD 三种不同的操作,我通过 T4 模板的“类特性块” (Class Feature Block)定义了如下一个 OperationKind 的枚举。 public enum OperationKind Insert, Update, Delete # 然后下面就是整个 ProcedureTemplate 的定义了。ProcedureTemplate 直接继承自(来源于 T4 ToolBox,它继承自 TextTransformation) 。ProcedureTemplate 通过SMO(SQL Server Management Object)获取数据表的结构(Schema)信息,所以我们需要应用 SMO 相关的程序集和导入相关命名空间。 ProcedureTemplate 具有三个属性 DatabaseName(表示连接字符串名称) 、Table(SMO 中表示数据表)和OperationKind(表示具体的 CUD 操作的一种) ,它们均通过构造函数初始化。public abstract class ProcedureTemplate : Template public s

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论