實踐是檢驗真理的唯一標準,下面我們使用三層架構實踐一個簡單的“登錄”業務。學以致用,來親身感受一下三層架構的呼吸。
以上是啓動界面,屬於U層,它是Winform形式的,還有web方式的。用戶在此輸入用戶名與密碼後,系統驗證密碼是否正確。注意,爲了簡單易行,要求輸入的用戶名在數據庫中的User表中存在,否則就會報錯。以下是整體的代碼結構。
接下來看一看具體每一層中的代碼:
實體層:
<span style="font-family:SimSun;font-size:18px;"> public class User
{
private string userName = string.Empty;//string.Empty就相當於"",一般用於字符串的初始化
private string pwd = string.Empty;
public string UserName { get; set; }
public string Pwd { get; set; }
}</span>
UI:
<span style="font-family:SimSun;font-size:18px;"> private void btnOK_Click(object sender, EventArgs e)//點擊“確定”按鈕,開始驗證用戶信息
{
//聲明一個bool類型的變量用來接收登錄狀態,登錄成功/失敗
bool result = false;
//檢查用戶名與密碼是否爲空
if (txtUserName .Text =="")
{
MessageBox.Show ("用戶名不能爲空!");
txtUserName.Focus();
return;
}
if (txtPassword .Text =="")
{
MessageBox.Show("密碼不能爲空!");
txtPassword.Focus();
return;
}
//聲明一個用戶對象,將用戶輸入的用戶名和密碼賦於這個用戶對象
User euser = new User();
euser.UserName = txtUserName.Text.Trim();
euser.Pwd = txtPassword.Text;
//訪問B層
LoginServer blogin = new LoginServer();
result = blogin.BLogin(euser);//B層驗證密碼後,返回一個布爾值,傳到此處
if (result ==true )//如果返回true,則登錄成功
{
MessageBox.Show("登錄成功!");
}
else //返回false,密碼輸入錯誤,登錄失敗
{
MessageBox.Show("登錄失敗!");
}
}
private void btnCancel_Click(object sender, EventArgs e)//點擊“取消按鈕”,關閉窗體
{
this.Close();
}</span>
BLL:
<span style="font-family:SimSun;font-size:18px;"> public class LoginServer //驗證用戶密碼是否正確
{
public bool BLogin(User User)
{
UserDAL duser = new UserDAL();//訪問D層,連接數據庫
User euser = new User();
euser = duser.DLogin(User);//接下來的任務在D層中進行,從數據表中獲取該用戶名的密碼
//如果該用戶輸入的密碼與數據表中的一樣,則爲真,登錄成功;反之爲假。
if (euser .Pwd ==User .Pwd )//euser是D層返回的實體類,攜帶着數據庫中存儲的用戶信息,User攜帶用戶輸入的用戶信息,將二者攜帶的密碼進行比較
{
return true;
}
else
{
return false;
}
//得到真假後,回到U層,回饋給用戶操作結果
}
}</span>
DAL:
<span style="font-family:SimSun;font-size:18px;"> public class UserDAL
{
//連接數據庫
public static string conString = @"Server=CYL-PC; Database=Login; User ID=sa; Password=123456";
SqlConnection cnn = new System.Data.SqlClient.SqlConnection(conString);
//根據輸入的用戶名獲取用戶密碼
public User DLogin(User user)
{
string sqlString="select * from Users where UserName='"+user .UserName +"'";
User euser = new User();
SqlCommand cmd = new SqlCommand(sqlString, cnn);
//打開數據庫
cnn.Open();
SqlDataReader read;
read = cmd.ExecuteReader();
read.Read();
//將User表中的用戶信息賦予給實體類,並將其返回B層
euser.UserName = read[0].ToString();
euser.Pwd = read[1].ToString();
return euser;
}
}</span>
數據庫Login中User表:
代碼中的註釋寫得比較詳細,但在實際運行中,並不是一條龍執行下去。U層引用B層,B層引用D層,這三層都引用Entity。接下來將上述流程整體串一下。啓動系統後,首先顯示系統登錄界面,用戶輸入用戶名和密碼後進行密碼驗證(若不輸入,點“確定”後系統檢測到空,重新回到登錄界面)。具體的驗證過程是這樣的,三層都需實例化一個實體層中的User對象,其中U層的User攜帶用戶輸入的用戶信息(用戶名和密碼);D層根據用戶輸入的用戶名在數據庫中找到該用戶信息,讓D層的User攜帶,然後傳遞給B層的User。在B層執行具體的驗證過程,U層User攜帶的密碼與B層User攜帶的密碼比較,若二者相同,則顯示“登錄成功”向用戶反饋,反之提醒“登錄失敗”。我的表達能力有限,預知清晰的執行內幕,逐語句調試(F11)。
在這三層中,DAL只提供基本的數據訪問,UI只負責顯示和採集用戶操作,他們都不包含任何與業務相關的邏輯處理。BLL負責處理業務邏輯,通過獲取UI傳來的操作指令,執行業務邏輯,在需要訪問數據源的時候交給DAL處理。處理完成後,返回必要的數據給UI。實體層在他們之間上躥下跳,三層都不知道User中的具體內容。這樣做的好處就是,實現了高內聚,低耦合。各層分工協作,各司其職,有條不紊。增強了軟件系統的可擴展性、可複用性、可維護性。