来自CodeSmith的震撼

文章讨论了项目开发中ORM和ADO.NET的应用。ORM在应用程序类和数据库表间建立关系,利于维护但初期拖慢开发速度;ADO.NET直接操作无法纵向分割项目。还介绍了CodeSmith,它是快速代码生成工具,克服模板工具灵活性不足,在效率和定制性间取得平衡。

前面我有一篇随笔重复,为什么我们要不断重复讲述的是我在项目开发中的苦恼,引发了很多人讨论,大家各出高招,有人提到ORM,按我的愚见,ORM是在应用程序的类和数据库中表及视图建立一对一关系,例如,数据库中有表tblarticle,那么与之对应,我们可以建立一个articleItem对象来表示单条的记录,表的每个字段做为articleItem的成员变量,对应表的insert,update,delete以及select item及select all等存储过程,我们可以为articleitem建立对应的方法,然后在方法中用ADO.NET及对应的存储过程来完成数据的抽取,修改等.并且,我们可以在articleitem的基础上建立articleitemcollection以表示多条记录,这样,就将单条记录的更新变成了建立一个articleitem对象,给article对象的各种属性赋值,最后调用像articleitem,update()这样的方法来完成数据操纵的目的.这种实现方式其实很容易令人接受,并且,如果A负责写数据存取层的话,B用的时候,几乎不用关心是在操纵哪个表,而只关心操纵的是何种对象.非常类似我们使用.NET类库中对象一样.

可是,听起来不错,但如果真的要你去用ORM做一个项目的时候,你会发现代码量远远大于使用"传统"的直接用ADO.NET调用存储过程的方法.虽然使用ORM可以让我们项目在以后的维护中更加容易,可是,在项目的初期,真的会拖慢开发速度,所以,很多博客堂的朋友觉得,与其ORM,不如就用ADO.NET来

可是,ADO.NET直接操作首先带来的问题是,你的项目只能模向分隔(比如,你可以把为一个数据库中某几个表写数据存取层的任务交给A,另外的交给B),无法进行纵向层次的分割,如果用ORM,你可以让A负责写数据存取层,让B写对象层,让C写业务逻辑层,协作上容易的多.

既然传统方法和ORM都不是那么完美.那有没有更好的方法呢?虽然我也听说过"银弹"故事.我也相信世界上没有银弹.但是我仍然孜孜不倦的追求完美,仍然想找到合适的解决方案.

CodeSmith这个软件在博客堂和优快云不知道有多少人提过了.大多数的解释是CODeSmith是一个快速代码生成工具.试用后,CodeSmith给我了强烈的震撼,假如它只是一个基于模板的代码生成工具.那么我不认为有什么了不起.可是它竟然克服了模板生成工具的灵活性不足缺陷.它在高效率和高定制性间取得了完美的平衡.如果你没有用过他,我可以告诉你他有以下特点:

1.他可以用于生成C#,VB.NET,TSQL以及其他任何语言代码
2.他本身是可以编程的(这是他的灵活性之源)
3.他提供了强大的SchemaExplorer对象,使数据库储过程的生成非常容易
4.有了他,你不会再向我一样埋怨从一个项目到另一个项目时,需要重新写许多代码.因为你只需要一套模板而已
5.他使用的语法是典型的ASP.NET语法,并且,可以像我们写ASP那样将代码和静态内容混和撰写(好像在写ASP的时代一样)

举一个简单的例子,你就可以明白他的强大
下面是我根据Quick Start Guide写的一个模板,作用是生成一个简单的类框架,不要小看他呀

None.gif <% @ CodeTemplate Language = " C# "  TargetLanguage = " C# "   Debug = " False "  Description = " Simple CodeSmith Project "   %>
None.gif
<% @ Property Name = " Developer "  Type = " System.String "  Category = " Context "  Description = " 开发者名称 "   %>
None.gif
<% @ Property Name = " NameSpace "  Type = " System.String "  Category = " Context "  Description = " 名字空间 "   %>
None.gif
<% @ Property Name = " ClassName "  Type = " System.String "  Category = " Context "  Description = " 类名 "   %>
ExpandedBlockStart.gifContractedBlock.gif
/**/ ///////////////////////////////////////////////////////////////////////////////////////
None.gif // 文件名:<%=ClassName%>.cs
None.gif
// 说明:一个简单的类架构生成器
None.gif
// 版权所有 @ <%=DateTime.Now.Year%>  客户名称
None.gif
// 历史更新
None.gif
//         <%=DateTime.Now%>        <%=Developer%>    零版本
ExpandedBlockStart.gifContractedBlock.gif
/**/ ///////////////////////////////////////////////////////////////////////////////////////
None.gif using  System;
None.gif
namespace   <%= NameSpace %>
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif    
/**////<summary>    
InBlock.gif    
///测试类
ExpandedSubBlockEnd.gif    
///</summary>

InBlock.gif    public class <%=ClassName%>
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif    
ExpandedSubBlockStart.gifContractedSubBlock.gif        
/**////<summary>
InBlock.gif        
///构造器
ExpandedSubBlockEnd.gif        
///</summary>

InBlock.gif        public <%=ClassName%>()
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
ExpandedSubBlockEnd.gif        }

InBlock.gif        
InBlock.gif        
~<%=ClassName%>
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif        
ExpandedSubBlockEnd.gif        }

InBlock.gif        
ExpandedSubBlockEnd.gif    }

InBlock.gif    
ExpandedBlockEnd.gif}

这段模板生成的C#代码如下
ExpandedBlockStart.gif ContractedBlock.gif /**/ ///////////////////////////////////////////////////////////////////////////////////////
None.gif // 文件名:MyClass.cs
None.gif
// 说明:一个简单的类架构生成器
None.gif
// 版权所有 @ 2005  客户名称
None.gif
// 历史更新
None.gif
//         2005-5-19 17:39:13 上午        Heroman    零版本
ExpandedBlockStart.gifContractedBlock.gif
/**/ ///////////////////////////////////////////////////////////////////////////////////////
None.gif using  System;
None.gif
namespace  FunSoft
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif    
/**////<summary>    
InBlock.gif    
///测试类
ExpandedSubBlockEnd.gif    
///</summary>

InBlock.gif    public class MyClass
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif    
ExpandedSubBlockStart.gifContractedSubBlock.gif        
/**////<summary>
InBlock.gif        
///构造器
ExpandedSubBlockEnd.gif        
///</summary>

InBlock.gif        public MyClass()
ExpandedSubBlockStart.gif

转载于:https://www.cnblogs.com/Heroman/archive/2005/05/19/159086.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值