所謂三層架構就是指資料通路層(Data Access Layer)、業務邏輯層(Business Logic Layer)、界面表示層(英語忘了..)
在MS.NET裡,ASP.NET有項技術叫Code Behind,它預設已經提供了二層。比如建立一個網頁檔案.aspx後就自動有一個.cs檔案與之比對,這裡.aspx就是界面表示層而.cs就是業務邏輯層。
那麼三層架構無非是多抽象了一層資料通路層,把所有和資料庫打交道的方法都封裝到了資料通路層這個抽象類中。以下我舉個簡單的例子來描述什麼是三層架構,界面層就不說了。
一、簡單的資料通路層
public class Admin
{
public static bool Insert(string userName,string userPass)
{
//資料庫連接配接字元串
SqlConnection conn=new SqlConnection("...");
//SQL語句操作
SqlCommand cmd=new SqlCommand("insert into admin ...",conn);
//SQL語句參數
SqlParameter parm1=new SqlParameter("@User",SqlDbType.VarChar,50);
parm1.Value=userName;
...
conn.Open();
//執行SQL語句操作
cmd.ExecuteNonQuery();
conn.Close();
}
public static bool Update(…)
}
以上抽象了一個Admin類,類中有個靜态方法Insert,業務邏輯層如果要調用這個層的方法,隻要Admin.Insert(this.tbUser.Text,this.tbPass.Text);
二、簡單的業務邏輯層
public class WebForm1 : System.Web.UI.Page
{
protected System.Web.UI.WebControls.TextBox TextBox1;
protected System.Web.UI.WebControls.TextBox TextBox2;
protected System.Web.UI.WebControls.Button Button1;
private void Button1_Click(object sender, System.EventArgs e)
{
string userName=this.TextBox1.Text;
string userPass=this.TextBox2.Text;
Admin.Insert(userName,userPass);
}
}
三、改進的資料通路層
心細的讀者會發現,上面的抽象類Admin裡每個方法都要寫SqlConnection、SqlCommand這樣的效率是不高的,那麼如何來改進呢?答案是再多一個加工類,把日常的資料庫操作都封裝進去!比如PetShop3.0提供的一個SQLHelper類,那麼Admin類中的方法就可以這麼寫
public class Admin
{
public static bool Insert(string userName,string userPass)
{
string sql=”insert into admin…”;
SqlParameter[] parm=new SqlParameter[2];
parm[0]= new SqlParameter("@User",SqlDbType.VarChar,50);
parm[0].Value=userName;
...
//SQLHelper.ExecuteNonQuery實作SqlCommand的ExecuteNonQuery功能
//SQLHelper.CONN_STRING是資料庫連接配接字元串
SQLHelper.ExecuteNonQuery(SQLHelper.CONN_STRING,sql,…);
}
public static bool Update(…)
}
四、再改進的資料通路層
假如有這樣的情況,如果上面的Admin類中的Insert方法,參數很多,大于5個,那麼業務邏輯層要傳遞參數時要一個一個傳咯?這樣顯然很不好!不過也好辦!再抽象一個類把所有參數封裝起來(就象C中的結構體)那麼Admin類的方法就變為
public class Admin
{
public static bool Insert(AdminInfo adminInfo)
{
string sql=”insert into admin…”;
SqlParameter[] parm=new SqlParameter[2];
parm[0]= new SqlParameter("@User",SqlDbType.VarChar,50);
parm[0].Value=adminInfo.userName;
SQLHelper.ExecuteNonQuery(SQLHelper.CONN_STRING,sql,…);
}
public static bool Update(…)
}
上面實作了最簡單的資料通路層以及稍微改進的資料通路層,這樣一個三層架構就實作了。比如一個使用者想插入一個新Admin資訊到資料庫,其一般的執行過程是:
(1) 使用者在界面輸入使用者名和密碼 點送出
(2) 這時到了業務邏輯層,它接受并處理該業務。具體是把界面層傳遞過來的參數打包封裝并傳遞給資料通路層,然後調用其資料通路層方法
(3) 資料通路層通過于資料庫的互動完成使用者的操作,并傳回操作結果給上一層
目前還有一些工程是四層、五層、N層的。還可以再封裝一個資料層接口層與接口工廠類,可以實作完全對資料庫透明,即不管資料庫采用Sql Server還是Oracle,隻要在Web.config裡寫一個字元串來辨識即可自動轉接。微軟著名的PetShop3.0就是一個完全典型的三層架構經典,有興趣的可以去研究下,保證受益非淺!