三層學習------實踐篇

   實踐是檢驗真理的唯一標準,下面我們使用三層架構實踐一個簡單的“登錄”業務。學以致用,來親身感受一下三層架構的呼吸。


    以上是啓動界面,屬於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中的具體內容。這樣做的好處就是,實現了高內聚,低耦合。各層分工協作,各司其職,有條不紊。增強了軟件系統的可擴展性、可複用性、可維護性。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章