当前位置: 首页 > news >正文

三层架构详细介绍

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

转载于:https://www.cnblogs.com/chenyanbin/p/10863850.html

相关文章:

  • ElasticSearch Roaring bitmap 和跳表联合查询
  • Redis(一)----安装及基本使用
  • Spring Cloud(3):Ribbon的使用
  • RESTful API批量操作的实现
  • Node.js原生路由
  • C语言基础:break语句使用范例源码
  • 第六次实训作业
  • C# — MongoDB数据库安装
  • k8s 三节点签发所需证书
  • 经典书籍
  • k8s flanneld网络配置
  • 第六章小结(图)
  • SUSE12.2 编译usbutils
  • 类与类加载器
  • 红帽证书
  • [js高手之路]搞清楚面向对象,必须要理解对象在创建过程中的内存表示
  • 【刷算法】求1+2+3+...+n
  • Flex布局到底解决了什么问题
  • java中具有继承关系的类及其对象初始化顺序
  • JS基础之数据类型、对象、原型、原型链、继承
  • Python 反序列化安全问题(二)
  • ReactNativeweexDeviceOne对比
  • sessionStorage和localStorage
  • Spring Boot MyBatis配置多种数据库
  • Webpack入门之遇到的那些坑,系列示例Demo
  • 阿里云容器服务区块链解决方案全新升级 支持Hyperledger Fabric v1.1
  • 安卓应用性能调试和优化经验分享
  • 高性能JavaScript阅读简记(三)
  • 警报:线上事故之CountDownLatch的威力
  • 开源地图数据可视化库——mapnik
  • 利用阿里云 OSS 搭建私有 Docker 仓库
  • 前端技术周刊 2019-01-14:客户端存储
  • 前端相关框架总和
  • 学习JavaScript数据结构与算法 — 树
  • 看到一个关于网页设计的文章分享过来!大家看看!
  • ​Linux Ubuntu环境下使用docker构建spark运行环境(超级详细)
  • #我与Java虚拟机的故事#连载04:一本让自己没面子的书
  • #我与Java虚拟机的故事#连载17:我的Java技术水平有了一个本质的提升
  • (3)(3.5) 遥测无线电区域条例
  • (zt)最盛行的警世狂言(爆笑)
  • (博弈 sg入门)kiki's game -- hdu -- 2147
  • (二)windows配置JDK环境
  • (九)c52学习之旅-定时器
  • (论文阅读31/100)Stacked hourglass networks for human pose estimation
  • (免费分享)基于springboot,vue疗养中心管理系统
  • (算法)Travel Information Center
  • (一)pytest自动化测试框架之生成测试报告(mac系统)
  • (一)搭建springboot+vue前后端分离项目--前端vue搭建
  • (原創) 如何讓IE7按第二次Ctrl + Tab時,回到原來的索引標籤? (Web) (IE) (OS) (Windows)...
  • .[backups@airmail.cc].faust勒索病毒的最新威胁:如何恢复您的数据?
  • .dat文件写入byte类型数组_用Python从Abaqus导出txt、dat数据
  • .gitignore
  • .NET 4 并行(多核)“.NET研究”编程系列之二 从Task开始
  • .NET Core 项目指定SDK版本
  • .NET delegate 委托 、 Event 事件