【三層架構】入門知識梳理

   1.什麼是三層?

  三層架構(3-tierarchitecture) 通常意義上的三層架構就是將整個業務應用劃分爲:表現層(UI)、業務邏輯層  (BLL)、數據訪問層(DAL)

  2.三層架構使用背景

  當業務複雜到一定程度,數據需要在另外的數據庫內存儲時,需要將分層來編寫程序

  3 程序分層的目的

  •    解耦和
  •    適應程序需求的變化 

  4.程序分層的優點

  • 1、開發人員可以只關注整個結構中的其中某一層;
  • 2、可以很容易的用新的實現來替換原有層次的實現;
  • 3、可以降低層與層之間的依賴;
  • 4、有利於標準化;
  • 5、利於各層邏輯的複用。
  • 6、結構更加的明確
  • 7、在後期維護的時候,極大地降低了維護成本和維護時間

  5 程序分層的缺點

  • 1、降低了系統的性能。這是不言而喻的。如果不採用分層式結構,很多業務可以直接造訪數據庫,以此獲取相應的數據,如今卻必須通過中間層來完成。
  • 2、有時會導致級聯的修改。這種修改尤其體現在自上而下的方向。如果在表示層中需要增加一個功能,爲保證其設計符合分層式結構,可能需要在相應的業務邏輯層和數據訪問層中都增加相應的代碼。
  • 3、增加了開發成本。

 6.三層架構工作流程圖


  7.每層具體分析

    1.UI表現層

  •           表現層(UI):通俗講就是展現給用戶的界面,即用戶在使用一個系統的時候他的所見所得。
  •      作用:主要表示WEB方式,也可以表示成WINFORM方式,WEB方式也可以表現成:aspx,如果邏輯層相當強大和完善,無論表現層如何定義和更改,邏輯層都能完善地提供服務。
  • 設計原則:用戶至上,兼顧簡潔

    2.BLL業務邏輯層

  •           業務邏輯層(BLL):針對具體問題的操作,也可以說是對數據層的操作,對數據業務邏輯處理。
  •      作用:主要是針對具體的問題的操作,也可以理解成對數據層的操作,對數據業務邏輯處理,如果說數據層是積木,那邏輯層就是對這些積木的搭建。

    3.DAL數據訪問層

  •      數據訪問層(DAL):該層所做事務直接操作數據庫,針對數據的增添、刪除、修改、查找等
  •      作用:主要是對原始數據(數據庫或者文本文件等存放數據的形式)的操作層,而不是指原始數據,也就是說,是對數據的操作,而不是數據庫,具體爲業務邏輯層或表示層提供數據服務.


    8.每層區分方法 

  •      1 UI表示層  離用戶最近的,爲用戶提供一種交互式操作界面
  •    2 BLL業務邏輯層  對支持可擴展的框架尤爲重要,他是表示層的被調用者
  •    3 DAL數據訪問層  主要負責數據庫的訪問 實現對數據的增刪改查

  9.生活中的三層

   此處已餐館顧客,服務員 ,廚師,採購人員爲例子 參照下圖:
 
  註釋: 顧客點菜->服務員記菜單->廚師根據菜單做菜->採購員提供材料
         顧客喫菜<-服務員送菜<-廚師提供菜<-採購員提供菜
         這也就像圖中所示,每個環節就類似三層架構,各司其職,每個環節出了問題都不會影響其他環節的正常運行

  10 如何構建三層

     以VS2010爲平臺,C#爲例子

    1.每個層次都需要如何創建?

      表示層:windows應用程序
      業務邏輯層:類庫
      數據訪問層:類庫
      實體類:類庫   (加入實體類,用於存儲參數,進而在三層之間傳遞)

   2  UI層創建


   3.D層創建


  4.其他層的創建

    其他層也是創建相應的類庫,因此創建方法與D層的創建相同 那麼在創建後這些層之間是沒有任何聯繫的,因此我們需要給他們之間聯繫起來,這就需要了解層之間的關係,然後再項目中添加引用即可  創建好了三層後,餘下的任務也就是寫出我們想要實現的程序了

  5.創建好的例子



  6 關於添加引用


  11.簡單的三層登陸例子

 三層的搭建在我們仔細的手下,完成了,那麼我們來實現一個小例子,更深一步的瞭解三層,在這裏我要分享一下自己的一點學習心得,在我們敲例子之前,首先要會數據庫的連接以及基本的操作,其次,對於命名空間,以及Using的使用也要會點,關於實體類的作用等等   如果你敲的三層例子不能正常運行,那麼也許就是我們疏忽了引用using 。事先打好基礎,會在自己的學習道路上少走許多彎路  下面看例子

實體類  Model
  
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Login.Model
{
    public class UserInfo
    {
        public  string userName;
        public string UserName
        {
            get { return userName; }
            set { userName = value; }
        }
       public   string password;
       public string PassWord
       {
           get { return password; }
           set { password = value; }
       }


    }
}
BLL層
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Login.BLL;
using Login.DAL;
using Login.Model;
namespace Login.BLL
{
   public  class LoginManager
    {
       public UserInfo UserLogin(string userName, string password)
       {
          
           UserDAO uDao = new UserDAO();  //實例化D層的類
           UserInfo user = uDao.SelectUser(userName, password); //將user信息傳遞給D層
           if (user == null)  //判斷user信息
           { 
               throw new Exception("登陸失敗");
           }
           else
           {
               return user;
           }


       }
    }
}

DAL層
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Login.Model ;
using System.Data .SqlClient ;
using System.Data;

namespace Login.DAL
{
    public class UserDAO
    {
       //連接數據庫
        public static string ConnString = @"Server=ASUS-pc; Database=chargeStudent; User ID=sa; Password=123456";
       
        public  UserInfo SelectUser(string userName, string password) //每層都要用到實體類userInfo 通過實體類連接

        {
            
            using (SqlConnection conn = new SqlConnection(ConnString))
            {
                SqlCommand cmd = conn.CreateCommand(); //數據庫連接命令
                cmd.CommandText = @"select * from user_Info where user_Name=@userName AND user_PWD=@password";
                cmd.CommandType = CommandType.Text;
                cmd.Parameters.Add(new SqlParameter("@userName", userName));
                cmd.Parameters.Add(new SqlParameter("@password", password));
                conn.Open();
                SqlDataReader reader = cmd.ExecuteReader();  //讀取數據
                 UserInfo user = new UserInfo();
                while (reader.Read())
                {
                    
                    user.userName = reader.GetString(0);
                    user.password = reader.GetString(1);
                   
                }
                  return user;
            }
          
        }

    }
}

UI層界面


代碼:
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;
using Login.BLL;
using Login.Model;
namespace LoginUI
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }


        private void btnLogin_Click(object sender, EventArgs e)
        {
          LoginManager mgr = new LoginManager(); //實例化B層的類
            string userName = txtUserName.Text.Trim();
            string Password = txtPassword.Text;
          UserInfo user= mgr.UserLogin (userName, Password);  //將user信息傳遞給B層
          MessageBox.Show("登錄用戶:" + userName   );
        }
    }
}

    12 小結

 該例子經過實踐可以運行,在運行小例子的過程中,通過代碼,讓我對於三層以及之間的關係更進一步的瞭解了,再次分享,如有錯誤,歡迎指正! 到此爲此,三層的初步學習告一段落!  向下一目標進軍

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