一、分层架构-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
** 用户登录与修改密码之三层架构详细介绍:**
**链接:https://pan.baidu.com/s/1Ui0AiywDdSHl4SLdl-LrUA ** **提取码:o7az **