• 三层架构详细介绍


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

  • 相关阅读:
    Aptana 安装jQuery库 智能提示
    .NET Core 微服务—API网关(Ocelot) 教程 [三]
    .NET Core 微服务—API网关(Ocelot) 教程 [二]
    NuGet 应用指南
    记一次 Microsoft.Bcl.Async 使用经验
    认证授权:学习OAuth协议
    深入了解MFC中的文挡/视结构
    (VC)MDI工程中,在自定义类中调用文档类的函数
    MFC中的指针
    XP IIS5.1安装文件
  • 原文地址:https://www.cnblogs.com/chenyanbin/p/10863850.html
Copyright © 2020-2023  润新知