这篇文章起源于我的LLBL Gen 3.x ORM源码追踪系列教程,有以下几篇文章
LLBL Gen 3.x 源代码追踪与解析 Type Converter 类型转换器
LLBL Gen 3.x 源代码追踪与解析 验证Validation的原理和流程
ERP/MIS开发 开发LLBL Gen 插件(Plun-in) Implementing a plug-in
很多朋友都疑惑,分析源代码有什么用呢,别人的代码是这样写的,我不可能写一个同样的软件,所以没有必要分析它的源代码。因为工作的关系,我猜想,大部分朋友,都不会依靠分析源代码来提高代码开发技术,这个过程太缓慢,不容易有效果,我们提升技术的最快方法一般是读文章,在实际应用的时候再多练习应用。
以下两个软件,是我通过使用,分析LLBL Gen 3.x的代码,体会出来的心得,也是.NET实践的内容。
Template Studio
LLBL Gen 3.x有自己的Template Studio,但是它不提供智能提示支持,这样写代码,效率不高,于是我想到做一个带智能提示的模板编辑器,请看下面的模板定义,LLBL Gen 3.x的lpt类型的模板定义
<%
Project currentProject = _executingGenerator.ProjectDefinition;
EntityDefinition currentEntity = (EntityDefinition)_activeObject;
%>
using System;
using System.Data;
如果你不熟悉,可以参考我的文章《Template Studio 模板开发入门 Lpt templates Development》,以帮助理解。
引用里面的讲解,_executingGenerator是Template Studio内置的变量,在运行时动态传入值,它的类型是IGenerator,定义于程序集SD.LLBLGen.Pro.GeneratorCore中。还有两个变量
_parameters, 类型是Dictionary(String, TaskParameter) ,存放当前task的参数
_activeObject, 如果emitType=allEntites,则它代表当前的实体对象。
所以,我要达到的效果是这样
当敲入_executingGenerator类型的变量时,可以显示它的成员列表,以方便快速的编辑模板。
如果你读过我的文章,《工作五年的.NET程序员再谈应用反射,动态编译,代码生成器》,它提到的模板语法如下
<%@ Property Name="Math" Type="MathProgram" Category="Text"Description="Namespace for this class" %>
<%@ Property Name="IncludeDelete" Type="System.Int32" Default="123" Category="Options" Description="If true delete statements will be generated." %>
<%@ Assembly Name="TestClassLibrary" %>
<%@ Import Namespace="EPN.Common" %>
LLBL Gen 3.x的lpt模板文件定义和上面的Code Smith的模板定义有区别,所以,那篇文章中提到的技术,需要改良一下,才可以达到智能提示的目的。
LLBL Profile
这个软件,是用于跟踪LLBL Gen的动态输出的SQL语句,并且把它转化成可直接运行的SQL语句。LLBL Gen 的Trace输出的SQL不是标准的SQL,需要适当的转换一下才能运行。请看下图
通过Socket技术,把追踪到的SQL,输出到指定的服务器窗口中,然后在自动转化为窗体下方的可运行的SQL语句,这是它的主要功能。
ORM追踪的难题之一是ORM框架会生成动态SQL语句,可以直接运行,但是修改起来很麻烦。
请看下面的动态SQL语句的例子
EXECUTE (N'SELECT * FROM Groups')
SP_EXECUTESQL N'SELECT * FROM Groups'
提到动态SQL语句,这句话可能很重要:EXECUTE 括号里面只能是字符串变量、字符串常量、或它们的连接组合,不能调用其它一些函数、存储过程等。 如果要使用,则使用变量组合。
什么时候用动态SQL语句,当SQL的结构不能确定(即表名和列名),用动态SQL。
LLBL Profile把ORM动态生成的SQL语句,转化成静态的SQL语句,可用来修改,这是它的主要功能点。
我在追踪程序的结果或SQL的结果有区别时,经常用这个办法,来找到问题所在。
在我写过这个软件之后,又到互联网上搜索了一下,发现有个叫LLBL Gen Profile的商业软件,做的很不错。
商业的软件,肯定会有界面友好,易用性,稳定性上面下功夫。和它比起来,我的软件简直就是丑小鸭,我想要是能多坚持一段时间的开发,肯定可以做得再好一些。
如果要了解更多的关于ORM追踪的内容,请参考文章《信息化基础建设 开发框架》中的SQL Profiler 跟踪查询小节。