三層架構詳細介紹
阿新 • • 發佈:2019-05-15
一、分層架構-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
介面:
非三層實現
1 private void button1_Click(object sender, EventArgs e) 2 { 3 string strSql = "UPDATE student SET age=age+1 WHERE id='2'"; 4 SqlHelp.ExecuteNonQuery(strSql,CommandType.Text); 5 MessageBox.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> 15 public class studentBll 16 { 17 /// <summary> 18 /// 將指定id的人的年齡自增+1歲 19 /// </summary> 20 /// <param name="id"></param> 21 /// <returns></returns> 22 public bool IncAge(int id) 23 { 24 //例項化資料訪問層 25 studentDal dal = new studentDal(); 26 return 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 { 13 public static class SqlHelp 14 { 15 //private static readonly string conStr = ConfigurationManager.ConnectionStrings["mysql"].ConnectionString; 16 private 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> 24 public static int ExecuteNonQuery(string strSql, CommandType cmdType, params SqlParameter[] pms) 25 { 26 SqlConnection conn = new SqlConnection(conStr); 27 SqlCommand cmd = new SqlCommand(strSql, conn); 28 cmd.CommandType = cmdType; 29 if (pms != null) 30 { 31 cmd.Parameters.AddRange(pms); 32 } 33 conn.Open(); 34 SqlTransaction trans = conn.BeginTransaction(); 35 try 36 { 37 cmd.Transaction = trans; 38 int count = cmd.ExecuteNonQuery(); 39 if (count > 0) 40 { 41 trans.Commit(); //提交事務 42 return 1; 43 } 44 else 45 { 46 trans.Rollback(); //回滾事務 47 return -1; 48 } 49 } 50 catch (Exception EX) 51 { 52 trans.Rollback(); //回滾事務 53 MessageBox.Show(EX.Message.ToString()); 54 return -1; 55 } 56 finally 57 { 58 conn.Close(); 59 conn.Dispose(); 60 cmd.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> 70 public static object ExecuteScalar(string strSql,CommandType cmdType,params SqlParameter[] pms) 71 { 72 SqlConnection conn = new SqlConnection(conStr); 73 SqlCommand cmd = new SqlCommand(strSql, conn); 74 cmd.CommandType = cmdType; 75 if (pms != null) 76 { 77 cmd.Parameters.AddRange(pms); 78 } 79 conn.Open(); 80 SqlTransaction trans = conn.BeginTransaction(); 81 try 82 { 83 cmd.Transaction = trans; 84 object obj = cmd.ExecuteScalar(); 85 if ((int)obj > 0) 86 { 87 trans.Commit(); //提交事務 88 return obj; 89 } 90 else 91 { 92 trans.Rollback(); //回滾事務 93 return -1; 94 } 95 } 96 catch (Exception EX) 97 { 98 trans.Rollback(); //回滾事務 99 MessageBox.Show(EX.Message.ToString()); 100 return -1; 101 } 102 finally 103 { 104 conn.Close(); 105 conn.Dispose(); 106 cmd.Dispose(); 107 } 108 } 109 public static SqlDataReader ExecuteReader(string strSql,CommandType cmdType,params SqlParameter[] pms) 110 { 111 SqlDataReader sr = null; 112 SqlConnection conn = new SqlConnection(conStr); 113 SqlCommand cmd = new SqlCommand(strSql,conn); 114 cmd.CommandType = cmdType; 115 if (pms!=null) 116 { 117 cmd.Parameters.AddRange(pms); 118 } 119 try 120 { 121 if (conn.State == ConnectionState.Closed) 122 { 123 conn.Open(); 124 } 125 sr = cmd.ExecuteReader(); 126 return sr; 127 } 128 catch (Exception EX) 129 { 130 MessageBox.Show(EX.Message.ToString()); 131 } 132 finally 133 { 134 conn.Close(); 135 conn.Dispose(); 136 cmd.Dispose(); 137 } 138 return sr; 139 } 140 public static DataTable ExecuteDataTable(string strSql,CommandType cmdType,params SqlParameter[] pms) 141 { 142 DataTable dt = new DataTable(); 143 SqlConnection conn = new SqlConnection(conStr); 144 SqlDataAdapter adap = new SqlDataAdapter(strSql, conn); 145 try 146 { 147 adap.SelectCommand.CommandType = cmdType; 148 if (pms != null) 149 { 150 adap.SelectCommand.Parameters.AddRange(pms); 151 } 152 adap.Fill(dt); 153 return dt; 154 } 155 catch (Exception EX) 156 { 157 MessageBox.Show(EX.Message.ToString()); 158 } 159 finally 160 { 161 conn.Close(); 162 conn.Dispose(); 163 adap.Dispose(); 164 } 165 return 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> 15 public class studentDal 16 { 17 public int IncAge(int id) 18 { 19 string strSql = "UPDATE student SET age=age+1 WHERE id=@id"; 20 return 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 { 14 public partial class frmIncreasAge : Form 15 { 16 public frmIncreasAge() 17 { 18 InitializeComponent(); 19 } 20 21 private void button1_Click(object sender, EventArgs e) 22 { 23 //1、例項化業務邏輯層類 24 //2、呼叫對應的方法。 25 studentBll bll = new studentBll(); 26 bool bl = bll.IncAge(2); 27 if (bl) 28 { 29 MessageBox.Show("成功!"); 30 } 31 else 32 { 33 MessageBox.Show("失敗!"); 34 } 35 } 36 } 37 }介面層
專案連結:https://pan.baidu.com/s/1iqORivgj1DfujFzwRKvaqg
提取碼:twyz
&n