为什么要要使用三层架构

2019-10-14 17:13 来源:未知

今日我们来讲说三层,首先大家来看一下百度宏观对于三层架构的表达:三层架构(3-tier architecture) 平常意义上的三层架构正是将总体育赛事情应用细分为:分界面层(User Interface layer)、业务逻辑层(Business Logic Layer)、数据访问层(Data access layer)。区分档期的顺序的指标即为了“高内聚低耦合”的构思。在软件类别架构划虚拟计中,分层式结构是最广大,也是最要紧的一种结构。微软引用的分层式结构相似分为三层,从下至上独家为:数据访谈层、业务逻辑层(又或称为世界层)、表示层。

 

作者们使用三层架构就是为了让总体程序能够进一步轻便维护,业务逻辑和展现方式还会有数据库操做都可以分离来写,那样开辟职员也能够越来越好的分工。何况便于扩大,假诺借使事情需求扩张活着要去除有个别须要,也轻松修改。

 

下边我们就来用三层组织达成客户登入:

首先步大家创造三个实施方案,里面增加三个类库,如下图所示:

图片 1

这两个类库分别表示的是事情逻辑层BLL,数据访谈层DAL,还应该有实体Entity,下一步正是加多你要求的展现层,作者为了表示知道直接动用了UI命名。图片 2

开创数据库小编就不详细介绍了,只贴出代码就好了

1 CREATE TABLE [dbo].[Users]
2 (
3     [Id] INT NOT NULL PRIMARY KEY IDENTITY(1,1), 
4     [Name] NVARCHAR(50) NOT NULL, 
5     [Pass] NVARCHAR(50) NOT NULL
6 )

 

现今我们先来早先写多少访谈层,在数额访问层里,我们第第一建工公司立三个相助类SQLServerDALHelper,达成数量连接,代码如下:

图片 3图片 4

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Data.SqlClient;
 5 using System.Data;
 6 using System.Text;
 7 
 8 namespace DAL
 9 {
10     public static class SQLServerDALHelper
11     {
12         //integrated security=true 的意思是集成验证,也就是说使用Windows验证的方式去连接到数据库服务器。
13         public static string Consql = @"Data Source=PC-201610212048;Initial Catalog=People_Data_System;Integrated Security=True";
14 
15         public static bool ExecuteNonQuery(string sql)
16         {
17             try
18             {
19                 using (SqlConnection conn = new SqlConnection(Consql))
20                 {
21                     conn.Open();//打开数据库
22 
23                    using( SqlCommand com = new SqlCommand(sql, conn)){
24                     return com.ExecuteNonQuery() > 0;
25                        //通过cmd对象对数据库进行操作,执行非查询
26                    }
27                 }
28             }
29             catch
30             {
31                 throw;
32             }
33         }
34 
35         public static Object ExecuteScalar(string sql)
36         {
37             try
38             {
39                 using (SqlConnection conn = new SqlConnection(Consql))
40                 {
41                     conn.Open();//打开数据库
42 
43                     using( SqlCommand com = new SqlCommand(sql, conn))
44                     {
45                         return com.ExecuteScalar();
46                     }
47                 }
48             }
49             catch
50             {
51                 throw;
52             }
53         }
54 
55         public static SqlDataReader GetDataReader(string sql)
56         {
57             try
58             {
59                 SqlConnection conn = new SqlConnection(Consql);
60 
61                 conn.Open();
62 
63                 using (SqlCommand com = new SqlCommand(sql, conn))
64                 {
65                     return com.ExecuteReader(CommandBehavior.CloseConnection);
66                 }
67             }
68             catch
69             {
70                 throw;
71             }
72         }
73     }
74 }

View Code

支援类写完事后就从头写数据库操做政工了,在这处说一下,扶植类微软特意有友好包裹的类,可以平素下载应用。数据访谈代码如下:这里有简短的增加和删除查方法

图片 5图片 6

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using Entery;
 5 using System.Data.SqlClient;
 6 using System.Text;
 7 
 8 namespace DAL
 9 {
10      public class PeopleDAL
11     {
12          public bool Insert(People p)
13          {
14              return SQLServerDALHelper.ExecuteNonQuery(
15                  "insert into Users(Name,Pass) values('"
16                 + p.Name
17                 + "','"
18                 + p.Password
19                 + "')");
20          }
21          public bool Delete(People p) {
22              return SQLServerDALHelper.ExecuteNonQuery(
23                  "delete from Users"
24                 + " where Name = '"
25                 + p.Name
26                 + "'"
27                  );
28          }
29 
30          public bool Select(People p) {
31              return SQLServerDALHelper.ExecuteScalar(
32                  "select Pass from Users where Name = '"
33                  + p.Name
34                  + "'").ToString() == p.Password;                
35          }
36          /// <summary>
37          /// 返回数据集
38          /// </summary>
39          /// <returns></returns>
40          public List<People> SelectAll()
41          {
42              return ConvertReaderToTicketList(SQLServerDALHelper.GetDataReader(
43                     "select * from Users"
44                  )
45              );
46          }
47 
48          public static List<People> ConvertReaderToTicketList(SqlDataReader dr)
49          {
50              List<People> ts = new List<People>();
51 
52              if (dr.HasRows)
53              {
54                  while (dr.Read())
55                  {
56                      ts.Add(new People(dr[0].ToString(), dr[1].ToString()));
57                  }
58              }
59 
60              return ts;
61          }
62     }
63 }

View Code

大家的数量访问层那就早就写完了,这里终归也都只是套路而已,领悟了套路,全数的东西等于都精晓了。

接下去大家先写实体类,实体类映射的是数据库表,所以实体类里面的性质必须要对应数据库中的表。

图片 7图片 8

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 
 6 namespace Entery
 7 {
 8     public class People
 9     {
10         private string name;
11         private string password;
12 
13         public string Name
14         {
15             get { return name; }
16             set { name = value; }
17         }
18 
19         public string Password
20         {
21             get { return password; }
22             set { password = value; }
23         }
24 
25         public People()
26         { 
27         
28         }
29         public People( string name,string password)
30         {
31             this.name = name;
32             this.password = password;
33         }
34     }
35 }

View Code

这里本人增多了三个构造函数,对于恐怕供给贯彻的功力来讲,重载构造函数就多了一种达成方式,所以不管有用没用,先写上加以。

接下去正是业务逻辑层了,这些层就须要援引DAL层和Entityc层了,

图片 9图片 10

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using DAL;
 6 using Entery;
 7 
 8 namespace BLL
 9 {
10     /// <summary>
11     /// 这是BLL 业务逻辑层,此层被表现层(UI)调用,同时它自己调用DAL
12     /// </summary>
13     public class PeopleBLL
14     {
15         PeopleDAL dal = new PeopleDAL();
16 
17         public bool Add(People p){
18             //添加一个用户
19             return dal.Insert(p);
20         }
21 
22         public bool Del(People p) {
23             //删除一个用户
24             return dal.Delete(p);
25         }
26 
27         public bool Sel(People p) {
28             //查询用户
29             return dal.Select(p);
30         }
31 
32         public List<People> ShowAll()
33         {
34             return dal.SelectAll();
35         }
36     }
37 }

View Code

我们在写完事情逻辑层之后将在思索表现层的主题素材了,为了将增加和删除改查都在叁个页面上海展览中心现出来,WinForm这样设计

图片 11所需控件,lable textbox button dataGridView。

现行反革命正是驰念达成的时候了。首先写注册,

图片 12图片 13

 1      private void button2_Click(object sender, EventArgs e)
 2         {
 3             try
 4             {
 5                 //新建一个类,这里使用无参的构造函数,方便以后反射
 6                 People p = new People();
 7 
 8                 //为它的属性赋值
 9                 p.Name = textBox1.Text.ToString();
10                 p.Password = textBox2.Text.ToString();
11 
12                 //调用bll的添加业务
13                 string message = bll.Add(p) ? "添加成功" : "添加失败";
14 
15                 MessageBox.Show(message);
16             }
17             catch
18             {
19                 throw;
20             }
21         }

View Code

率先注册二个admin 密码也为admin,用来测验登录和删除,然后实现dataGridView呈现全体数据。

图片 14图片 15

 1 这里先自定义一个shows()方法,然后在Form_Load里调用shows()方法 
 2 private void shows()
 3         {
 4             try
 5             {
 6                 dataGridView1.DataSource = bll.ShowAll();
 7             }
 8             catch {
 9                 MessageBox.Show("链接数据库出错");
10             }
11         }

View Code

今天注册一个客户然后看看彰显的功效。

图片 16图片 17干什么dataGridView会展现那一个样子吧?为何增添的国语顾客名会出现??那么些标识呢?我们有未有遇上过这种意况

率先先表达第贰个难题,大家的Name呈现的真正ID编号,那一个正是大家的实体类缺点和失误Id那个性格,但是在查询的时候查询的远远不足所有的属性,那样子就涌出了此人作品显示未有对齐的光景,怎么解决吗,多个措施,第一改换查询条件,只询问Name和Pass,第二大家加多实体ID,大家就用第两种艺术吗。

修改实体代码如下

 1 public string Id
 2         {
 3             get;
 4             set;
 5         }
 6 public People( string id,string name,string password)
 7         {
 8             this.id = id;
 9             this.name = name;
10             this.password = password;
11         }

只那样修改依然十三分的,因为大家在询问艺术上还恐怕有错误,接着在修改一下DAL层

 1   public static List<People> ConvertReaderToTicketList(SqlDataReader dr)
 2          {
 3              List<People> ts = new List<People>();
 4 
 5              if (dr.HasRows)
 6              {
 7                  while (dr.Read())
 8                  {
 9                      ts.Add(new People(dr[0].ToString(), dr[1].ToString(),dr[2].ToString()));
10                  }
11              }
12 
13              return ts;
14          }

那样第贰个冒出的题目就缓慢解决了,下来大家的话第四个难题,这么些难点是因为数量格式难点,大家string格式对应的是Varchar()不过我们用的是Nvarchar(),所以大家应该在插入数据那块增多二个N,修改代码如下:

1  public bool Insert(People p)
2          {
3              return SQLServerDALHelper.ExecuteNonQuery(
4                  "insert into Users(Name,Pass) values(N'"
5                 + p.Name
6                 + "',N'"
7                 + p.Password
8                 + "')");
9          }

当今安排数据格式难点也消除了。图片 18

随后大家起始要贯彻登入难题了。代码如下:

图片 19图片 20

 1  private void button1_Click(object sender, EventArgs e)
 2         {
 3             try
 4             {
 5                 //新建一个类,这里使用无参的构造函数,方便以后反射
 6                 People p = new People();
 7 
 8                 //为它的属性赋值
 9                 p.Name = textBox1.Text.ToString();
10                 p.Password = textBox2.Text.ToString();
11                 
12                 //调用bll的添加业务
13                 string message = bll.Sel(p) ? "登陆成功" : "登陆失败";
14 
15                 MessageBox.Show(message);
16             }
17             catch
18             {
19                 throw;
20                 //如果出错,可能是数据转换出错或者数据库里已经存在相同的票号
21                // MessageBox.Show("输入数据形式错误,或主键重复");
22             }
23         }

View Code

登入代码完结之后便是删除数据的贯彻了,

图片 21图片 22

 1 private void button3_Click(object sender, EventArgs e)
 2         {
 3             try
 4             {
 5                 //新建一个类,这里使用无参的构造函数,方便以后反射
 6                 People p = new People();
 7 
 8                 //为它的属性赋值
 9                 p.Name = textBox1.Text.ToString();
10 
11                 //调用bll的添加业务
12                 string message = bll.Del(p) ? "删除成功" : "删除失败";
13 
14                 MessageBox.Show(message);
15             }
16             catch
17             {
18                 throw;
19             }
20         }

View Code

今昔我们所必要的增加和删除查难点都早就落实了,可是还反常,什么难题吗,我们在运作程序的时候会发先dataGridView呈现数据在实施增加和删除之后都不举行刷新,所以在施行那三个操做的时候事情实施了而是多少却不可能刷新到dataGridView控件中,我们应当用什么办法消除呢?大家不是写了二个shows()方法用来体现数据吧,大家只要在急需多少刷新的地点调用这几个主意就行了,落成非常粗大略,笔者就不具体制改正了,我们下来本身要兑现的改一下就好了。明日的剧情早就写完了,希望我们扶助,文中有荒唐希望大家能够建议来,让自家上学改进。

 

TAG标签:
版权声明:本文由银河国际点击登录发布于少儿游戏下载,转载请注明出处:为什么要要使用三层架构