12月31号:2002年的最后一天,天气不错!!希望明年天天都是好天气,也希望所有的IT从业人员新年好,天天快乐!
好长时间没有更新项目笔记了,并不是因为我们的项目没有什么进展。而是我要期末考试!郁闷。昨天好不容易考完了我最怕怕的English. 总算可以重新开写项目笔记罗。
上篇的项目笔记有朋友问我们代码如果始用自动生成之后,如何进行更新?如何保留生成地代码变化部分?这篇文章主要是讲讲这方面的内容。如果对代码生成工具不了解,可以参考以前的项目笔记。
http://www.csdn.net/develop/author/netauthor/ViktorYu/
以下所写的部分还是实现“异常处理与日志记录代码自动生成”文章中所说的功能,实际上要在一堆的Web Service代码文件中加入或更新代码的过程为例,说明代码生成工具与代码更新工具的开发与使用。
l 代码生成时对应生成的代码特殊规则
一段使用代码生成工具植入的代码是否可以进行整个文件修改之后的重新更新,最为关键的一点是你的代码更新工具是不是可以定位此段的代码,以及生成的代码是不是已经被破坏。所谓破坏是指明生成的代码已经被各个开发人员进行了个性化的修改,无法使用统一的规则进行更新处理。换句话说,你在设计要植入的代码时就需要对代码进行比较细的拆分,使得植入的代码保证原子性。这就要求在生成代码时,必须要对代码加入一些对应的规则。这一篇主要讨论比较简单的代码更新,可能还用不要这些特殊的规则,以后将会讨论比较复杂的代码更新,将会对生成的代码的规则做出更加细致的字义。这种情况下更新的数据可以只更新预先定义好的部分,并可以保留目标代码文件中其它的部分。
l 代码更新的原则与方案
下面分别从代码更新所需要的输入原则,代码更新的替换原则,以及有代码更新的最后所要输出的原则讨论代码更新的原则与方案。
代码更新工具的过程简单来说是两个步骤:第一步是找出被更新文件中是否要更新的那部分代码;第二步是将新的代码替换那部分要更新的代码。这里我使用了一个XML格式的模板文件来记录文件基本信息,被更新的代码,以及新的要植入的代码。
Ø 代码更新的输入
代码更新的输入包括两个部分:
² 原始文件(目录)
原始文件存放的地方,可以通过原始文件目录的搜索找出所有要进行代码更新的文件。比如我所参与的项目中,我将所有的Web Service文件放在c:/inetpub/wwwroot/projects之中,我要修改的是所有的以后缀名为.asmx.cs(Web Service在我们的项目中采用的C#进行开发的,其它的具体情况可以参见以前的文档)的文件。那么原始文件输入为c:/inetpub/wwwroot/projects,我将通过遍历目录结构的方式,将所有的Web Service的文件找出,并执行代码更新的工作。
² 模板文件
模板文件为代码更新提供了被更新的代码的版本,新植入的代码的版本,以及使用这个模板文件的标识。下面是我的模板文件的一个例子:
TryandCatch.XML文件:
<?xml version="1.0" encoding="gb2312" ?>
<CodeTemplate>
<TemplateTag>
//**?? 已经使用TryandCatch.xml模板文档 ??**//
</TemplateTag>
<CodeSession value="Try">
<oldsource>
//**严禁修改以下代码**//
//insert trytry
//**严禁修改以上代码**//
</oldsource>
<newsource>
//**严禁修改以下代码**//
//insert try
try{
//**严禁修改以上代码**//
</newsource>
</CodeSession>
<CodeSession value="Catch">
<oldsource>
//**严禁修改以下代码**//
//insert catchcatch
//**严禁修改以上代码**//
</oldsource>
<newsource>
//**严禁修改以下代码**//
//insert catchcatch
}
catch(CommonException e){
return e.ErrorObject;
}
catch(Exception e){
try{
throw new ExceptionHandler.CommonException(e);
}
catch(CommonException ee){
return ee.ErrorObject;
}
}
finally{
}
//**严禁修改以上代码**//
</newsource>
</CodeSession>
</CodeTemplate>
上面的XML模板文件中,一共有两种节:
1.<TemplateTag>
<TemplateTag>节中间的内容代表是不是本模板的内容已经被植入了目标代码文件中,如果目标代码文件中没有找到<TemplateTag>节中的内容,则可以判断出目标还没有植入本模板的代码,那么直接使用<newsource>中的内容植入;如果目标代码文件中没有找到<TemplateTag>节中的内容,则可以判断出目标已经植入本模板的代码,那么使用<newsource>中的内容替换<oldsource>中的内容。
2.<CodeSession>
每一个CodeSession中的内容存放了以前植入的代码,本次需要植入的代码。以前值入的代码放在<oldsource>中,本次需要植入的代码放在<newsource>中。当需要对代码进行替换时,可以只需要修改模板文件(将原来的<newsource>节中的内容拷贝到<oldsource>节中,然后将需要新植入的代码放入<newsource>节中),再重新执行一次代码更新工具就可以了。