C#—【三層架構】

【前言】

終於學習到三層了~接下來也要下功夫學習機房重構了,給自己加油!

【內容】

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; }
}

 

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