所謂的三層分為物理上的三層和邏輯上的三層。
物理上的三層包括:客戶端(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; }
}
}



