摘要: 在软件系统中,经常面临着“某个对象”的创建工作,由于需求的变化,这个对象的具体实现经常面临着剧烈的变化,但是它却拥有比较稳定的接口。如何应对这种变化?提供一种封装机制来隔离出“这个易变对象”的变化,从而保持系统中“其它依赖该对象的对象”不随着需求的改变而改变?这就是要说的Factory Method模式了。 阅读全文
posted @ 2006-01-04 13:31 TerryLee 阅读(103959) 评论(179) 推荐(22) 编辑
摘要: 又是一年过去了,距离06年剩下不到8个小时了。这一年对自己来说是变化最大的一年,进步最快的一年。这一年有得也有失,有过欢乐也有过痛苦。总想找个时间做一下自我总结,可是又特别不想写,因为我自己不知道该从何写起,回想自己这一年的工作生活变化,真的是很多很乱。可是再不写点什么,可能就要留下遗憾了。这一年总体上来说在技术上提高了不少,思想上也成熟了。 新年到来之际,感谢领导,感谢同事,感谢我生活中的每一位... 阅读全文
posted @ 2005-12-31 16:57 TerryLee 阅读(594) 评论(0) 推荐(1) 编辑
摘要: 大家都知道,在CodeSmith中现在没有提供选择字段的功能,我们在生成一个List页面时,不可能对整张表的所有字段都生成,所以有必要去实现选择字段的功能。我总结了一下,大体上有以下几种实现思路。 阅读全文
posted @ 2005-12-30 10:49 TerryLee 阅读(4143) 评论(8) 推荐(0) 编辑
摘要: 在CodeSmith中,以下几个快捷键有助于我们快速输入。 1.Ctrl + Shift + C 在空行上,按下Ctrl + Shift + C后将会录入一个代码块。 2.Ctrl + Shift + Q 按下Ctrl + Shift + Q后录入一个脚本块。 3.Ctrl + Shift + V 对代码块反转,如有下面这样一行代码: 在两个大括号之间按下Ctrl + Shift + ... 阅读全文
posted @ 2005-12-28 18:36 TerryLee 阅读(5787) 评论(6) 推荐(0) 编辑
摘要: Progress对象可以在CodeSmith生成代码时给用户显示一个进度条,当生成代码的时间很长时非常有用。如果你使用的是CodeSmith Explorer,进度条将显示在Generate按钮的左边: 如果使用的是CodeSmith Studio,进度条将显示在状态栏上: 使用Progress和在WinForm中使用进度条差不多,需要设置它的最大值和步长: this.Progress.Max... 阅读全文
posted @ 2005-12-28 18:34 TerryLee 阅读(4041) 评论(2) 推荐(1) 编辑
摘要: 在CodeSmith中使用CodeTemplateInfo可以获取当前模版的一些信息: 属性 返回值 CodeBehind Gets the full path to the code-behind file for the template (or an empty string if there is no code-behind file). ContentHash... 阅读全文
posted @ 2005-12-28 18:31 TerryLee 阅读(4293) 评论(1) 推荐(0) 编辑
摘要: 在CodeSmith中,如果生成的代码是SQL脚本,则可以在生成代码完成时自动执行生成的代码,也就是在生成的SQL脚本的同时在数据库中创建新的对象。 用BaseTemplates.ScriptUtility对象提供ExecuteScript方法可以实现,如果想在生成代码完成后立即执行生成的脚本,可以很方便的通过重载OnPostRender来实现。 在使用之前,先添加对下列程序集的引用: 看下面的... 阅读全文
posted @ 2005-12-28 18:30 TerryLee 阅读(7464) 评论(1) 推荐(1) 编辑
摘要: 最近跟同事在研究CodeSmith,感觉中文文档是少之又少,所以我们自己写(翻译)了一些文档,总结如下,希望对使用CodeSmith的朋友有所帮助。 等整个文档完成后,我会做成PDF文件供大家下载。 阅读全文
posted @ 2005-12-28 09:15 TerryLee 阅读(83290) 评论(54) 推荐(35) 编辑
摘要: 如果你需要提供一个复杂的组合用户界面来输入元数据,这时就要添加设计器的支持。换句话说,除此之外没有别的办法来输入你自定义的元数据类型。添加设计器的支持,首先你要创建一个Editor作为自定义的类型,一个Editor其实就一个继承于.NET 中的System.Drawing.Design.UITypeEditor类的子类。 安装CodeSmith后在,在C:\Program File\CodeSmi... 阅读全文
posted @ 2005-12-28 08:54 TerryLee 阅读(4969) 评论(1) 推荐(0) 编辑
摘要: CodeSmith在执行模版时通过调用一些API来完成的,主要经过了以下这几步的操作: l 编译一个模版 l 显示编译错误信息 l 创建一个新的模版实例 l 用元数据填充模版 l 输出结果 下面这段代码显示了这些操作: CodeTemplateCompiler compiler = new CodeTemplateC... 阅读全文
posted @ 2005-12-28 08:51 TerryLee 阅读(4880) 评论(3) 推荐(0) 编辑
摘要: 在CodeSmith中,CodeTemplate.Render方法是在模版执行完成进行模版输出时执行,你可以通过重载CodeTemplate.Render方法来修改CodeSmith输出时的事件处理。例如:你可以修改模版输出时的方式来代替现在默认的方式,下面这段代码展示了在保持CodeSmith默认的窗口显示的同时,把结果输出到两个不同的文件。 1 2 3This template demo... 阅读全文
posted @ 2005-12-28 08:46 TerryLee 阅读(4436) 评论(2) 推荐(0) 编辑
摘要: 在CodeSmith中,要把生成的代码文件输出到文件中,你需要在自己的模版中继承OutputFileCodeTemplate类。 OutputFileCodeTemplate主要做两件事情: 1.它添加一个名为OutputFile的属性到你的模版中,该属性要求你必须选择一个文件; 2.模版重载了方法OnPostRender(),在CodeSmith生成代码完成后把相应的内容写入到指定的文件中去。... 阅读全文
posted @ 2005-12-28 08:44 TerryLee 阅读(6934) 评论(6) 推荐(0) 编辑
摘要: 在使用CodeSmith进行代码生成的时候,你可能需要在子模版和父模版之间共享属性。比如,写一个基于数据库生成代码的模版,在每个模版里面都定义了一个名为Server的属性。当你在父模版中使用此属性时,它的值只对父模版起作用。想要设置此值到子模版,可以在父模版中使用CopyPropertiesTo方法,当在父模版中使用此属性时,它的值会发送到子模版中去。下面这段代码展示了如何使用该方法: //... 阅读全文
posted @ 2005-12-28 08:42 TerryLee 阅读(3909) 评论(3) 推荐(0) 编辑
摘要: CodeSmith允许我们存储元数据在XML文件中,然后在执行模版时直接打开XML文件填写到属性面板中。 1.XML Property With a Schema 1 2 6 7 8 9 10 11 12 13 14 15 16 ... 阅读全文
posted @ 2005-12-28 08:40 TerryLee 阅读(4741) 评论(1) 推荐(0) 编辑
摘要: 用CodeSmith生成可变化的代码,其实是先利用CodeSmith生成一个基类,然后自定义其它类继承于该类。当我们重新生成基类时CodeSmith不要接触继承的子类中的代码。看下面的这段模版脚本: class { m_; public ( ) { m_ = }} 执行该模版并输入如下数据: 该模版生成的代码可能如下: 1class Accou... 阅读全文
posted @ 2005-12-28 08:33 TerryLee 阅读(4535) 评论(1) 推荐(0) 编辑
摘要: SchemaExplorer允许我们获取数据库中一些对象的信息。如果你使用的是SQL Server2000数据库,你可以通过扩展属性获取很多对象的有用的信息。 阅读全文
posted @ 2005-12-27 14:31 TerryLee 阅读(5272) 评论(0) 推荐(0) 编辑
摘要: 使用FileDialogAttribute可以设置FileNameEditor中的属性,其用法如下。 阅读全文
posted @ 2005-12-27 13:32 TerryLee 阅读(4587) 评论(1) 推荐(0) 编辑
摘要: FileNameEditor类给我们提供了在CodeSmith属性面板中弹出打开或保存文件对话框的方式,在使用时,首先在模版中得添加对程序集CodeSmith.CustomProperties的引用。然后就可以在模版中定义一个属性来使用FileNameEditor。 阅读全文
posted @ 2005-12-27 13:23 TerryLee 阅读(5758) 评论(3) 推荐(1) 编辑
摘要: 昨天写了一篇《你真的了解.NET中的String吗?》的随笔,引起了大家的广泛关注。其中一些朋友发现文中存在的问题,这里我得接受批评,同时也深深体会到了博客园的宣传语“像写代码一样写文章”的深刻意义。写出来的文章如果误导了读者,那就是大罪过了。 1.关于字符串的比较: 经过查找发现= =操作符是Equals的重载,所以这点在文中有误。 public static bool operator =... 阅读全文
posted @ 2005-12-27 11:52 TerryLee 阅读(2984) 评论(9) 推荐(0) 编辑
摘要: 我们都知道,当存储过程引用的表改变时,SQL Server会重新编译该存储过程。但是当我们增加一个有助于存储过程执行效率的索引时,SQL Server却不会重新编译该存储过程。只有当存储过程高速缓存被冲刷时(SQL Server重新启动),存储过程才会被重新编译。 如果想要强制编译一个存储过程,可以调用系统存储过程: Execute sp_recompile P_Sys_OrderRead 当一张... 阅读全文
posted @ 2005-12-26 16:27 TerryLee 阅读(1935) 评论(0) 推荐(1) 编辑
摘要: String在任何语言中,都有它的特殊性,在.NET中也是如此。它属于基本数据类型,也是基本数据类型中唯一的引用类型。字符串可以声明为常量,但是它却放在了堆中。 本文从String类型是不可改变对象说起,深入探讨了字符串的引用、驻留、比较操作效率以及StringBuilder等内容。 阅读全文
posted @ 2005-12-26 16:15 TerryLee 阅读(15913) 评论(53) 推荐(7) 编辑
摘要: StringCollection提供了一种集合的输入方式,在代码中,可以用Array的方式来引用。在使用这个类之前,在模版中我们必须添加对CodeSmith.CustomProperties程序集的引用: 添加完程序集之后,我们就可以使用StringCollection在脚本块中定义一个属性: 执行该模版时,这个属性将在属性窗体中显示为一个按钮: 单击按钮,将会弹出一个String C... 阅读全文
posted @ 2005-12-26 16:00 TerryLee 阅读(11468) 评论(2) 推荐(1) 编辑
摘要: 虽然不能完全避免死锁,但我们可以将死锁减至最少,并通过一定的方法来检测死锁。如果发生死锁了,我们怎么去检测具体发生死锁的是哪条SQL语句或存储过程?如何去手动的杀死进程和锁?如何查看系统中所有锁的详细信息? 阅读全文
posted @ 2005-12-24 14:05 TerryLee 阅读(8370) 评论(3) 推荐(2) 编辑
摘要: 先看一下这段Javascript脚本代码: 1 alert 出来的是什么?在我们看来应该是 "aaa",实际上alert 出来的是 "undefined"。为什么? 因为 Javascript为了简化处理,变量实际上只有两种作用域,全局变量和函数的内部变量。你在函数内部任何一个地方定义的变量其作用域都是整个函数体。而在 alert 的时候函数的内部变量 v 已经定义了,并且覆盖掉了同名的全局变量... 阅读全文
posted @ 2005-12-23 11:17 TerryLee 阅读(2233) 评论(4) 推荐(1) 编辑
摘要: 在软件系统中,有时候面临着“一个复杂对象”的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法确相对稳定。如何应对这种变化?如何提供一种“封装机制”来隔离出“复杂对象的各个部分”的变化,从而保持系统中的“稳定构建算法”不随着需求改变而改变?这就是要说的建造者模式。 本文通过现实生活中的买KFC的例子,用图解的方式来诠释建造者模式。 阅读全文
posted @ 2005-12-19 09:32 TerryLee 阅读(79183) 评论(75) 推荐(8) 编辑