1. 创建代码生成器可以很简单:如何通过T4模板生成代码[下篇]
但是这是一种基于单个文件的解决方案,即我们必须为每一个生成的存储过程建立一个模板。如果我们提供一种基于多文件的代码生成方式,将会为编程人员带来极大的便利。借助于T4 ToolBox这个开源工具箱,多文件的SQL Generator的实现变得异常简单。[文中的例子可以从这里下载]目录 二、创建自定义的Generator 三、ProcereGenerator如何被使用?一、多文件代码生成器会带来多大的便利?我们先来直观的感受一下较之《上篇》提供的单一文件的代码生成器,基于多文件的代码生成解决方案会为开发人员带来多大的便利。 同样对于《上篇》创建的数据表T_PRODUCT,之前我们为了生成三个不同的存储过程,我们不得已需要创建3个不同的T4模板文件。实际上我们更需要的方式只需要创建一个T4模板,让我们的SQL Generator自动为我们生成3个包含相应存储过程的.sql附属文件,如左图所示(点击看大图)。有的时候,基于单个数据表的存储过程生成方式我们依然觉得不方便。如果我们能够在T4模板文件中指定的数据表的列表,让我们的SQL Generator为列表的每一个数据表都生成CUD三个存储过程,这样的方式更加具有吸引力。如右图所示(点击看大图),一个订单模块包含两个具有主子关系的两张表(T_ORDER和T_ORDER_DETAIL),现在我们在一个T4模板中指定这两个表明,通过SQL Generator可以帮助我们生成6个包含存储过程的.sql附属文件。甚至有的时候我们连数据表列表都无需指定,让SQL Generator为所有的表都生成相应的存储过程。我的例子中没有提供这样的功能,但是实现自来不会存在任何问题。二、创建自定义的Generator在《上篇》中我创建了一个抽象的ProcereTemplate类,以及三个基于生成CUD存储过程的具体ProcereTemplate:InsertProcereTemplate、UpdateProcereTemplate和DeleteProcereTemplate。它们都将直接服务于我们今天将要提供的基于多文件的SQL Generator。在《上篇》中,这四个Template分别定义在4个不同的TT文件中,3个具体的ProcereTemplate通过<#@include>指令将抽象ProcereTemplate模板文件包含过来。由于我们将要创建的T4模板将会使用到这四个类,如果我们用四个<#@include>指令将四个TT文件包含过来,由于T4引擎将会导致对ProcereTemplate的4次包含,最好将会导致变异问题。个人觉得这应该算是T4引擎解析包含关系的一个局限性,为了解决这个问题我们不得不抽象的ProcereTemplate和三个具体的ProcereTemplate都合并成一个TT文件。T4 ToolBox为类库中为了提供了一个抽象的T4Toolbox.Generator类用于实现多文件的代码生成。为此我们创建一个TT模板文件,定义了如下一个继承自该类的ProcereGenerator。ProcereGenerator的核心是通过属性Templates定义的类型为IEnumerable<ProcereTemplate>的ProcereTemplate列表,这个列表在存储过程中进行初始化。而对于ProcereGenerator的构造函数,处理定义了一个表示数据库连接字符串的databaseName的参数外,并以数组参数的形式指定了生成的存储过程基于的数据表名的列表。<#@ import namespace="System.Collections.Generic" #><#@ include file="ProcereTemplate.tt" #><#@ include file="T4Toolbox.tt" #><#+publicclass ProcereGenerator : Generator{public IEnumerable<ProcereTemplate> Templates{get; private set;}public ProcereGenerator(string databaseName, paramsstring[] tableNames) {if(null == tableNames || tableNames.Length == 0) {thrownew ArgumentNullException("tableNames"); } this.Templates = InitlizeTemplates(databaseName,tableNames); }private IEnumerable<ProcereTemplate> InitlizeTemplates(string databaseName, string[] tableNames) { foreach(string tableName in tableNames) {yieldreturnnew InsertProcereTemplate(databaseName, tableName);yieldreturnnew UpdateProcereTemplate(databaseName, tableName);yieldreturnnew DeleteProcereTemplate(databaseName, tableName); } }protectedoverridevoid RunCore() {foreach(ProcereTemplate tempalte inthis.Templates) { tempalte.RenderToFile(tempalte.GetProcereName() + ".sql"); } }}#>真正的存储过程的T-SQL脚本实现在重写的RunCore中。由于具体的文本转化逻辑都定义在了ProcereTemplate中了,所以在这里我们需要遍历的ProcereTemplate集合中每一个Template对象,调用RenderToFile方法将相应的存储过程的脚本写入以存储过程命名同名的.sql文件中。三、ProcereGenerator如何被使用?我们最后来看看我们创建的ProcereGenerator最终如何被应用于具体的代码生成。其实很简单,我们只需要创建相应的模板文件,通过<#@include>将定义ProcereGenerator类的TT文件包含近来,最后以代码语句调用块(<#StatementCode#>)的形式实力化该对象,并调用Run方法即可。在构造函数中指定数据库连接字符串的名称和数据表名的列表。下面是基于但表的T4模板。<#@ template language="C#" hostSpecific="true" debug="true" #><#@ include file="Templates\ProcereGenerator.tt" #><#new ProcereGenerator("TestDb","T_PRODUCT").Run();#>下面是基于多表的T4模板:<#@ template language="C#" hostSpecific="true" debug="true" #><#@ include file="Templates\ProcereGenerator.tt" #><#new ProcereGenerator("TestDb","T_ORDER","T_ORDER_DETAIL").Run();#>当你代码生成工作执行之后,会多出一个与TT文件同名的附属文件,你需要手工删除掉它。从数据到代码——通过代码生成机制实现强类型编程[上篇]从数据到代码——通过代码生成机制实现强类型编程[下篇]从数据到代码——基于T4的代码生成方式
2. 如何:使用文本模板 ...
生成部分应用程序代码我在文件或数据库中具有配置或模型。我的代码的一个或多个部分依赖于该模型。从文本模板生成一些代码文件。有关更多信息,请参见使用T4 文本模板生成设计时代码和开始编写模板的最佳方式是什么?。在运行时生成文件,将数据传递到模板在运行时,应用程序生成包含标准文本和数据混合的文本文件,例如报告。我要避免编写数以百计的 write 语句。将预处理过的文本模板添加到项目。此模板在代码中创建类,您可以实例化该类并用于生成文本。您可以在构造函数参数中将数据传递给它。有关更多信息,请参见使用预处理 T4 文本模板生成运行时文本。如果要从只可在运行时使用的模板生成,则可以使用标准文本模板。如果要编写 Visual Studio 扩展,则可以调用文本模板化服务。有关更多信息,请参见在VS 扩展中调用文本转换。在其他上下文中,可以使用文本模板化引擎。有关更多信息,请参见 Microsoft.VisualStudio.TextTemplating.Engine。使用<#@parameter#> 指令将参数传递给这些模板。有关更多信息,请参见 T4 参数指令。从模板读取另一个项目文件。若要从与模板相同的 Visual Studio 项目中读取文件,请执行以下操作:将hostSpecific="true" 插入<#@template#> 指令。在代码中,使用 this.Host.ResolvePath(filename) 获取文件的完整路径。从模板调用方法例如,如果方法已经存在于标准 .NET Framework 类中:使用<#@assembly#> 指令加载程序集,并使用 <#@import#> 设置命名空间上下文。有关更多信息,请参见 T4 导入指令。如果您经常使用一组相同的程序集和导入指令,请考虑编写指令处理器。在每个模板中,可以调用指令处理器,它可以加载程序集和模型文件并设置命名空间上下文。有关更多信息,请参见创建自定义文本模板指令处理器。如果您要亲自编写方法:如果您要编写预处理过的文本模板,则编写与预处理过的文本模板具有相同名称的分部类定义。将其他方法添加到此类中。编写类功能控制块 <#+ ... #>,可以在其中声明方法、属性和私有类。编译文本模板后,它将转换为一个类。标准控制块 <#...#> 和文本将转换为单个方法,类功能块将作为单独成员插入。有关更多信息,请参见T4 文本模板控制块。定义为类功能的方法还可以包括嵌入文本块。请考虑在单独文件中放置类功能,该文件可以 <#@include#> 到一个或多个模板文件中。在单独程序集(类库)中编写方法并从您的模板调用它们。使用<#@assembly#> 指令加载程序集,使用 <#@import#> 设置命名空间上下文。请注意,为了在调试程序集时重新生成该程序集,您可能必须停止并重新启动 Visual Studio。有关更多信息,请参见 T4 文本模板指令。从一个模型架构生成许多文件如果经常从具有同一 XML 或数据库架构的模型中生成文件:考虑编写指令处理器。这使您能够在每个具有单一自定义指令的模板中替换多个程序集语句和导入语句 。指令处理器还可以加载和分析模型文件。有关更多信息,请参见创建自定义文本模板指令处理器。从复杂的模型生成文件考虑创建域特定语言 (DSL) 来表示该模型。这样更加容易编写模板,因为您使用类型和属性来反映模型中元素的名称。不必分析文件或导航 XML 节点。例如:foreach (Book book in this.Library) { ... } 有关更多信息,请参见域特定语言入门和从域特定语言生成代码。考虑从 UML 模型生成代码。代码不必直接反映 UML。例如,不必为 UML 模型中的每个类都生成一个类。相反,可使用 UML 类图来表示网站,并从每个 UML 类生成网页。选择最符合您需要的关系图类型。例如,选择活动图来表示任意类型的工作流。可以定义构造型以便将适合应用程序的信息添加到每种类型的元素。通过从 UML 模型生成,您可以图表形式绘制并编辑模型,但不必像使用 DSL 一样设计您自己的关系图类型。有关更多信息,请参见开发软件设计模型和如何:从 UML 模型生成文件。从Visual Studio 获取数据若要使用 Visual Studio 中提供的服务,请设置 hostSpecific 特性并加载 EnvDTE 程序集。例如:C# <#@ template hostspecific="true" language="C#" #> <#@ output extension=".txt" #> <#@ assembly name="EnvDTE" #> <# IServiceProvider serviceProvider = (IServiceProvider)this.Host; EnvDTE.DTE dte = (EnvDTE.DTE) serviceProvider.GetService(typeof(EnvDTE.DTE)); #> Number of projects inthis VS solution: <#= dte.Solution.Projects.Count #> 调试模板代码在<#@template#> 指令中插入 debug="true",并保存文件。如果出现异常,则可以逐句通过模板。普通断点在模板中不起作用,但是您可以插入 System.Diagnostics.Debugger.Launch() 来打开调试器。如果要检查生成的代码,它将出现在 %TEMP% 目录中。有关更多信息,请参见使用文本模板时的常见错误和警告。在生成过程中执行文本模板有关更多信息,请参见生成过程中的代码生成。
3. 英国T4签证是什么 英国T4签证材料清单
英国T4签证是学生签证,办理英国T4签证所需材料如下:
1、在线签证申请材料清单打印件。
2、有效的旅行文件或护照,其中必须包含至少一页双面都是空白面的页面。
3、录取确认函(CAS)号(在签证申请表中提供)。
4、由授权诊所开具的肺结核检测证明(停留超过6个月)。
5、学术技术审核证书(如果学校录取确认函中要求提交)。
6、仍然有效的旧生物信息卡(如果持有需提供)。
在线申请当日未满18岁岁的第四层级(普通)申请人需要提交的额外材料:
父(母)或法定监护人的书面同意函,同意前往英国以及抵英接送安排。同意函还必须说明父(母)或法定监护人同意你在英国独立生活;以及你和父(母)或法定监护人的关系证明: 出生证、户口、独生子女证、领养证(如果你被领养)。
如果无法提供以上任何材料证明和父(母)或法定监护人的关系,可以提交由授权机构出具的DNA检测结果。英国签证及移民局不接受中国相关部门开具的公证书。
(3)t4模板多文件扩展阅读
入境英国的注意事项:
中国公民入境英国时,要随身携带有效护照、签证、机票,以及与入境目的有关的入学通知书、邀请函、资金证明或在英联系人住址、联系方式等文件证明,以便边境移民官员查验。切勿将这些材料放在托运行李中。
在办理入境手续时,应如实回答英国移民官员问询;如不懂英文或不能正确理解移民官提出的问题,可以请求英方提供中文翻译;如认为受到不公正对待,应当向英移民官当面表达意见,同时要求与中国驻英国使、领馆联系。
英国入境移民口岸设有3种通道:英国护照通道(BritishPassports)、欧盟国家通道(EUCountries)和其他护照通道(OtherPassports)。中国公民应当选择“其他护照通道”办理入境手续。
4. 准备英国T4签证需要哪些材料
英国T4签证属于英国留学签证,英国留学签证材料主要有下面这些:
1、 CAS;
2 、护照(有签名和复印件);
3 、语言成绩单:需要雅思成绩5.5分;
4 、学位证+毕业证;
5、本科/高中成绩单;
6、存款证明(最好存款满一月以上)。
a、根据相关政策的新调整:伦敦地区生活费用每年9000英镑;其余地区的生活费用证明每年8000英镑。
b、资金证明伦敦地区:10000英镑;非伦敦地区:9000英镑
7 、签证照片;
8、押金的收据管;
9、签证申请表格。
(4)t4模板多文件扩展阅读
注意事项
1、所申请的签证是否可以成功,取决于相关国家使领馆签证官的直接审核结果;若最终发生拒签状况,申请人应自然接受此结果。
2、有关签证资料上公布的签证有效期和停留天数,仅做参考而非任何法定承诺,一切均以签证官签发的签证内容, 为唯一依据。
3、需购买机票,建议出签后再购买。
4、如果文件说明中没有特别指出,对于所提交的每一份文件,包括护照生物信息页(即有您照片的那一页),都必须同时提供原件和复印件。