1. 程式人生 > >三層架構詳細介紹

三層架構詳細介紹

一、分層架構-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