架构人生

持久数据层框架设计(一)

前言:

持久数据层框架是我在研究NHibernate后,受它的启发做的一次创新。当前版本支持多数据库,O/R Mapping等,同时与NHibernate相比,它是一个轻量级框架,在学习和应用上显得更加简单。以下是我的初稿,第一次将我的研究成果展现出来,有不对的地方或更好的建议,欢迎点评。

1.     以下是数据层调用接口: 

        int CreateDbTable(object objTable); 
        
bool IsExistTable(string tableName); 
        
int ExcuteSql(string sql); 
        
int Insert(string tableName, Hashtable values); 
        
int Update(string tableName, Hashtable values, string wher); 
        DataTable Query4DataTable(
object obj); 
        
string Query4Value(string sql); 
        
string Query4Value(string sql, int columnIndex); 
        
int GetCount(string sql); 
        
void BeginTransaction(); 
        
void Commit(); 
        
void Rollback(); 
        List<ValueText> Query4VtObject(
string sql); 
        DataSet Query4DataSet(
object obj); 
        IResultSet Query4ResultSet(
string sql); 
        Hashtable Query4Hashtable(
string sql); 
        DataRow Query4DataRow(
string strSql); 
        IDataReader Query4DataReader(
string strSql);      
        
int Insert(object ormTable); 
        
int Update(object ormTable); 
        
int Delete(object ormTable); 
        
bool Delete(string tableName); 

 
2.     以下是数据层调用入口:

 1         /// <summary> 
 2         /// Default Handler Operator for any database 
 3         /// </summary> 
 4         public static IDbOperator DefaultDbOperator() 
 
5         { 
 
6             //get instance by db interface, such as SQL Server, Access, MYSQL, 
 7             Instance instance = new Instance(); 
 
8             object objDb = instance.GetInstance(); 
 
9             IDbOperator db = objDb as IDbOperator; 
10             if (db == null
11             { 
12                 throw new NotSuportedDbException(); 
                   
//need to write a library to support this database
13             } 
14             return db; 
15         }

 

在调用数据时,只需要使用

IDbOperator db=DbFactory.DefaultDbOperator(); 

3.     数据层后台配置:

从下面的配置,大家就应该可以看出,持久数据层框架支持任何类型的数据库。 

  <Data DbType="SQLServer"> 
     
<SQLServer type="Zivsoft.Data.SQLServerDbOperator;SQLServer"> 
      
<add key="ConnectionString" value="…"/> 
      
<add key="AutoCreateTable" value="true"/> 
            
<add key="AutoCreateDb" value="false"/> 
     
</SQLServer>
     
<MySQL type="Zivsoft.Data.MySQLDbOperator;MySQL"> 
      
      <add key="ConnectionString" value="…"/> 
      
      <add key="AutoCreateTable" value="true"/> 
            
<add key="AutoCreateDb" value="false"/> 
     
</MySQL>
  
</Data> 


4. 持久数据层对ORM支持

NHibernate中,每一个实体类都对应一个XML文件,个人看来有些复杂,因此,在此框架中,做了创新:

以下是自动生成的UserInfo.cs文件实体类完整代码:

using System; 
using System.Data; 
/**************************************************** 
 * 
 * Automatically Created by Zivsoft.Data.ORM.Setup 
 
 *****************************************************/
 
namespace Zivsoft.Data.ORM.Table 

    
   public class UserInfo:OrmTable 
    
  
        
#region UserId 
        [PrimaryKey(
"UserId",DbType.String)] 
        
public ColumnValue<string> UserId
            
get
                 
return new ColumnValue<string{ Name = "UserId", Value = GetString("UserId");
            } 
            
set
                Fields[
"UserId"]=value.Value; 
            } 
        } 
        
#endregion 

        #region Password 
        [Column(
"Password",DbType.String)] 
        
public ColumnValue<string> Password
         
get
                  
return new ColumnValue<string{Name = "Password", Value = GetString("Password")}; 
        } 
        
set
              Fields[
"Password"]=value.Value; 
        } 
     } 
        
#endregion 

        
#region LoginTime 
        [Column(
"LoginTime",DbType.DateTime)] 
        
public ColumnValue<DateTime?> LoginTime
           
get
                  
return new ColumnValue<DateTime?> 
                       Name = 
"LoginTime", Value = GetDateTime("LoginTime"
                  }; 
            } 
           
set
               Fields[
"LoginTime"]=value.Value; 
            } 
        } 
        
#endregion 
    } 
}

通过以上实体类,可以看出只有得到这个类,对应数据库表所有字段、类型、表名信息全部可以得到。

比如,得到表名的信息:

                            var name=new UserInfo().GetName();

            得到字段UserId的对应数据库名称:

                             var name=new UserInfo().UserId.Name;

            另外,所有实体类,都可以通过框架自制工具根据数据库生成实体类代码。

5.     框架内嵌数据组件

由于持久数据层对业务无关,因此开发了一个内嵌数据组件。此组件在使用时只需要对其配置,便可显示所需要数据,包括修改、删除、添加等操作。

posted on 2009-03-09 10:41  智艾悦  阅读(4244)  评论(34编辑  收藏  举报

导航