【前言】
終於學習到三層了~接下來也要下功夫學習機房重構了,給自己加油!
【內容】
1.什麼是三層架構
三層架構分爲物理上的和邏輯上的,其中:
(1)在物理上是顯示層、業務層、數據層,下面是一個應用軟件的三層架構模型:
(2)邏輯上:UI 層、BLL 層、DAL層。
在這裏,我們主要來學習邏輯上的三層。
2.三層具體介紹
(1)數據訪問層(DAL)
處理一切和數據庫直接進行交互的操作,如數據庫的增刪改查。
1)DAL的作用
從數據源加載數據(Select);
向數據源寫入數據(Insert/Update);
從數據源刪除數據(Delete)。
2)DAL中常用的技術
ADO.NET + SQL語句;
O/R Mapping框架;
訪問SQL Server數據庫時Ling to SQL。
(2)顯示層(UI)
也稱用戶界面層,是用戶所看的到的界面。
1)UI的作用
向用戶展現特定業務數據;
採集用戶的輸入信息和操作。
2)UI設計的原則
用戶至上,兼顧簡潔。
3)UI中常用的技術
WindowsForm:Form、Control
ASP.NET:aspx、ascx、master、html
(3)業務邏輯層(BLL)
主要做業務邏輯判斷和計算。
1)BLL的作用
從DAL中獲取數據,以供UI顯示用;
從UI中獲取用戶指令和數據,執行業務邏輯;
從UI中獲取用戶指令和數據,通過DAL寫入數據源。
2)BLL的職責機制
——UI->BLL->UI
UI發出業務請求到BLL,BLL處理完後將結果返回給UI層。
——UI->BLL->DAL->BLL->UI
UI發送業務請求到BLL,BLL向DAL發送數據請求,DAL將查到的相關數據返到BLL層,BLL層處理完後將結果返回到UI層。
3.具體應用原則
(1)DAL只提供基本的數據訪問,不包含任何業務相關的邏輯處理;
(2)UI只負責顯示和採集用戶操作,不包含任何的業務相關的邏輯處理;
(3)BLL負責處理業務邏輯。通過獲取UI傳來的操作指令,決定執行業務邏輯,在需要訪問數據源的時候直接交給DAL處理;處理完成後,返回必要數據給UI。
4.三層之間關係圖
5.代碼部分
UI層代碼實現
//獲取用戶輸入的用戶名
string userName = txtUserName.Text.Trim();
//獲取用戶輸入的密碼
string password = txtPassword.Text;
//和業務邏輯層進行交互,實例化一個BLL層對象
Login.BLL.LoginManager mgr = new Login.BLL.LoginManager();
//和Model交互,建立對象user用來接收數據鏈路層產生的user信息
Login.Model.UserInfo user = mgr.UserLogin(userName,password);
//登錄成功
MessageBox.Show("登錄用戶:" + user.UserName);
DAL層代碼實現
//連接數據庫
namespace Login.DAL
{
class DbUtil
{
public static string ConnString = @"Server=FRJ;DataBase=Login;User ID=sa;Password=123";
}
}
//UserDAO實現
namespace Login.DAL
{
public class UserDAO
{
public Login.Model.UserInfo SelectUser(string userName, string password)
{
//實例化一個對象cnn,用來打開數據庫連接
using (SqlConnection conn = new SqlConnection(DbUtil.ConnString))
{
//實例化一個對SQL執行操作的對象
SqlCommand cmd = conn.CreateCommand();
//設置執行的SQL語句
cmd.CommandText = @"SELECT ID,UserName,Password,Email
FROM Users 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讀取數據
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; //將用戶信息返回給BLL層
}
}
}
}
//ScoreDAO實現
namespace Login.DAL
{
public class ScoreDAO
{
//更新分數
public void UpdateScore(string userName, int value)
{
//實例化對象cnn,使用using會自動關閉連接
using (SqlConnection conn = new SqlConnection(DbUtil.ConnString))
{
//創建一個執行數據庫操作的對象
SqlCommand cmd = conn.CreateCommand();
//設置執行的SQL語句
cmd.CommandText = @"INSERT INTO Scores(UserName,Score) Values(@UserName,@Score)";
//獲取並添加參數的值
cmd.Parameters.Add(new SqlParameter("@UserName", userName));
cmd.Parameters.Add(new SqlParameter("@Score", value));
//打開連接
conn.Open();
//執行SQL語句並返回受影響的行數
cmd.ExecuteNonQuery();
}
}
}
}
BLL層代碼實現
//中介者,接收UI層傳來的操作,需要數據訪問時將數據傳給DAL層
public Login.Model.UserInfo UserLogin(string userName, string password)
{
//實例化一個DAL的用戶表對象
Login.DAL.UserDAO uDao = new Login.DAL.UserDAO();
//建立一個user對象,接收DAL層查到的用戶信息
Login.Model.UserInfo user = uDao.SelectUser(userName,password);
//登錄成功
if (user != null)
{
//實例化一個DAL層的分數表對象
Login.DAL.ScoreDAO sDao = new Login.DAL.ScoreDAO();
//登錄成功後,更新Scores表
sDao.UpdateScore(userName,10);
return user;
}
//登錄失敗
else
{
throw new Exception("登錄失敗。");
}
}
數據模型Model代碼實現
//三層之間傳遞參數的數據模型
public class UserInfo
{
public int ID { get; set; }
public string UserName { get; set; }
public string Password { get; set; }
public string Email { get; set; }
}