所謂的三層分為物理上的三層和邏輯上的三層。
物理上的三層包括:客戶端(PC)、應用服務器、數據庫服務器。
邏輯上的三層,也就是我們要討論的,分為表示層、業務邏輯層、數據訪問層。
實體層,嚴格的來說不屬於三層中的任一層,它是獨立於其他三個層次的,只能供其他層次進行引用,但是不能引用其他的三個層次。
數據在三層中的一個具體走向圖
三層應用原則:
- DAL(數據訪問層)只提供基本的數據訪問,不包含任何的業務邏輯
- UI只負責顯示和采集用戶操作,不包含任何業務相關的邏輯處理
- BLL(業務邏輯層)負責處理業務邏輯。通過獲取UI傳來的用戶指令,執行業務邏輯,在需要訪問數據源的時候,直接交給DAL進行處理。處理完成后,返回必要數據給UI。
實現步驟:
(1)前期准備:
1.根據上一層引用下一層以及實體層在各層的作用,繪制UML圖。
2.根據UML圖顯示的關系,構建三層框架。
3.建立數據庫,包含UserInfo表。
(2)代碼實現階段
1.用戶界面層(LoginUI):
作用:
- 向用戶展現特定業務數據
- 采集用戶的輸入信息和操作
添加類:frmLogin
namespace LoginUI { public partial class frmLogin : Form { public frmLogin() { InitializeComponent(); } private void btnLogin_Click(object sender, EventArgs e) { //UI層將用戶輸入數據傳遞給BLL層 string userName = txtUserName.Text.Trim(); string password = txtPassword.Text; Login.BLL.LoginManager mgr = new Login.BLL.LoginManager(); Login.Model .UserInfo user= mgr.UserLogin (userName, password); //UI層返回業務層傳遞的數據給用戶 MessageBox.Show("登錄用戶:" + user.UserName); }
2.業務邏輯層(LoginBLL):
作用:
- 從DAL獲取數據,提供UI顯示
- 從UI獲取用戶和指令,執行業務邏輯
- 從UI獲取用戶和指令,通過DAL寫入數據
BLL的職責機制:
UI→BLL→UI
UI→BLL→DAL→BLL→UI
添加類:LoginManager
namespace Login.BLL { public class LoginManager { public Login.Model .UserInfo UserLogin(string userName,string password) { Login.DAL.UserDAO uDao = new Login.DAL.u (); //實例化DAL層 Login.Model.UserInfo user = uDao.SelectUser(userName, password); //不需要訪問數據源,直接執行業務邏輯 if (user != null) { return user; } else { throw new Exception("登錄失敗"); } } } }
3.數據訪問層(LoginDAL):
作用:SELECT、INSERT/UPDATE、DELETE
添加類:UserDAO
namespace Login.DAL { public class UserDAO { public Login.Model.UserInfo SelectUser(string userName, string Password) { //建立數據庫連接 string ConnString = @"Server =192.168.24.45;DataBase =Login; User ID =sa ;Password =123"; using (SqlConnection conn = new SqlConnection(ConnString)) { //執行SQL語句進行查詢 SqlCommand cmd = conn.CreateCommand(); cmd.CommandText = @"SELECT ID,UserName,Password,Email FROM UserInfo WHERE UserName =@UserName AND Password =@Password"; //輸出查詢結果 cmd.CommandType = CommandType.Text; //添加兩個參數 cmd.Parameters.Add(new SqlParameter(@"UserName", userName)); cmd.Parameters.Add(new SqlParameter(@"Password", Password)); conn.Open(); SqlDataReader reader = cmd.ExecuteReader(); Login.Model.UserInfo user = null; //讀取具體的數據 while (reader.Read()) { if (user == null) { user = new Login.Model.UserInfo(); } //讀取查詢到的數據 user.ID = reader.GetInt32(0); user.UserName = reader.GetString(1); user.Password = reader.GetString(2); if (!reader.IsDBNull(3)) { user.Email = reader.GetString(3); } } return user; } } } }
4.實體(LoginModel):
作用:封裝數據,使數據在三層中傳輸 ,更傾向於業務邏輯層
添加類:UserInfo
namespace Login.Model { public class UserInfo { //定義用戶屬性 public int ID { get; set; } public string UserName { get; set; } public string Password { get; set; } public string Email { get; set; } } }