前面我有一篇随笔重复,为什么我们要不断重复讲述的是我在项目开发中的苦恼,引发了很多人讨论,大家各出高招,有人提到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这个软件在博客堂和CSDN不知道有多少人提过了.大多数的解释是CODeSmith是一个快速代码生成工具.试用后,CodeSmith给我了强烈的震撼,假如它只是一个基于模板的代码生成工具.那么我不认为有什么了不起.可是它竟然克服了模板生成工具的灵活性不足缺陷.它在高效率和高定制性间取得了完美的平衡.如果你没有用过他,我可以告诉你他有以下特点:

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

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

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

    
///<summary>    
    
///测试类
    
///</summary>

    public class <%=ClassName%>
    
{
    
        
///<summary>
        
///构造器
        
///</summary>

        public <%=ClassName%>()
        
{
        }

        
        
~<%=ClassName%>
        
{
        
        }

        
    }

    
}

这段模板生成的C#代码如下
///////////////////////////////////////////////////////////////////////////////////////
//文件名:MyClass.cs
//说明:一个简单的类架构生成器
//版权所有 @ 2005  客户名称
//历史更新
//        2005-5-19 17:39:13 上午        Heroman    零版本
///////////////////////////////////////////////////////////////////////////////////////
using System;
namespace FunSoft
{

    
///<summary>    
    
///测试类
    
///</summary>

    public class MyClass
    
{
    
        
///<summary>
        
///构造器
        
///</summary>

        public MyClass()