背景:
學習三層架構也有段時間了,之前覺得三層挺簡單的,就一集王繼彬老師的視訊,對三層有了大概的了解,通過後來的登入例子的實作,漸漸體會到沒有想象中的那麼簡單,三層架構的學習不能僅僅停留在理論的概念層面上,,在實踐中會了解到更多深層次的東西,這就是所謂的“站在岸上學不會遊泳”吧;三層對于之後的機房重構等來說是一個基礎,現在通過機房登入的小例子來了解三層。
【包圖】
【時序圖】
【通過代碼看三層架構】
——界面層(UI):通俗講就是展現給使用者的界面,即使用者在使用一個系統時的所見所得;
UI層:擷取使用者輸入的UserName,password傳給B層
<span style="font-family:KaiTi_GB2312;font-size:18px;">using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.SqlClient;
namespace Login.UI
{
public partial class Form1 : Form
{
static void Main(string[] args)
{
Application.EnableVisualStyles(); //激活應用程式顯示風格
Application.SetCompatibleTextRenderingDefault(false);//某些窗體控件在給它們的文本着色時可以使用 TextRenderer類也可以使用 Graphics類(False)。
Application.Run(new Form1());//啟動消息循環,顯示窗體
}
public Form1()//構造函數
{
InitializeComponent();//初始化窗體
}
private void btnLogin_Click(object sender, EventArgs e)
{
string userName = txtUserName.Text.Trim();//擷取使用者輸入的UerName,Password
string password = txtPassword.Text;
Login.BLL.LoginManager mgr = new BLL.LoginManager();//執行個體化一個登入服務類,将U層資料通過B層的執行個體傳遞給Model層
Login.Model.UserInfo user = mgr.UserLogin(userName, password);
MessageBox.Show("登入使用者:" + user.UserName);
}
}
</span>
——業務邏輯層(BLL):針對具體問題的操作,也可以說是對資料層的操作,對資料業務邏輯處理。
<span style="font-family:KaiTi_GB2312;font-size:18px;">namespace Login.BLL
{
public class LoginManager
{
public Login.Model.UserInfo UserLogin(string userName,string password)
{
Login.DAL.UserDAO uDao= new Login.DAL.UserDAO();//執行個體化一個UserDAO
Login.Model.UserInfo user = uDao.SelectUser(userName, password);
if (user!= null ) //login successfully
{
Login.DAL.ScoreDAO sDao = new DAL.ScoreDAO();//增加積分
sDao.UpdateScore(userName, 10);
return user;
}
else
{
throw new Exception ("登入失敗!"); //抛出異常
}
}
}
}</span>
BLL:向上連接配接U層,向下連接配接D層,根據U層傳來的消息,判斷使用者是否存在及是否增加積分,通過調用實體層與U層和D層傳輸資料,進行增加積分等功能的實作,避免了U層和D層之間的直接接觸,解除了二者之間的耦合。
——資料通路層(DAL):該層所做事務直接操作資料庫,針對資料的增添、删除、修改、更新、查找等。
<span style="font-family:KaiTi_GB2312;font-size:18px;">namespace Login.DAL
{
class DBUtil //連接配接資料庫類
{
public static string ConnString = @"Server=DESKTOP-DRNLL4P; Database=Login; User ID=sa; Password =123456";
}
}</span>
<span style="font-family:KaiTi_GB2312;font-size:18px;">namespace Login.DAL
{
public class ScoreDAO
{
public void UpdateScore(string userName, int value)
{
using (SqlConnection conn = new SqlConnection(DBUtil.ConnString)) //建立連接配接
{
SqlCommand cmd = conn.CreateCommand(); //建立指令
cmd.CommandText = @"INSERT INTO SCORES(UserName,Score)Values (@UserName,@Score)"; //插入字段值的SQL語句
cmd.Parameters.Add(new SqlParameter("@UserName", userName)); //增加參數
cmd.Parameters.Add(new SqlParameter("@Score", value));
conn.Open(); //打開連接配接
cmd.ExecuteNonQuery(); //插入資料(UserName,Score)
}
}
}
}
</span>
<span style="font-family:KaiTi_GB2312;font-size:18px;"> public class UserDAO
{
public Login.Model.UserInfo SelectUser(string userName,string password)
{
using (SqlConnection conn = new SqlConnection(DBUtil .ConnString) ) //建立連接配接
{
SqlCommand cmd = conn.CreateCommand();//建立指令
cmd.CommandText = @"SELECT ID,UserName,Password,Email FROM USERS WHERE UserName = @UserName AND Password = @Password"; //擷取或設定要對資料源執行的Transact-SQL語句、表名或存儲過程
cmd.CommandType = CommandType.Text; //擷取或設定一個值,該值訓示CommandText是一個SQL語句、存儲過程還是一個表操作,預設為SQL文本指令
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); //GetInt32獲得的是int類型,GetInt64獲得的是long類型(bigint)
user.UserName = reader.GetString(1);
user.Password = reader.GetString(2);
if (!reader.IsDBNull(3))
{
user.Email = reader.GetString(3);
}
}
return user;
}
}
}
}</span>
DAL:和資料庫打交道,SelectUser根據B層的參數查詢資料庫,讀取資料,最後将資料傳回給B層進行邏輯判斷。
總結
三層架構其實就是在界面層和資料通路層之間加了一個業務邏輯層,減少了界面層和資料通路層之間的依賴,U層、B層、D層之間都是逐級向下之間形成依賴關系,底層對于調用它的上層來說是無知的,是以改變上層的代碼,并不影響底層的實作,B層(業務邏輯層)處于核心位置,是解耦合關系的關鍵點,這才産生了所謂的三層架構。
對于三層的知識了解甚少,希望路過的朋友多多提意見。