天天看點

三層架構:登入執行個體總結

前言:

  三層結構是基于子產品化程式設計的思想,為實作分解應用程式的需求,而逐漸形成的一種标準模式的子產品劃分方法。三層架構的優點在于不必為了業務邏輯上的微小變化而遷至整個程式的修改,隻需要修改商 業邏輯層中的一個函數或一個過程;增強了代碼的可重用性;便于不同層次的開發人員之間的合作,隻要遵循一定的接口标準就可以進行并行開發了,最終隻要将各個部分拼接到一起構成最終的應用程式。

What?

什麼是三層?

UI(顯示層)、BLL(業務邏輯層)、DAL(資料通路層)

三層架構:登入執行個體總結

   (兩層結構)

三層架構:登入執行個體總結

  (三層結構)

各層之間的引用關系:UI -> BLL -> DAL

關系圖

三層架構:登入執行個體總結

1.DAL隻提供基本的資料通路,不包含任何業務相關的邏輯處理;

2.UI隻負責顯示和采集使用者操作,不包含任何的業務相關的邏輯處理;

3.BLL負責處理業務邏輯,通過擷取UI傳來的操作指令,決定執行業務邏輯,在需要通路資料源的時候直接交給DAL處理。處理完成後,傳回必要資料給UI。

How?

1.連接配接資料庫并建表

三層架構:登入執行個體總結

2.建立四個項目,在U層繪制登入界面

三層架構:登入執行個體總結

UI層

namespace LoginUI
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void btnLogin_Click(object sender, EventArgs e)
        {
            try
            {
                string userName = txtUserName.Text.Trim();
                string password = txtPassword.Text;
                //取出使用者界面的資料 

                LoginBLL.LoginManager mgr = new LoginBLL.LoginManager();
                //需要調用BLL層,執行個體化一個對象
                Login.Model.UserInfo user = mgr.Login(userName, password);
                //調用BLL層的方法,将使用者輸入的資訊作為參數傳入該方法

                MessageBox.Show("登入使用者:" + user.UserName);
                //如果登陸成功則顯示登入使用者名
            }
            catch (Exception ex)
            //如有登入異常,則提示登入失敗,這裡的catch對應B層中的Try
            {

                MessageBox.Show(ex.Message );
            }
        }
    }
}

           

DAL層

namespace Login.DAL
{
    class DbUtil
    {
        public static string ConnString = @"Server =BRYANT; Database =Login; User ID = sa;Password =123";
        //建立資料庫連接配接字元串
    }
}

namespace Login.DAL
{
    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";
                //連接配接資料庫(注意資料庫名稱及登入名和密碼)
                cmd.CommandType = CommandType.Text;
                //文本類型
                cmd.Parameters.Add(new SqlParameter("@UserName", userName));
                cmd.Parameters.Add(new SqlParameter("@Password", password));
                //給指令對象添加參數
                conn.Open();//打開資料庫連接配接。添加後解決Conn關閉異常
                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;
            }

        }
    }
}

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)";
                 cmd.Parameters.Add(new SqlParameter("@UserName",userName ));
                 cmd.Parameters.Add(new SqlParameter("@Score", value));
                 //Scores表的主鍵設定錯誤,導緻不能重複登入,修改資料庫中表的主鍵則解決該問題。
                 conn.Open();//打開資料庫連接配接,解決conn關閉異常
                 cmd.ExecuteNonQuery();
             }
         }
    }
}

           

BLL層

namespace LoginBLL
{
    public class LoginManager
    {
        public UserInfo Login(string userName, string password)
        {
            
            //throw new NotFiniteNumberException();
            Login.DAL.UserDAO uDao = new Login.DAL.UserDAO();
            //Login之前一直報檢測到無法使用代碼,原因是上一句未注釋。
            Login.Model.UserInfo user    = uDao.SelectUser(userName, password);

            if (user != null )
            {
                Login.DAL.ScoreDAO sDao = new Login.DAL.ScoreDAO();
                sDao.UpdateScore(userName, 10); 
                return user;
            }
            else
            {
                throw new Exception("登入失敗!");
                //一個throw 對應一個Catch,并且彈出的顯示在U層中顯示出來
            }
        }
    }
}
           

實體層

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; }
       //實體類,用于儲存使用者資訊
    }
}
           

成功啦!

三層架構:登入執行個體總結

問題調試部落格:

http://blog.csdn.net/l_mloveforever/article/details/78821870

小結:

  在軟體體系架構設計中,分層式結構是最常見,也是最重要的一種結構。是以,分層式設計可以達至如下目的:分散關注、松散耦合、邏輯複用、标準定義。一個好的分層式結構,可以使得開發人員的分工更加明确。一旦定義好各層次之間的接口,負責不同邏輯設計的開發人員就可以分散關注,齊頭并進。雖然三層架構仍有不可避免的缺陷,但是軟體分層結構使得代碼維護非常友善,設計明确,各層獨立,專注自己擅長的領域。通過這次學習,對軟體體系結構又有了更深入的了解,為後面的機房重構打下基礎。