三層架構詳細介紹
一、分層架構-3層架構-多層架構
架構:
架構一般是針對整個系統的,並非對某個單獨的問題(單獨的問題可以用模式等來解決)
針對整個系統的“一張藍圖”, 對系統的抽象。架構與具體的語言平臺無關。
架構設計、模式應用的經驗積累的具體程式碼實現,方便以後的複用。Asp.net mvc、NHibemate、NSpring、...
模式:
軟體開發中遇到的一些特定問題,前人總結出來特定的經驗、解決方法。(複製某某企業的成功模式)
23種設計模式
MVC、MVP等模式
理解分層:
• 邏輯分層 N-Layer
邏輯上將系統中的不同功能模組、不同子系統等進行分層。
好的邏輯分層可以讓後續選擇物理架構更靈活,選擇性更大
• 物理分層 N-Tier
物理部署時將系統的不同模式部署在不同的伺服器上
一句話總結架構:專案的組成、分佈,什麼問題該怎麼處理(對於一些關鍵性問題的預見性與解決方法)。對整個專案的規劃、設計,以及在一個系統中各個元件間的組合、互動、整合。架構保證了系統的可用性、穩定性、靈活性、可伸縮性、安全性等等。
1 介面層UI: 2 3 資料訪問層DAL(Data Access Layer) 4 5 業務邏輯層BLL(business logic layer)。實體類就是Model;對資料進行操作的程式碼寫在DAL中,一般就是SQL語句,DAL只是對資料的操作。BLL呼叫DAL中的程式碼進行邏輯操作。SQL語句、ADO.Net的類一般只應該出現在DAL中。
表現層UI:
1、採集資料
2、展示資料
業務邏輯層BLL:
1、業務相關的程式碼如:刪除前判斷許可權是否足夠,刪除時是否需要備份
資料訪問層DAL:
1、只做與資料庫相關的操作,不涉及任何其他業務邏輯
二、實現
功能:點選按鈕,使用者年齡自增1
介面:
非三層實現
1private void button1_Click(object sender, EventArgs e) 2{ 3string strSql = "UPDATE student SET age=age+1 WHERE id='2'"; 4SqlHelp.ExecuteNonQuery(strSql,CommandType.Text); 5MessageBox.Show("ok"); 6}
三層實現
寫三層的步驟:
1、分析功能。 2、根據功能確認SQL語句。 3、在資料訪問層(DAL)編寫執行該SQL語句的函式。 該函式應該在哪個類中,一般情況下,當前的SQL語句要操作那張表,那麼就在資料訪問層建立一個類,這個類的名字與該表名相同,所有操作這個表的函式都寫在該類中。 4、編寫業務邏輯層的方法。 編寫該類中的方法 4.1、先確定方法的引數與返回值。 4.1.1、業務邏輯層方法的返回值,一般取決於表現層呼叫該方法的時候需要什麼樣的返回值。 5、編寫表現層程式碼 5.1、採集資料 5.2、展示資料 5.3、呼叫對應的業務邏輯層來實現具體功能 注意:在表現層中,只調用業務邏輯層方法,絕對不能在表現層直接呼叫資料訪問層的程式碼。
檔案目錄解析:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 using 三層實現.DAL; 7 8 namespace 三層實現.BLL 9 { 10//業務邏輯層 11 12/// <summary> 13/// 操作student表的業務邏輯層類 14/// </summary> 15public class studentBll 16{ 17/// <summary> 18/// 將指定id的人的年齡自增+1歲 19/// </summary> 20/// <param name="id"></param> 21/// <returns></returns> 22public bool IncAge(int id) 23{ 24//例項化資料訪問層 25studentDal dal = new studentDal(); 26return dal.IncAge(id)>0; 27} 28} 29 } 業務層:studentBll.cs
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 using System.Configuration; 7 using System.Data; 8 using System.Data.SqlClient; 9 using System.Windows.Forms; 10 11 namespace sln2019_05_07 12 { 13public static class SqlHelp 14{ 15//private static readonly string conStr = ConfigurationManager.ConnectionStrings["mysql"].ConnectionString; 16private static readonly string conStr = "server=.;uid=sa;pwd=0;database=DEMO"; 17/// <summary> 18/// 執行SQL語句 19/// </summary> 20/// <param name="strSql">sql語句</param> 21/// <param name="cmdType">CommandType.Text代表執行的SQL語句、CommandType.StoreProcedure代表執行的是儲存過程</param> 22/// <param name="pms">可變引數陣列</param> 23/// <returns></returns> 24public static int ExecuteNonQuery(string strSql, CommandType cmdType, params SqlParameter[] pms) 25{ 26SqlConnection conn = new SqlConnection(conStr); 27SqlCommand cmd = new SqlCommand(strSql, conn); 28cmd.CommandType = cmdType; 29if (pms != null) 30{ 31cmd.Parameters.AddRange(pms); 32} 33conn.Open(); 34SqlTransaction trans = conn.BeginTransaction(); 35try 36{ 37cmd.Transaction = trans; 38int count = cmd.ExecuteNonQuery(); 39if (count > 0) 40{ 41trans.Commit(); //提交事務 42return 1; 43} 44else 45{ 46trans.Rollback(); //回滾事務 47return -1; 48} 49} 50catch (Exception EX) 51{ 52trans.Rollback(); //回滾事務 53MessageBox.Show(EX.Message.ToString()); 54return -1; 55} 56finally 57{ 58conn.Close(); 59conn.Dispose(); 60cmd.Dispose(); 61} 62} 63/// <summary> 64/// 返回一第一條記錄 65/// </summary> 66/// <param name="strSql">sql語句</param> 67/// <param name="cmdType">CommandType.Text代表執行的SQL語句、CommandType.StoreProcedure代表執行的是儲存過程</param> 68/// <param name="pms">可變引數陣列</param> 69/// <returns></returns> 70public static object ExecuteScalar(string strSql,CommandType cmdType,params SqlParameter[] pms) 71{ 72SqlConnection conn = new SqlConnection(conStr); 73SqlCommand cmd = new SqlCommand(strSql, conn); 74cmd.CommandType = cmdType; 75if (pms != null) 76{ 77cmd.Parameters.AddRange(pms); 78} 79conn.Open(); 80SqlTransaction trans = conn.BeginTransaction(); 81try 82{ 83cmd.Transaction = trans; 84object obj = cmd.ExecuteScalar(); 85if ((int)obj > 0) 86{ 87trans.Commit(); //提交事務 88return obj; 89} 90else 91{ 92trans.Rollback(); //回滾事務 93return -1; 94} 95} 96catch (Exception EX) 97{ 98trans.Rollback(); //回滾事務 99MessageBox.Show(EX.Message.ToString()); 100return -1; 101} 102finally 103{ 104conn.Close(); 105conn.Dispose(); 106cmd.Dispose(); 107} 108} 109public static SqlDataReader ExecuteReader(string strSql,CommandType cmdType,params SqlParameter[] pms) 110{ 111SqlDataReader sr = null; 112SqlConnection conn = new SqlConnection(conStr); 113SqlCommand cmd = new SqlCommand(strSql,conn); 114cmd.CommandType = cmdType; 115if (pms!=null) 116{ 117cmd.Parameters.AddRange(pms); 118} 119try 120{ 121if (conn.State == ConnectionState.Closed) 122{ 123conn.Open(); 124} 125sr = cmd.ExecuteReader(); 126return sr; 127} 128catch (Exception EX) 129{ 130MessageBox.Show(EX.Message.ToString()); 131} 132finally 133{ 134conn.Close(); 135conn.Dispose(); 136cmd.Dispose(); 137} 138return sr; 139} 140public static DataTable ExecuteDataTable(string strSql,CommandType cmdType,params SqlParameter[] pms) 141{ 142DataTable dt = new DataTable(); 143SqlConnection conn = new SqlConnection(conStr); 144SqlDataAdapter adap = new SqlDataAdapter(strSql, conn); 145try 146{ 147adap.SelectCommand.CommandType = cmdType; 148if (pms != null) 149{ 150adap.SelectCommand.Parameters.AddRange(pms); 151} 152adap.Fill(dt); 153return dt; 154} 155catch (Exception EX) 156{ 157MessageBox.Show(EX.Message.ToString()); 158} 159finally 160{ 161conn.Close(); 162conn.Dispose(); 163adap.Dispose(); 164} 165return dt; 166} 167} 168 } 資料訪問層:SqlHelp.cs
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 using System.Data; 7 using System.Data.SqlClient; 8 using sln2019_05_07; 9 10 namespace 三層實現.DAL 11 { 12/// <summary> 13/// 操作student表的資料訪問層的類 14/// </summary> 15public class studentDal 16{ 17public int IncAge(int id) 18{ 19string strSql = "UPDATE student SET age=age+1 WHERE id=@id"; 20return SqlHelp.ExecuteNonQuery(strSql, CommandType.Text,new SqlParameter("@id", SqlDbType.Int) { Value=id}); 21} 22} 23 } 資料訪問層:studentDal.cs
1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Data; 5 using System.Drawing; 6 using System.Linq; 7 using System.Text; 8 using System.Threading.Tasks; 9 using System.Windows.Forms; 10 using 三層實現.BLL; 11 12 namespace 三層實現.UI 13 { 14public partial class frmIncreasAge : Form 15{ 16public frmIncreasAge() 17{ 18InitializeComponent(); 19} 20 21private void button1_Click(object sender, EventArgs e) 22{ 23//1、例項化業務邏輯層類 24//2、呼叫對應的方法。 25studentBll bll = new studentBll(); 26bool bl = bll.IncAge(2); 27if (bl) 28{ 29MessageBox.Show("成功!"); 30} 31else 32{ 33MessageBox.Show("失敗!"); 34} 35} 36} 37 } 介面層