三层架构详细介绍
一、分层架构-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