天天看點

.NET解析網站三層架構

       所謂三層架構就是指資料通路層(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就是一個完全典型的三層架構經典,有興趣的可以去研究下,保證受益非淺!