一款基于模板的代码生成工具Template Studio

开发 后端
Template Studio是一款基于模板的优秀代码生成工具,本文作为入门教程,给大家比较各自的优势和不足。

  LLBL Gen作为一个优秀的ORM代码生成工具,可以基于模板快速生成应用程序代码。可能你也会推荐T4,Code Smith等模板生成器,但是先别急,先看看这篇文章作为入门教程,再来比较各自的优势和不足。

  以第三方的模板Provide common SQL Functions for Microsoft SQL Server为例子,来讲解模板生成的步骤。

  设计模板

  打开Template Studio,选择TemplateBindings Viewer,点击New按钮,新增加一个模板TemplateBinding文件

这是方便LLBL Gen工作而进行的设定,有几个关键项

  For database是模板支持的数据库类型,只可以选择一种数据库类型;选择Platform表示生成的代码可以支持的.NET Framework版本,这将影响到可以生成的Visual Studio的sln和cs/vb.proj文件的版本。Target language选择C#,以表明生成C#代码;Logic language表示书写模板用的语言是TDL语法。

  请在TemplateID-Filename bindings中绑定模板标识和对应的模板文件名称。

  TemplateBinding是一个XML格式的配置文件,其内容如下

  1.   <?xml version="1.0"?>  
  2.   <templateBindings xmlns="http://sd/llblgen/pro/templateBindingsDefinition.xsd"name="WB.TemplateBindings.SqlServerSpecific.NET20" 
  3. description ="Template bindings for the templates which are specific for SqlServer based databases (7/2000/2005/CE). For .NET 2.0 based platforms" 
  4. databaseDriverID="2D18D138-1DD2-467E-86CC-4838250611AE" precedenceLevel="10">  description ="Template bindings for the templates which are specific for SqlServer based databases (7/2000/2005/CE). For .NET 2.0 based platforms" 
  5.   databaseDriverID="2D18D138-1DD2-467E-86CC-4838250611AE" precedenceLevel="10">  
  6.   <supportedPlatforms>  
  7.   <platform name=".NET 2.0"/>  
  8.   <platform name="CF.NET 2.0"/>  
  9.   </supportedPlatforms>  
  10.   <language name="C#">  
  11.   <!-- DB Specific template bindings -->  
  12.   <templateBinding emplateID="WB.SQLSystemFunctionsTemplate" filename="SqlServerSpecificNet2.xC#WB.SQLSystemFunctions.template" />  
  13.   </language>  
  14.   </templateBindings> 

  这是代码批处理生成的思想。比如我有五个模板,现在给这五个模板添加一个配置文件,引用到这五个模板,然后

  只需要启动配置文件,生成代码时,会自动传递参数到这五个模板中,批次生成代码。

  选中WB.SQLSystemFunctionsTemplate,用快捷键CTRL+E,编辑它对应的模板文件WB.SQLSystemFunctions.template。

LogicTDL语法和ASP.NET很相似,但是使用<[和]>表示模板中使用到的变量。

  在《LLBLGenPro2.6SDKDocumentation》文档的Template Sets - Template Definition Language (TDL)节,提到了<[RootNamespace]>的含义,原文是Will be replaced by the specified Root namespace in the generator configuration screen,理解为取生成代码时输入的命名空间变量。

  启动LLBL Gen,配置生成参数

  F7调出代码生成界面,切换到Task queue to execute,Add Tasks添加一个新任务,选择类型为SD.Tasks.Base.ConsumeTDLTemplate, 这个任务将会用于编译第一节写的模板,并生成C#代码。

  修改参数 filenameFormat=SqlFunctionCalls.[extension],templateID=WB.SQLSystemFunctionsTemplate

  这其实是在配置代码生成的preset文件,文件内容如下

  1.   <?xml version="1.0" encoding="utf-8"?>  
  2.   <preset name="SQL Functions" lastModifiedOn="2011-08-30T22:40:50.3165235+08:00" createdBy="Northwind" isSealed="false" xmlns="http://sd/llblgen/pro/presetElementDefinitions.xsd">  
  3.   <supportedPlatforms>  
  4.   <platform name=".NET 2.0" />  
  5.   </supportedPlatforms>  
  6.   <supportedTemplateGroups>  
  7.   <templateGroup name="Adapter" />  
  8.  </supportedTemplateGroups>  
  9.   <taskPresets>  
  10.   <taskPreset name="SD.Tasks.Base.ConsumeTDLTemplate">  
  11.   <parameters>  
  12.   <parameter name="destinationFolder" value="" />  
  13.   <parameter name="filenameFormat" value="SqlFunctionCalls.[extension]" />  
  14.   <parameter name="templateID" value="WB.SQLSystemFunctionsTemplate" />  
  15.   </parameters>  
  16.   </taskPreset>  
  17.   </taskPresets>  
  18.   </preset> 

  到此,已经配置完毕,点击Start generator按钮,生成代码。

  模板文件的分析

  再来看一下模板的作用,这个模板的作用是把内置SQL Server系统中的date和string函数,转化为C#代码。

  如果要调用SQL Server中的YEAR函数,可能要写这样的方法

  1.   private int GetSQLServerYear()  
  2.   {  
  3.   ResultsetFields fields = new ResultsetFields(1);  
  4.   fields.DefineField(new EntityField("AFld"new DbFunctionCall("YEAR"new object[] { DateTime.Today })), 0);  
  5.   TypedListDAO dao = new TypedListDAO();  
  6.   return (int) dao.GetScalar(fields, nullnullnullnull);  
  7.   } 

  如果使用这个模板,下面的代码已经为你生成好了,直接使用即可。

  1.   private int GetSQLServerYear()  
  2.   {  
  3.   ResultsetFields fields = new ResultsetFields(1);  
  4.   fields.DefineField(new EntityField("AFld", SqlFunctionFactory.Year(DateTime.Today), 0);  
  5.   TypedListDAO dao = new TypedListDAO();  
  6.   return (int) dao.GetScalar(fields, nullnullnullnull);  
  7.   } 

  也就是说白了,用于简化对SQL Server函数的调用方法。

  但是,上面的代码仅仅是对SQL Server内置的函数有作用,还没有为用户自定义的函数生成C#代码,如果你有一个自定义的函数SomeFunctionToGetASetting,则需要添加一个partial的SqlFunctionFactory类,代码如下

  1.   public partial class SqlFunctionFactory  
  2.   {  
  3.   public static IExpression SomeFunctionToGetASetting(int someParameter)  
  4.   {  
  5.   return new DbFunctionCall("dbo""SomeFunctionToGetASetting"new object[] { someParameter });  
  6.   }  
  7.   } 

  再增加一层代码,供客户端方便调用

  1.   public partial class SqlFunctionCalls  
  2.   {  
  3.   private SqlFunctionCalls()  
  4.   {  
  5.   }  
  6.   public static bool SomeFunctionToGetASetting(int someParameter)  
  7.   {  
  8.   return (bool)SqlFunctionFactory.GetScalar(SqlFunctionFactory.SomeFunctionToGetASetting(someParameter));  
  9.   }  
  10.   } 

  最终的调用代码像下面这样

  bool someSetting=SqlFunctionCalls.SomeFunctionToGetASetting(12);

  总结:LLBL Gen的模板生成器Template Studio由于其商业性的原因,普及程度不高,入门起来也没有Code Smith/T4之类的快速,文档少。官方认为,大部分的可能情况下,你不需要使用到自定义模板,LLBL Gen的安装程序包已经附带了完整的Adapter/SelfServicing模板。但如果要彻底的把握LLBL Gen这一ORM工具,了解和学习它的模板技术,是很有必要的。

原文链接:http://www.cnblogs.com/JamesLi2015/archive/2011/08/31/2160285.html

责任编辑:彭凡 来源: 博客园
相关推荐

2021-04-18 20:46:30

工具代码编程

2022-02-16 09:01:33

编程工具Node-RED编辑器

2020-10-10 14:57:16

代码开发工具

2022-05-26 17:40:51

Linux开源

2021-10-10 12:17:06

Weakpass在线字典生成器安全工具

2011-05-30 13:43:55

2019-08-30 08:00:00

WebminWebLinux

2023-09-21 11:48:49

CodeGeeXAI代码

2021-07-07 06:52:17

云图word-cloud工具

2023-07-11 08:30:56

2019-11-05 18:50:37

代码开发工具

2022-02-25 14:57:33

harmonyOSjava心形动画

2021-01-27 07:24:38

TypeScript工具Java

2023-10-08 07:51:07

HInvoke项目函数

2024-01-25 10:40:11

AutoProfil开源分析工具

2011-01-04 09:20:00

2021-01-27 13:16:39

ScreenLinux命令

2021-02-16 10:58:50

ScreenLinux命令

2022-01-27 13:02:46

前端爬虫工具

2017-01-19 09:41:01

点赞
收藏

51CTO技术栈公众号