Yok

苦海无涯,回头是岸啊

CodeSmith终极玩法

CodeSmith是一个模仿asp.net运行机制的代码生成器,  运行时分析模板(相当aspx文件)的预编译指令和主体内容, 生成一个继承自CodeSmith.Engine.CodeTemplate(相当于System.Web.UI.Page)或者一个在Inherites预编译指令指定的类(相当于CodeBehind类)的源码, 且把它编译. 然后把这个类绑定到一个PropertyGrid, 让用户编辑参数后执行生成类的__RenderMethod1(相当于Render)方法生成最终代码. 这种模式很好的把易变的生成内容和相对稳定的用于的生成代码的数据源隔离开来.

我认识的大多数CodeSmith用户都是根据数据库结构去生成实体类, 存储过程或者asp.net的界面, 而CodeSmith本身提供了SchemaExplorer用于读取数据库结构, 在模板的预编译指令声明类型为SchemaExplorer.TableSchema的属性即可使用. 而大多数模板都是利用SchemaExplorer去获得数据库结构.

PropertyGrid是用户和根据模板生成的类之间互动的桥梁, 通过在属性或者属性所属类型上标记EditorAttribute可以任意扩展该属性在PropertyGrid里的表现形式, 详细情况请参考http://www.microsoft.com/china/msdn/archives/library/dndotnet/html/usingpropgrid.asp

然而CodeSmith并不支持在模板里定义的属性标记Attribute, 即使有, 在CodeSmithStudio里写这么复杂的代码也不方便. 解决方法就是自己在vs.net写一个模板的基类(必须从CodeSmith.Engine.CodeTemplate继承), 然后通过指定Inherites关键字让模板从基类继承, 这时就可以利用EditorAttribute为所欲为了. 我做了一个可以用来生成多个nhibernate实体类, xml映射和aspx界面的模板基类, 还可以把填写的内容序列化到xml文件和从xml文件反序列化. 我并没有用TableSchema去做生成代码的数据源, 而是有自定义的数据结构, 并且可以手工用XtraGrid去编辑, 当然也可以利用SchemaExplorer去从数据库取结构. 这个基类的结构如下:             

ClassGenerator
+ Assembly
+ Namespace
+ Classes
◆------->
0        *
Class 
+ Attributes
+ Comments
+ Fields
◆------->
0        *
 Field
+ Name
+ DataType
+ MappingType
+ AllowNull
    ......


ClassGenerator还有3个特殊属性SelectedClasses, Save, Load. 它们没有任何意义, 只是利用它们标记的EditorAttribute执行用SchemaExplorer一次选择多个表, 把编辑的内容保存成xml和从xml加载的功能



源码及模板

btw: 我用XtraGrid时遇到问题, 删除一列时被选中列就会往后跳一条, 结果就是删到倒数第二条时会出现索引超出范围的错误, 谁知道怎么解决?

posted on 2005-06-23 21:34 Yok 阅读(5633) 评论(8)  编辑 收藏 网摘

评论

#1楼 2005-06-24 10:03 寒枫天伤

不清楚你说的问题,但一般这可以通过编门的方法来解决:
第一种:用try...catch,把错误压住
第二种:再增加一个列,隐藏不显示

PS:这可能是xtragrid的bug,你也可以考虑提高版本看看
  回复  引用    

#2楼 2005-09-21 15:28 gdlmo[未注册用户]

你的源码打不开呀,提示一个“源代码管理”的错,说:
”解决方案看起来是受源代码管理,但无法找到它的绑定信息。保存解决方案的源代码管理设置的 MSSCCPRJ.SCC 文件或其他项可能已被删除。由于无法自动恢复这些缺少的信息,缺少绑定的项目将被视为不受源代码管理。“

我用的是vs2003不会是版本问题吧
  回复  引用    

#3楼 2006-01-19 12:22 听棠.NET      

你好,看到你的这个文章我好象看到了希望,我的BLOG是 http://www.cnblogs.com/tintown/">http://www.cnblogs.com/tintown/ 我有个SPL也是持久层,我原也有代码生成器:http://tintown.cnblogs.com/archive/2006/01/18/319599.html">http://tintown.cnblogs.com/archive/2006/01/18/319599.html ,你可以看一下我的代码生成器听效果,现在想用CodeSmith来生成体类代码,也是想一次性能生成多个表的实体类,还有两个XML文件,因为CodeSmith能访问多种数据库,现在能支持Oracle、Sql Server、Access、MySql吗?
而且我也非常想能得到你的帮助,是否愿意支持SPL。其实SPL是一个非常实用的持久层。
  回复  引用  查看    

#4楼 2006-01-20 09:47 曾哲      

不错哦   回复  引用  查看    

#5楼 2006-01-23 23:28 Spyer[未注册用户]

btw: 我用XtraGrid时遇到问题, 删除一列时被选中列就会往后跳一条, 结果就是删到倒数第二条时会出现索引超出范围的错误, 谁知道怎么解决?

将删除的顺促倒过来,就应该没有这个问题了。升序删除,当删除多列或多行时,肯定会出错的,不关控件的问题。序号都改变了嘛。倒序删除就不会有这个问题了。
  回复  引用    

#6楼 2006-05-28 20:39 cowbird      

我也在学习codesmith和nettiers

欢迎交流学习
msn:cowbird2002@hotmail.com
  回复  引用  查看    

#7楼 2007-06-07 14:50 luqingfei

xx.EndEditor()
??
  回复  引用    

#8楼 2007-09-16 20:33 阿慧南      

以前使用过CodeSmith,但是有些功能始终不能满足:
需要生成实体的说明,应该说这个本身不是 CodeSmith 的错如果数据库有字段说明的话 CodeSmith 是可以生成的,但是一般数据库都没有(我也没有找到可以让 PowerDesign 把字段说明生成到数据库)。为此我特地写了个小工具

可以通过 PowerDesigner 的 XML 文件生成基本的VB 实体(包含属性说明),ibatisNet 代码等。

http://www.cnblogs.com/MicroSystem/archive/2007/04/23/723670.html" target="_new">PowerDesigner XML 文件直接生成 VB 实体(包含属性说明)、ibatisNet 代码


直接跳过数据库,利用数据库设计文件。同事们使用也比较方便。
http://www.cnblogs.com/images/cnblogs_com/microsystem/PowerDesign2Domain/Domain.JPG" border="0" />
  回复  引用  查看    




发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 179938




相关文章:

相关链接:

<2009年7月>
2829301234
567891011
12131415161718
19202122232425
2627282930311
2345678

导航

统计

公告

不玩了不玩了不玩了不玩了不玩了不玩了不玩了不玩了

与我联系

搜索

 

常用链接

留言簿

我参与的团队

我的标签

随笔分类

随笔档案

相册

Friend Links

积分与排名

最新评论

阅读排行榜

评论排行榜