问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

创建代码生成器可能非常简单如何通过T4模板生成下一部分代码

发布网友 发布时间:2024-08-20 10:24

我来回答

1个回答

热心网友 时间:2024-08-28 20:36

关于创建代码生成器可能非常简单如何通过T4模板生成下一部分代码?这个很多人还不知道,今天来为大家解答以上的问题,现在让我们一起来看看吧!
1、在《上篇》中我们通过T4模板为我们指定的数据表成功生成了我们需要的用于添加、修改和删除操作的存储过程。
2、但是这是一种基于单个文件的解决方案,即我们必须为每一个生成的存储过程建立一个模板。
3、如果我们提供一种基于多文件的代码生成方式,将会为编程人员带来极大的便利。
4、借助于T4 ToolBox这个开源工具箱,多文件的SQL Generator的实现变得异常简单。
5、[文中的例子可以从这里下载]目录二、创建自定义的Generator三、ProcedureGenerator如何被使用?一、多文件代码生成器会带来多大的便利?我们先来直观的感受一下较之《上篇》提供的单一文件的代码生成器,基于多文件的代码生成解决方案会为开发人员带来多大的便利。
6、 同样对于《上篇》创建的数据表T_PRODUCT,之前我们为了生成三个不同的存储过程,我们不得已需要创建3个不同的T4模板文件。
7、实际上我们更需要的方式只需要创建一个T4模板,让我们的SQL Generator自动为我们生成3个包含相应存储过程的.sql附属文件,如左图所示(点击看大图)。
8、有的时候,基于单个数据表的存储过程生成方式我们依然觉得不方便。
9、如果我们能够在T4模板文件中指定的数据表的列表,让我们的SQL Generator为列表的每一个数据表都生成CUD三个存储过程,这样的方式更加具有吸引力。
10、如右图所示(点击看大图),一个订单模块包含两个具有主子关系的两张表(T_ORDER和T_ORDER_DETAIL),现在我们在一个T4模板中指定这两个表明,通过SQL Generator可以帮助我们生成6个包含存储过程的.sql附属文件。
11、甚至有的时候我们连数据表列表都无需指定,让SQL Generator为所有的表都生成相应的存储过程。
12、我的例子中没有提供这样的功能,但是实现自来不会存在任何问题。
13、二、创建自定义的Generator在《上篇》中我创建了一个抽象的ProcedureTemplate类,以及三个基于生成CUD存储过程的具体ProcedureTemplate:InsertProcedureTemplate、UpdateProcedureTemplate和DeleteProcedureTemplate。
14、它们都将直接服务于我们今天将要提供的基于多文件的SQL Generator。
15、在《上篇》中,这四个Template分别定义在4个不同的TT文件中,3个具体的ProcedureTemplate通过指令将抽象ProcedureTemplate模板文件包含过来。
16、由于我们将要创建的T4模板将会使用到这四个类,如果我们用四个指令将四个TT文件包含过来,由于T4引擎将会导致对ProcedureTemplate的4次包含,最好将会导致变异问题。
17、个人觉得这应该算是T4引擎解析包含关系的一个局限性,为了解决这个问题我们不得不抽象的ProcedureTemplate和三个具体的ProcedureTemplate都合并成一个TT文件。
18、T4 ToolBox为类库中为了提供了一个抽象的T4Toolbox.Generator类用于实现多文件的代码生成。
19、为此我们创建一个TT模板文件,定义了如下一个继承自该类的ProcedureGenerator。
20、ProcedureGenerator的核心是通过属性Templates定义的类型为IEnumerable的ProcedureTemplate列表,这个列表在存储过程中进行初始化。
21、而对于ProcedureGenerator的构造函数,处理定义了一个表示数据库连接字符串的databaseName的参数外,并以数组参数的形式指定了生成的存储过程基于的数据表名的列表。
22、<#+publicclass ProcedureGenerator : Generator{public IEnumerable Templates{get; private set;}public ProcedureGenerator(string databaseName, paramsstring[] tableNames) {if(null == tableNames || tableNames.Length == 0) {thrownew ArgumentNullException("tableNames"); } this.Templates = InitlizeTemplates(databaseName,tableNames); }private IEnumerable InitlizeTemplates(string databaseName, string[] tableNames) { foreach(string tableName in tableNames) {yieldreturnnew InsertProcedureTemplate(databaseName, tableName);yieldreturnnew UpdateProcedureTemplate(databaseName, tableName);yieldreturnnew DeleteProcedureTemplate(databaseName, tableName); } }protectedoverridevoid RunCore() {foreach(ProcedureTemplate tempalte inthis.Templates) { tempalte.RenderToFile(tempalte.GetProcedureName() + ".sql"); } }}#>真正的存储过程的T-SQL脚本实现在重写的RunCore中。
23、由于具体的文本转化逻辑都定义在了ProcedureTemplate中了,所以在这里我们需要遍历的ProcedureTemplate集合中每一个Template对象,调用RenderToFile方法将相应的存储过程的脚本写入以存储过程命名同名的.sql文件中。
24、三、ProcedureGenerator如何被使用?我们最后来看看我们创建的ProcedureGenerator最终如何被应用于具体的代码生成。
25、其实很简单,我们只需要创建相应的模板文件,通过将定义ProcedureGenerator类的TT文件包含近来,最后以代码语句调用块()的形式实力化该对象,并调用Run方法即可。
26、在构造函数中指定数据库连接字符串的名称和数据表名的列表。
27、下面是基于但表的T4模板。
28、下面是基于多表的T4模板:当你代码生成工作执行之后,会多出一个与TT文件同名的附属文件,你需要手工删除掉它。
29、从数据到代码--通过代码生成机制实现强类型编程[上篇]从数据到代码--通过代码生成机制实现强类型编程[下篇]从数据到代码--基于T4的代码生成方式创建代码生成器可以很简单:如何通过T4模板生成代码?[上篇]。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
修复征信是不是真的? 市面上征信修复公司可靠吗? 征信修复公司是真是假,真的可以修复吗? Emulex FC HBA卡 皮肤毛囊炎怎样治 银行自动扣款什么原因 银行什么情况自动扣款 贷款自动扣款什么意思 粤省事办理准生证需要多久 粤省事办理准生证步骤 为什么于嘉说山猫队和网队的比赛,少了易建联山猫进攻都没那么流畅了... 手机9:16照片尺寸像素是多少? 暑假适合去北京旅游吗 暑假去北京玩合适吗 手机照片的尺寸是多少? 淘宝全屏海报代码生成器V10免费绿色版淘宝全屏海报代码生成器V10... 快趣吧淘宝CSS装修代码生成器V11115绿色版快趣吧淘宝CSS装修代码生成器V... 什么是Twitter的代码生成器? 动软代码生成器简介 C# 9 新功能“源代码生成器”,你用了吗? 风越代码生成器功能 古代青色的雅称有哪些 青色在古代的雅称 古代青色的雅称有哪些 如何从走路的姿态看出一个人的性格? 体相图解 走路姿势看性格? 化学可逆符号怎么用电脑打? 结构松散的翡翠 怎样识别手机照片是不是原图? 爱情恰恰歌曲歌词 晚期产后出血怎么办 产检中发现的常见问题之说明 ...道一堂膏方催医生我吃了你的膏方血压升高、尿蛋白增高、血糖升高、还... 中医论“精” 南通活性炭 女方阳历1986年5月14日 男方阳历1988年8月26日 我们2011年结婚 2月3... 个人怎么申请工伤认定,需要哪些材料 工伤个人如何申请 宝宝支气管炎多久能好 工伤认定单位是个人名义怎么申请? 工伤认定申请表在哪里拿? 支气管炎咳嗽多久才能好 支气管炎咳嗽多久能好 尿蛋白质1+是肾病吗 血压低会头疼说明什么 尿蛋白一个加号要紧吗 玉翁种子发芽之后怎么种 低血压头疼怎么回事 尿蛋白质﹢是肾病吗 血压低会不会引起头疼 尿蛋白一个加号正常吗 天产[tiān chǎn]什么意思?近义词和反义词是什么?英文翻译是什么?