C#_三層架構詳解
三層架構:
表現層(UI)、業務邏輯層(BLL)、數據訪問層(DAL)再加上實體類庫(Model)
表現層(UI):一般都是窗體的設計或者網頁的設計,是可以一眼就可以看到的界面。
業務邏輯層(BLL):對傳送數據進行邏輯判斷分折,並進行傳送正確的值。
數據訪問層(DAL):主要是存放對數據類的訪問,即對數據庫的添加、刪除、修改、更新等基本操作。
實體類庫(Model):主要存放數據庫中的表字段。
說到這,大家可能還是有點摸不着頭腦!跟着寫一個例子就能明白了!
小二,上例子:
整體思路要把控好哈,用戶輸入賬號密碼->點擊登錄->進入BLL層進行輸入與數據的邏輯處理->進入DAL層將BLL層的邏輯進行實現(用戶輸入的賬號的密碼與數據庫匹配),返回結果。
- 我們先建一個數據庫,不用太多字段,一個id,一個賬號名,一個密碼就行啦!
數據庫名:threelayer
表名:Tb_User
字段:id username userpwd
- 新建項目吧,設計一個超級簡單的窗體,兩個lable,兩個textbox,一個button。
- 爲這個項目加一個應用程序配置文件。
修改配置文件,其實就是連接數據庫的一個字符串。
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<connectionStrings>
<add name="dbConnection" connectionString="Data Source=.;Initial Catalog=threelayer;Persist Security Info=True;User ID=sa;Password=123"
providerName="SQLClient" />
</connectionStrings>
</configuration>
- 添加類庫:BLL,DAL,Model
右鍵項目解決方案-添加-新建項目-類庫
- 重點來了,重點來了,重點來了。重要的事情說三遍。前面我們說了,Model層是幹什麼的?主要存放數據庫中的表字段,那麼問題來了,該怎麼存放呢?
在這個Model類庫下面新建一個類文件名爲userInfo.cs
private string _username;
private string _psw;
public string username
{
set { _username = value; }
get { return _username; }
}
public string psw
{
set { _psw = value; }
get { return _psw; }
}
完整代碼:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Model
{
public class userInfo
{
private string _username;
private string _psw;
public string username
{
set { _username = value; }
get { return _username; }
}
public string psw
{
set { _psw = value; }
get { return _psw; }
}
}
}
- 接下來是DAL層:主要是存放對數據類的訪問,即對數據庫的添加、刪除、修改、更新等基本操作。
我們先添加system.configuration引用,使類可以讀取配置文件節點,讀取配置文件中連接數據庫語句;右鍵引用-添加引用-選擇程序集-勾選-確定
- 添加 DBbase類,這個類也就是我們常說的SqlHelper這個類,隨個人喜好,一個名字而已是吧!
using System.Data;
using System.Data.SqlClient;
添加這兩個引用。
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
namespace DAL
{
public class DBbase
{
//讀取配置文件 連接數據庫語句
public static string strCon = System.Configuration.ConfigurationManager.ConnectionStrings["dbConnection"].ConnectionString;
//實例化連接對象 con
SqlConnection con = new SqlConnection(strCon);
//檢測連接是否打開
public void chkConnection()
{
if (this.con.State == ConnectionState.Closed)
{
this.con.Open();
}
}
//執行語句,返回該語句查詢的數據行的總數
public int returnRowCount(string strSQL)
{
chkConnection();
try
{
SqlDataAdapter da = new SqlDataAdapter(strSQL, con);
DataSet ds = new DataSet();
da.Fill(ds);
return ds.Tables[0].Rows.Count;
}
catch
{
return 0;
}
}
}
}
- 添加 userAccess類(右鍵DAL項目-添加-新建項-命名好-確定) 用執行查詢語句查找用戶輸入賬號密碼在數據庫中存在記錄條數
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace DAL
{
public class userAccess
{
//實例化DBbase 對象
DBbase db = new DBbase();
//用戶登錄的方法
public int userLogin(string name, string psw)
{
string strsql = "select * from Tb_User where username = '" + name + "' and userpwd = '" + psw + "'";
return db.returnRowCount(strsql);
}
}
}
查詢語句,返回對應的行數。
9. BLL層:對傳送數據進行邏輯判斷分折,並進行傳送正確的值。
在BLL層中添加用戶輸入數據與數據庫匹配的邏輯代碼
實例化DAL.userAccess 類,並新建一個方法調用DAL.userAccess方法,參數爲Model實體類中的useInfo類
完整代碼:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace BLL
{
public class userAccess
{
DAL.userAccess d_userAccess = new DAL.userAccess();
public int userLogin(Model.userInfo m_userInfo)
{
return d_userAccess.userLogin(m_userInfo.username, m_userInfo.psw);
}
}
}
- 接下來就是窗體代碼了
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace ThreeLayer
{
public partial class Login : Form
{
//實例化model層中 userInfo類用於傳遞數據
Model.userInfo m_userInfo = new Model.userInfo();
//實例化BLL層中 userAccess方法銜接用戶輸入與數據庫匹配
BLL.userAccess b_userAccess = new BLL.userAccess();
public Login()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
//將用戶輸入的賬號密碼 賦值給userInfo類 username、psw屬性
m_userInfo.username = textBox1.Text.Trim().ToString();
m_userInfo.psw = textBox2.Text.Trim().ToString();
//如果BLL層中 useLogin調用返回記錄條數 大於1 則賬號密碼正確
if (b_userAccess.userLogin(m_userInfo) > 0)
{
MessageBox.Show("登錄成功");
}
else
{
MessageBox.Show("登錄失敗");
}
}
}
}
-
運行調試,發現報錯了,這是爲什麼呢?一起來看看。
這是我們沒有在項目中引用,解決如下:
添加引用就行了。 -
運行調試。
-
總結:
三層架構最重要的是中間的引用,這點只要做錯了就要重新搭建,所以務必要小心一點。下面是三層的關係。
DAL引用Model
BLL引用DAL和Model
UI層引用BLL和Model
運用三層架知構可以讓代碼的可讀性和功能的擴展性有着很好的提高
個人認爲,一般我們說的三層甚至多層架構,是根據一定的分層原則,把一個應用分層處理,每層完成各自的工作,相互之間相對獨立。
比如:有一個應用,我們分爲界面層道,邏輯內層,數據層,那麼這三層分管不同的處理,界面層主要完成與用戶的交互;邏輯層完成商業邏輯運算;數據層完成數據存儲等。
這樣做的好處是方便維護。例如:我們把界面層提供給用戶使用,邏輯運算放到遠程服務器上,當我們需要調整運算邏輯的時候,只需要調整邏輯層就可以了,在用戶那邊根本感覺不到改動,也省去了重新部署的麻煩容。
-
大家如果看的不太明白,在登錄按鈕那個地方打上一個斷點,跟着他一步一步的跳,就會明白怎麼運行的了。
-
喜歡就點個關注唄!