一、分层架构-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


版权声明:本文为chenyanbin原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/chenyanbin/p/10863850.html