天天看點

【三層】-C#版登入例子背景:總結

背景:

     學習三層架構也有段時間了,之前覺得三層挺簡單的,就一集王繼彬老師的視訊,對三層有了大概的了解,通過後來的登入例子的實作,漸漸體會到沒有想象中的那麼簡單,三層架構的學習不能僅僅停留在理論的概念層面上,,在實踐中會了解到更多深層次的東西,這就是所謂的“站在岸上學不會遊泳”吧;三層對于之後的機房重構等來說是一個基礎,現在通過機房登入的小例子來了解三層。

【包圖】

【三層】-C#版登入例子背景:總結

【時序圖】

【三層】-C#版登入例子背景:總結

【通過代碼看三層架構】

   ——界面層(UI):通俗講就是展現給使用者的界面,即使用者在使用一個系統時的所見所得;

【三層】-C#版登入例子背景:總結

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層(業務邏輯層)處于核心位置,是解耦合關系的關鍵點,這才産生了所謂的三層架構。

    對于三層的知識了解甚少,希望路過的朋友多多提意見。