文章題目 文章作者 發表日期 blog地址 設計自己的應用開發框架三(數據操作與業務實體) 俞兆平 2007/11/29 http://blog.csdn.Net/dzfb/
如需轉載請保留上述作者信息。
系列文章目錄:
通過前兩篇文章您應該了解為什麼需要自己的應用開發框架和該框架的整體結構了,從這一篇起,咱們就共同來探討一下如何在自定義框架中設計我們的通用數據操作和規范業務實體了。無論你習慣將你的程序分為多少層來設計,但是這些都是細分經典的MVC模式。而這個數據操作與業務實體其實就相當於MVC中的Model。
對於業務實體的設計,有的人喜歡用XML進行描述,有的人喜歡用類。前者的靈活性很好,對於多變的業務邏輯來說,前者是個不錯的方案。我選擇後者,這樣一來效率可以有一定的提高,設計上也更加簡便一些。
我們通過一張圖來概括的描述一下數據操作與業務實體的關系:
由上圖我們可以看出,不同的業務實體擁有相同的父類,通過該父類,我們可以讓所有的業務實體都具有最重要也是最基本的數據庫連接、數據操作、以及性能優化等功能。各個業務實體直接又絲毫沒有聯系,這樣一來當一個業務發生改變時完全不會影響到其它業務的運行,即便有聯系有影響,那也是在業務邏輯中應該規定的內容,我們將在下一篇文章中來具體闡述這部分問題。
下面我們通過具體的數據操作基類和一個業務實體的程序片段來展示一下如何編寫框架中的這部分代碼。
數據基類:
using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Data.SqlClIEnt;
using System.Configuration;
namespace TFW.Base.BusinessEntity
...{
public class SqlBaseBE
...{
private static SqlConnection Connect;
/**//// <summary>
/// SQL命令文本
/// </summary>
protected string CommandText;
private DataTable ValueTable;
/**//// <summary>
/// 參數集合
/// </summary>
protected SqlParameter[] Parameters;
SqlBaseBE#region SqlBaseBE
public SqlBaseBE()
...{
Connect = new SqlConnection("MSSQL數據庫連接字符串");
CommandText = "";
Parameters = null;
}
#endregion
LoadValueTable#region LoadValueTable /**//// <summary>
/// 查詢數據操作
/// </summary>
/// <returns>查詢後的Table</returns>
protected DataTable LoadValueTable()
...{
try
...{
SqlDataAdapter da = new SqlDataAdapter(this.CommandText, Connect);
if (Parameters != null)
...{
da.SelectCommand.Parameters.AddRange(Parameters);
}
DataSet ds = new DataSet();
da.Fill(ds);
&nb
sp; ValueTable = ds.Tables[0];
}
catch (SqlException ex)
...{
throw ex;
}
catch(Exception e)
...{
throw new Exception(e.Message + " 執行查詢語句: " + this.CommandText + " 時出現錯誤! ");
}
finally
...{
Connect.Close();
}
return ValueTable;
}
#endregion
ExecuteNonQuery#region ExecuteNonQuery
/**//// <summary>
/// 執行ExecuteNonQuery
/// </summary>
/// <returns>影響的行數</returns>
protected int ExecuteNonQuery()
...{
SqlCommand cmd = new SqlCommand();
cmd.Connection = Connect;
try
...{
Connect.Open();
cmd.CommandText = this.CommandText;
if (Parameters != null)
&nb
sp;...{
cmd.Parameters.AddRange(Parameters);
}
return cmd.ExecuteNonQuery();
}
catch(SqlException ex)
...{
throw ex;
}
catch(Exception e)
...{
throw new Exception(e.Message + " 執行更新語句: " + this.CommandText + " 時出現錯誤! ");
}
finally
...{
Connect.Close();
}
}
#endregion
}
}
我們在數據基類中提供了數據庫連接方式、參數傳遞方式以及數據獲得和數據執行,你還可以根據需要來擴充自己的數據基類,比如加入更多種類的數據庫連接方式(我們這裡只用MSSQL來做例子)和更好的數據連接性能方法(我們在這裡使用了.Net提供的連接池,Java的程序員就要自己來寫一個),加入存儲過程的調用等等,這需要通過app.config/web.config來做更多的配置,在這裡我想提醒大家,由於config文件是明文存在的,所以我們最好使用一些可逆的加密算法(如DES等)來轉換這些節點,能大大提高系統的安全性。如果您想將這部分研究的更加透徹,參照petshop及duwamish將對您有所幫助。好,下面讓我們再來看看數據實體的內容。
業務實體:
using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using TFW.Base.BusinessEntity;
using System.Data.SqlClIEnt;
namespace T.AppBETest
...{
public class DeleteBE : TFW.Base.BusinessEntity.SqlBaseBE
...{
public DeleteBE()
...{
this.CommandText = @"delete from student where studentnumber = @studentnumber";
}
public int DelData(int x)
...{
SqlParameter[] para = new SqlParameter[1];
para[0] = new SqlParameter("@studentnumber", x);
para[0].SqlDbType = SqlDbType.Int;
this.Parameters = para;
return this.ExecuteNonQuery();
}
}
}
很明顯,這是一個簡單的數據庫刪除業務實體。對於業務實體的編寫相對來說是簡單的,因為它就是對目標系統的業務進行描述,只要你的SQL語句過關,那麼在編寫這部分內容的時候就不會有什麼問題。不過,業務實體的編寫並不是屬於框架本身的范疇,它是在框架之外,作為目標系統底層的組成部分來編寫的,這裡給出范例是為了讓您清楚的看到如何來利用數據基類為業務實體提供相關功能和規范。
多個業務實體在數據基類的幫助下,就能夠方便的被業務邏輯層所控制,我們將在下一篇文章中來詳細闡述這部分內容。