微软援引的分层式结构相似分为三层,第1局地不难明了

Interface layer)、业务逻辑层(Business Logic Layer)、数据访问层(Data,在网上收集的比较好的讲解三层架构的理解

前些天大家的话说三层,首先我们来看一下百度宏观对于三层架构的诠释:三层架构(3-tier
architecture) 平常意义上的三层架构正是将全方位事情应用细分为:界面层(User
Interface layer)、业务逻辑层(Business Logic Layer)、数据访问层(Data
access
layer)。区分层次的目标即为了“高内聚低耦合”的思想。在软件种类架构划设想计中,分层式结构是最广泛,也是最要紧的一种结构。微软引荐的分层式结构相似分为三层,从下至上独家为:数据访问层、业务逻辑层(又或称为世界层)、表示层。

在网上搜集的比较好的上书三层架构的理解,作者采访两片段,第2部分不难通晓,第3部分可比详细。也有局地再度的地点

 

一、

大家使用三层架构就是为了让任何程序能够更进一步简单维护,业务逻辑和表现方式还有数据库操做都能够分离来写,那样开发人士也能够更好的分工。而且简单增添,要是假如事情供给扩张活着要去除有些需要,也不难修改。

C#三层架构登陆实例

 

 

上边大家就来用三层构造实现用户登录:

很早以前,就据书上说过三层结构了。当时只略知一二
三层构造 是把 系统的 界面 跟 数据库操作等不相干的程序分别开来。原来是那样不难的兑现,确实好玩的事中的
三层构造啊。

率先步大家成立1个缓解方案,里面添加多个类库,如下图所示:

第壹,先来看一下是哪三层。表示层(UI,User
Interface),业务逻辑层(BLL BusinessLogicLayer),数据访问层(DAL Data
Access Layer)。三层的分割是情理上的细分。

图片 1

表示层(UI),这几个最不难明白,就是用户看到的主界面。

那三个类库分别表示的是事情逻辑层BLL,数据访问层DAL,还有实体Entity,下一步正是添加你必要的变现层,笔者为了表示知道直接选拔了UI命名。图片 2

数据访问层(DAL),也简单精通,主若是承担数据的增加和删除改查。

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

工作逻辑层(BLL),算是表示层和数目访问层的大桥吧。里面根本存放一些业务流程。也正是逻辑。首要功能正是从DAL中获取数据,然后突显到UI上。

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 )

举三个事例,三层构造得以用餐饮店的实例来掌握。

 

 图片 3

近日我们先来开头写多少访问层,在数额访问层里,大家第第②建工公司立一个帮手类SQLServerDALHelper,完毕多少连接,代码如下:

UI指的是服务员,BLL是大师傅,DAL是购买销售员。

图片 4图片 5

在消费者的眼底,只可以见到服务员为她们服务。并不知道后台大厨和买卖员是哪些做的。对于上述二种差异的剧中人物的话,无论哪个环节出了难题,只需求转移2个职员和工人就足以照常营业的。

 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

接下去,看3个使用三层构造的登陆实例。首先,要求表明一(Wissu)下。这一个实例中有数见不鲜bug需求优化。然而对于呈现三层的要紧考虑足够了。仅仅是2个实例而已。

帮衬类写完现在就初步写数据库操做事情了,在此间说一下,帮助类微软专程有本人包裹的类,能够一贯下载应用。数据访问代码如下:那里有简要的增删查方法

多少库表:

图片 6图片 7

 图片 8

 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

 图片 9

咱俩的数据访问层那就早已写完了,那里终究也都只是套路而已,驾驭了套路,全体的东西等于都明白了。

仔细的读者必定会发觉,除了UI,BLL,DAL那多个之外还有三个Moudel存在,这么些Moudel不属于别的一层,只是为了更好地链接三层而存在的。这一个类只存款和储蓄,与上述三类共同选取的东西。起二个和谐的遵循。Moudel类,也正是实体类。

接下去大家先写实体类,实体类映射的是数码库表,所以实体类里面包车型大巴性子一定要对应数据库中的表。

下边是那多少个层次的关联。

图片 10图片 11

 图片 12

 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

Entity类:

此地自个儿添加了贰个构造函数,对于或者须要贯彻的效果来说,重载构造函数就多了一种完结格局,所以无论是有用没用,先写上加以。

 

接下去正是事情逻辑层了,那一个层就必要引用DAL层和Entityc层了,

 

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

 

namespace Login.Model

{

    public class UserInfo       //实体类,用于保存用户信息

    {

        public int ID { get; set; }

        public string UserName { get; set; }

        public string Password { get; set; }

        public string Email { get; set; }

    }

}

图片 13图片 14

U层:

 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

 

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.Windows.Forms;

 

namespace LoginUI

{

    public partial class Form1 : Form

    {

        public Form1()

        {

            InitializeComponent();

        }

 

        private void label1_Click(object sender, EventArgs e)

        {

 

        }

 

        private void btnLogin_Click(object sender, EventArgs e)

        {

            try

            {

                string userName = txtUserName.Text.Trim();   //取出用户界面的数据

                string password = txtPassword.Text;

                Login.BLL.LoginManager mgr = new Login.BLL.LoginManager();

                Login.Model.UserInfo user = mgr.UserLogin(userName, password);   //使用用户界面数据 进行查找

 

                //如果没有问题,则登陆成功

                MessageBox.Show("登陆用户:" + user.UserName);

            }

            catch (Exception ex)   //如果登陆有异常 则登陆失败

            {

                MessageBox.Show(ex.Message);

            }

        }

    }

}

大家在写完事情逻辑层之后将要考虑表现层的题材了,为了将增加和删除改查都在三个页面上呈现出来,WinForm那样设计

B层:

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

 

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

 

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

 

namespace Login.BLL    //业务逻辑层

{

    public class LoginManager

    {

        public Login.Model.UserInfo UserLogin(string userName, string Password)

        {

            ///throw new NotImplementedException();

            Login.DAL.UserDAO uDAO = new Login.DAL.UserDAO();  //创建一个user

            Login.Model.UserInfo user= uDAO.SelectUser(userName, Password);  //通过ui中填写的内容 返回来相应的数据

 

            if (user!= null)        //如果数据库中没有数据,即为首次登陆了。增加10积分

            {

                Login.DAL.ScoreDAO sDAO = new Login.DAL.ScoreDAO();

                sDAO.UpdateScore(userName, 10);

                return user;

            }

            else       //如果数据库中没有该用户名,则登陆失败

            {                

                throw new Exception("登陆失败");

            }

        }

    }

}

图片 16图片 17

 

 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         }

D层:

View Code

 

第壹注册2个admin
密码也为admin,用来测试登陆和删除,然后达成dataGridView展现全数数据。

 

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

 

namespace Login.DAL     //数据访问层

{

    class DbUtil        //用于保存 链接服务器的sql语句

    {

        public static string ConnString = @"Server=zc-pc;Database=Login;User ID=sa; Password=123456";

    }

}

图片 18图片 19

 

 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         }

 

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.Data;

using System.Data.SqlClient;

 

namespace Login.DAL

{

    public class UserDAO

    {

        public Login.Model.UserInfo SelectUser(string userName, string Password)   //根据 ui 选择返回一个user

        {

            using (SqlConnection conn = new SqlConnection(DbUtil.ConnString))

            {

                //创建一个命令对象,并添加命令

                SqlCommand cmd = conn.CreateCommand(); 

                cmd.CommandText = @"SELECT ID,UserName,Password,Email FROM USERS WHERE UserName=@UserName AND Password=@Password";

                cmd.CommandType = CommandType.Text;

                cmd.Parameters.Add(new SqlParameter("@userName", userName));

                cmd.Parameters.Add(new SqlParameter("@Password", Password));

 

                conn.Open();        //打开数据链接

                SqlDataReader reader= cmd.ExecuteReader();

                 

                Login.Model.UserInfo user=null;     //用于保存读取的数据

 

                while (reader.Read())       //开始读取数据

                {

                    if (user==null)     //如果没有,则重新生成一个

                    {

                        user=new Login.Model.UserInfo();

                    }

                    user.ID=reader.GetInt32(0);

                    user.UserName=reader.GetString(1);

                    user.Password=reader.GetString(2);

                    if(!reader.IsDBNull(3))         //不要求一定要有email,也可以返回

                    {

                        user.Email=reader.GetString(3);

                    }                   

                }

                return user;

            }

             

        }

    }

}

View Code

 

现行反革命注册一个用户然后看看显示的效劳。

 

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.Data.SqlClient;

 

namespace Login.DAL

{

    public class ScoreDAO     //首次登陆,增加10积分

    {

        public void UpdateScore(string userName, int value)

        {

            using (SqlConnection conn = new SqlConnection(DbUtil.ConnString))

            {

                SqlCommand cmd = conn.CreateCommand();  //创建一个命令对象

                cmd.CommandText = @"INSERT INTO SCORES(UserName,Score) Values(@UserName,@Score)";  //修改Score表数据

                cmd.Parameters.Add(new SqlParameter("@userName", userName));

                cmd.Parameters.Add(new SqlParameter("@Score", value));

 

                conn.Open();

                cmd.ExecuteNonQuery();

            }

        }

    }

}

图片 20图片 21缘何dataGridView会展现这么些样子吗?为何添加的汉语用户名会现身??那些标记呢?大家有没有蒙受过那种气象

接下去,看一下实践结果:

第1先表达第③个难题,大家的Name呈现的真的ID编号,这一个正是大家的实体类缺点和失误Id这么些脾气,不过在询问的时候查询的贫乏全部的本性,那样子就应运而生了此人作品显示没有对齐的景观,怎么解决吗,八个法子,第壹修改查询条件,只询问Name和Pass,第三我们抬高实体ID,大家就用第三种艺术呢。

施行成功的情况:

修改实体代码如下

图片 22

 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          }

 图片 23

那般第①个冒出的题材就化解了,下来大家来说首个难点,这几个难题是因为数量格式难点,大家string格式对应的是Varchar()可是我们用的是Nvarchar(),所以大家相应在插入数据那块添加3个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          }

小结:对于利用三层架构的先后来说,哪层出错改哪个地方。极大程度的回落了系统的耦合性。当然,具有层次的次序,维护起来自然要方便广大。

现行反革命布置数据格式难题也消除了。图片 24

 ————————————————————————————————————————-

随之大家开端要完结登陆难点了。代码如下:

二、

图片 25图片 26

理解C#中得三层架构

       

  • 表示层
  • 工作逻辑层(BLL)
  • 数量访问层(DAL)

关联:发生信赖关系

描述:三层种类布局正是在客户端和数据库之间加一个中间层,平日状态下客户端不可能一贯和数据库实行交互,而是通过中间层和数据层进行互动的。

 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         }

  【表示层】

    重要负责完结用户和体系的相互。

    它接受用户输入的新闻,并把上边传来的处理结果表示给用户。盖层有时候包容一小部分业务逻辑层的成效(验证用户输入的数据及其合法性)

    一般作为Windows或然Web应用程序

View Code

  【业务逻辑层】

    接收表示层传来的数目,以参数的款型传给数据访问层;然后接受数据层发来的处理好的数码,传给表示层。

    该层所做的干活比较复杂,如:达成业务流程、业务的数据校验

    是表示层和数据层之间的大桥,都亟需经过工作逻辑层来成功音讯数量的收发

登陆代码达成之后正是剔除数据的兑现了,

  【数据访问层】

    数据访问层为系统提供了行业内部,统一数据的造访入口,有限支撑工作逻辑层对系统数据访问层的规范和高速,从而完成数量被相当的慢、安全的拜访

    该层会依照业务逻辑层的请求去处理和数据库之间的相互,不对数据做此外业务上的加工

图片 27图片 28

【本人见解】

  表示层接受用户的乞请,依据用户的呼吁去公告工作逻辑层,业务逻辑层收到请求,首先对请求实行核对,然后将呼吁发给数据访问层恐怕直接重回到表示层,数据访问层收到请求后就起来访问数据库,数据访问层通过数据库的拜访取得请求的结果,并把结果通报纸出版业务逻辑层,业务逻辑层收到请求结果将呼吁结果通报表示层,表示层收到请求结果,然后把结果呈现给用户;

  ps:用户登录种类便是这一行使的实例。

    用户输入账号密码—->表示层先判断,符合—–>业务逻辑层举行封装———>数据访问层举办更进一步安全、高效的论断——->结果给工作逻辑层——->表示层展现结果

    那种传递是一步一步的拓展下去,一步一步的回到,无法抢先传递。

 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()方法用来显示数据吧,大家假若在需求多少刷新的地点调用这几个措施就行了,达成非常粗大略,我就不现实改了,我们下来本人要兑现的改一下就好了。明日的剧情已经写完了,希望大家帮忙,文中有错误希望大家能够建议来,让自个儿上学考订。

三层之间的松耦合互不扰攘,之间的关联是经过友好提供的接口来拜会;

 

三层协会各层之间的的多寡传递格局分为请求和响应三个主意;

体系依赖方向:先从表示层传递到业务层再到数据层;

数值再次回到:数据层再次来到给业务逻辑层,在由工作逻辑层重临给表示层,然后由表示层实行显示;


===============================================================================================================================

三层架构(作者的知情及详细分析)

1什么是三层

  1. 2怎么采纳三层
  2. 3与两层的分别
  3. 4三层的具体表现格局 

三层架构现已学了一段时间,平昔想做贰个比较完整、比较周详的计算。不过大费周章,不清楚怎么下笔。都说全数发轫难嘛,后天打点了弹指间忙乱的笔触,哎,依然没整理好,想到哪就说到哪呢。

 

初学者很不知晓:

1,什么是三层?

2,为啥选拔三层?

3,三层与往常利用的两层相比有啥两样?它的优势在哪儿?

4,如何学好三层?如何利用三层?

……

那篇博客里笔者会给我们逐一解释一下,略懂皮毛忘大家见谅!!!

米先生一向强调:让学习和生活结合,把读书和生活关系,那样的学习才叫会学习,会生活。

对此三层作者苦思冥想,怎么着与实际相挂钩。好嘛,前晚出人意料有了“灵感”。还记得大话设计情势里第叁3章大鸟和菜肴吃羊肉串的有趣的事——由在地摊吃到商旅吃引来的二个命令形式(当然今天不是切磋命令形式)。服务员、厨神、买卖员。

那不就是个优异的三层架构吗???(⊙ o
⊙ )啊!哈哈(这么些前边再做表达)

 图片 29

 

 

先了解:

 

1,什么是三层?

UI(表现层):首即便指与用户交互的界面。用于收纳用户输入的数额和突显处理后用户必要的多少。

 

BLL:(业务逻辑层):UI层和DAL层之间的大桥。达成业务逻辑。业务逻辑具体包括:验证、计算、业务规则等等。

 

DAL:(数据访问层):与数据库交际。主要实现对数据的增、删、改、查。将积存在数据库中的数据交由给业务层,同时将业务层处理的数量保存到数据库。(当然那些操作都以基于UI层的。用户的急需反映给界面(UI),UI反映给BLL,BLL反映给DAL,DAL实行数量的操作,操作后再一一再次来到,直到将用户所需数据反映给用户)

 图片 30

每一层都承担,那么该何以将三层交流起来吧?

1>单项引用(见下图)

2>那时候实体层(Entity)来了。(注:当然,实体层的功用持续那些)

 

Entity(实体层):它不属于三层中的任何一层,但是它是不可或缺的一层。

 

Entity在三层架构中的效率:

1,实现面向对象思想中的”封装”;

2,贯穿于三层,在三层之间传递数据;

注:合适的说实体层贯穿于三层之间,来接二连三三层)

3,对于初学者的话,能够这么敞亮:每张数据表对应3个实体,即每一个数据表中的字段对应实体中的属性(注:自然,事实上不是这么。为何?1>,恐怕我们需求的实体在数据表对应的实业中并不设有;2>,大家全然可以将兼具数据表中的富有字段都位于多个实体里)

4,每一层(UI—>BLL—>DAL)之间的多少传递(单向)是靠变量或实体作为参数来传递的,那样就布局了三层之间的联系,实现了职能的贯彻。

可是对于大气的数额以来,用变量做参数有个别复杂,因为参数量太多,不难搞混。比如:笔者要把职员和工人音讯传送到下层,音信包罗:员工号、姓名、年龄、性别、薪酬....用变量做参数的话,那么大家的主意中的参数就会众多,极有恐怕在采纳时,将参数匹配搞混。那时候,假若用实体做参数,就会很便宜,不用考虑参数匹配的难题,用到实体中哪些属性拿来直接用就能够,很便宜。那样做也抓实了功能。

 

注:此处怎么说能够方今通晓为各样数据表对应三个实体??答:大家都知情,大家做系统的目标,是为用户提供劳务,用户可不关注你的连串后台是怎么工作的,用户只关切软件是否好用,界面是或不是顺应本身意志。用户在界面上轻松的增、删、改、查,那么数据库中也要有照应的增、删、改、查,而增加和删除改查具体操作对象就是数据库中的数据,说白了便是表中的字段。所以,将各样数据表作为七个实体类,实体类封装的性质对应到表中的字段,那样的话,实体在贯穿于三层之间时,就能够实现增加和删除改查数据了)

 

归结:三层及实体层之间的重视关系:

 图片 31

 

沉凝根源生活:

 图片 32

 

 

服务员:只管接待客人;

厨师:固然做客人点的菜;

采购员:只管按客人点菜的渴求买卖食材;

 

他们各负其职,服务员不要精晓厨子咋办菜,不用了然买卖员怎么样购买食材;厨师不用知道服务员接待了哪位客人,不用知道购买销售员如何购买食材;同样,购买销售员不用知道服务员接待了哪位客人,不用知道大厨如何是好菜。

 

她们三者是怎么着联系的?

譬如:厨神会做:炒茄子、炒鸡蛋、臊子面——此时构建八个艺术( cookEggplant()、cookEgg()、cookNoodle())

 

消费者一向和服务员打交道,顾客和服务员(UI层)说:小编要2个炒茄子,而服务员不担当炒茄子,她就把请求往上递交,传递给大厨(BLL层),厨神需求茄子,就把请求往上递交,传递给购销员(DAL层),买卖员从仓Curry取来茄子传回给厨神,大厨响应cookEggplant()方法,做好炒茄子后,又流传给服务员,服务员把茄子突显给顾客。

诸如此类就完毕了一个完整的操作。

 

在此进程中,茄子作为参数在三层中传送,若是买主点炒鸡蛋,则鸡蛋作为参数(那是变量做参数)。纵然,用户扩张须求,大家还得在措施中拉长参数,三个艺术添加1个,八个格局设计到三层;何况实际中并不止设计到三个方法的更改。所以,为了消除那一个标题,大家能够把茄子、鸡蛋、面条作为品质定义到消费者实体中,一旦消费者扩充了炒鸡蛋须要,间接把鸡蛋属性拿出去用即可,不用再去考虑去每层的不二法门中拉长参数了,更毫不考虑参数的协作难题。

 

那样讲,不通晓我们是或不是足以精晓。(待会实例解释吗)

 

2,为何使用三层?

使用三层架构的目标:解耦!!!

同一拿地方酒店的例子来讲:

(1)服务员(UI层)请假——另找服务员;厨神(BLL层)辞职——招聘另二个厨神;购买销售员(DAL)辞职——招聘另1个购买销售员;

(2)顾客反映:1>你们店服务态度倒霉——服务员的标题。开掉服务员;

2>你们店菜里有虫子——大厨的难点。换厨子;

 

此外一层产生变化都不会影响到别的一层!!!

 

3,与两层的界别??

两层:

 图片 33

 

(当其余三个位置发生变化时,都亟待再一次开发总类别统。“多层”放在一层,分工不显著耦合度高——难以适应须求变化,可保护性低、可扩充性低)

 

三层:

 图片 34

 

 

(发生在哪一层的变更,只需改变该层,不需求改变全部种类。层次显著,分工分明,每层之间耦合度低——进步了频率,适应供给变化,可维护性高,可扩充性高)

 

综上:三层架构的

优势:1,结构清晰、耦合度低,2,可维护性高,可扩展性高;3,利于开发职责同步实行;简单适应需要转变

 

劣势:一 、降低了系统的属性。那是可想而知的。假诺不利用分层式结构,很多事务能够一向访问数据库,以此博得相应的数码,近来却无法不透过中间层来形成。

贰 、有时会招致级联的改动。那种修改尤其映以往自上而下的趋向。假若在表示层中要求充实3个效用,为保障其设计适合分层式结构,恐怕必要在相应的工作逻辑层和数据访问层中都净增对应的代码

三 、扩展了代码量,扩大了工作量

 

4,三层的具身体表面现方式??

 图片 35

 

UI:

 图片 36

(大家不用误会,UI层不只是1个个用户界面,也是须要有代码的)

 图片 37

 

(1,作用:用户输入数据、反馈给用户数量;2,大家观看代码:没有关联到工作逻辑,直接传参、函数、方法调用,没有涉嫌到与数据库打交道的SQL语句和ADO.NET)

 

BLL:

 图片 38

 

(1,BLL是表示层与数量访问层之间的大桥,负责数据处理、传递;2,我们观看代码,没有涉及到界面上的控件,没有关联到SQL语句和ADO.Net

 

DAL:

 图片 39

 

 图片 40

 

 图片 41

 

 图片 42

 

(1,以上是DAL层中DbUtil类、user_DA类和workRecord_DA类中的代码;2,大家观望代码,没有涉及到界面控件,没有关联到事情逻辑;惟有与数据库打交道的SQL语句和ADO.net)

 

Entity(Model)层:

 图片 43

(定义了实体类user)

观察以上三层:

1,实体类user作为参数贯穿于三层之间;

2,通过传参、方法调用来贯彻效益;

3,各层之间负担;互不影响

 

相比较两层结构,让我们深入体会三层的大幅好处:

照旧以机房收费系统的登陆为例:

 图片 44

(阅览地点的两层的代码:将业务逻辑、数据访问都表未来用户展现层,当须要必要改变时,必要变更整个系统。比如,作者把公文框txtPassWord的称谓改为txtPwd的话,大家观看一下得必要变越多少地点。那样的变动算是小的,假若实在有工作供给上的转移才叫麻烦复杂,程序员不跳楼才怪。呵呵、、开个玩笑)

与那样难以适应须要转变的两层比较,我们再也考察三层代码,再度思考,三层架构有何样好处呢?本人思考。。。。。

 

投机去开掘吧!!!