三层架构

在互连网收罗的可比好的授课三层架构的知晓,小编采集两有的,第2有的轻松明了,第三局地可比详细。也有一些双重的地点

三层框架结构,三层架构和mvc的差异

在互联网征集的相比较好的授课三层架构的敞亮,作者搜聚两有的,第叁有的轻便通晓,第叁局部可比详细。也有1对双重的地点

一、

C#三层架构登入实例

 

很早从前,就传闻过三层构造了。当时只知道 三层组织 是把 系统的 分界面 跟
数据库操作等不相干的顺序分别开来。原来这么简单的贯彻,确实逸事中的
三层组织啊。

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

表示层(UI),这些最轻巧驾驭,就是用户观望的主分界面。

数量访问层(DAL),也简单掌握,首要是承受数据的增删改查。

事情逻辑层(BLL),算是表示层和多少访问层的大桥吧。里面主要存放一些业务流程。也正是逻辑。首要成效就是从DAL中获取数据,然后突显到UI上。

举1个例证,三层协会得以用餐饮店的实例来领会。

 亚洲必赢官网 1

UI指的是服务员,BLL是大师傅,DAL是买卖员。

在顾客的眼底,只雅观到服务员为她们服务。并不知道后台大厨和购销员是什么做的。对于上述二种差别的剧中人物的话,无论哪个环节出了难点,只需求更动3个职员和工人就足以照常营业的。

三层架构的优势,照旧职责分开,下跌耦合。

接下去,看3个接纳三层构造的登入实例。首先,必要声明一(Wissu)(Beingmate)下。那些实例中有多数bug必要优化。可是对此呈现三层的首要性理念充分了。仅仅是二个实例而已。

数码库表:

 亚洲必赢官网 2

这是数额模块图:

 亚洲必赢官网 3

周到的读者必定会意识,除了UI,BLL,DAL那多个之外还有一个Moudel存在,这些Moudel不属于此外一层,只是为着越来越好地链接三层而留存的。这么些类只存储,与上述三类共同使用的事物。起三个调治将养的效果。Moudel类,也正是实体类。

下边是那多少个档案的次序的关联。

 亚洲必赢官网 4

接下去须要看一下,他们分别是什么促成各自的分工的。

Entity类:

 

 

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; }

    }

}

U层:

 

 

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);

            }

        }

    }

}

B层:

 

 

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("登陆失败");

            }

        }

    }

}

 

D层:

 

 

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";

    }

}

 

 

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 [email protected] AND [email protected]";

                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;

            }

             

        }

    }

}

 

 

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();

            }

        }

    }

}

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

举行成功的景况:

亚洲必赢官网 5

 

输入错误音信:

 亚洲必赢官网 6

就算那是贰个非常的小的实例,不过用来学学三层却足足了。有写的糟糕的地点可以精通。

总计:对于使用三层架构的次第来讲,哪层出错改哪儿。相当的大程度的暴跌了系统的耦合性。当然,具备档案的次序的顺序,维护起来料定要有利广大。

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

 

一、

二、

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

 

三层架构已经学了一段时间,平昔想做叁个相比完好、比较周详的计算。可是大费周章,不清楚什么下笔。都说全数开头难嘛,明天关照了弹指间无规律的笔触,哎,仍然没整理好,想到哪就谈到哪呢。

 

初学者很不明白:

一,什么是三层?

二,为何接纳三层?

叁,三层与今后应用的两层相比较有怎么样不一样?它的优势在哪里?

肆,怎么样学好三层?怎么着使用三层?

……

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

米先生一向重申:让学习和生存构成,把读书和生活联系,那样的就学才叫会学习,会生活。

对此三层小编大费周折,如何与实际相联系。好嘛,今儿晚上忽然有了“灵感”。还记得大话设计格局里第壹三章大鸟和菜肴吃羊肉串的轶事——由在摊点吃到客栈吃引来的贰个发令格局(当然今天不是商量命令情势)。服务员、厨神、买卖员。

那不正是个优良的三层架构吗???(⊙ o
⊙ )啊!哈哈(那些前面再做表达)

 

亚洲必赢官网 7

 

先了解:

 

C#三层架构登入实例

理解C#中得三层框架结构

       

  • 表示层
  • 职业逻辑层(BLL)
  • 多少访问层(DAL)

关联:爆发重视关系

描述:三层体系布局正是在客户端和数据库之间加二个中间层,平日情状下客户端不可能平素和数据库进行互相,而是通过中间层和数据层进行交互的。

三层架构。1,**怎么是三层?**

UI(表现层):主若是指用户交互的分界面。用于收纳用户输入的多寡和展现管理后用户供给的数据。

 

BLL:(业务逻辑层):UI层和DAL层之间的大桥。实现业务逻辑。业务逻辑具体包涵:验证、总括、业务规则等等。

 

DAL:(数据访问层):与数据库对峙。重要达成对数码的增、删、改、查。将积攒在数据库中的数据交到给业务层,同时将业务层管理的数量保存到数据库。(当然这么些操作都以基于UI层的。用户的要求反映给分界面(UI),UI反映给BLL,BLL反映给DAL,DAL实行多少的操作,操作后再壹壹重临,直到将用户所需数据反馈给用户)

亚洲必赢官网 8

每一层都肩负,那么该如何将三层沟通起来吧?

一>单项引用(见下图)

贰>这时候实体层(Entity)来了。(注:当然,实体层的机能持续这个)

 

Entity(实体层):它不属于三层中的任何壹层,可是它是必需的一层。

 

Entity**在三层架构中的效用:**

1,实现面向对象理念中的”封装”;

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

注:合适的说实体层贯穿于三层之间,来再而三三层)

三,对于初学者的话,能够如此敞亮:每张数据表对应一个实体,即各类数据表中的字段对应实体中的属性(注:自然,事实上不是这么。为何?一>,或者大家供给的实体在数据表对应的实业中并不设有;二>,大家一起能够将所有数据表中的有着字段都坐落三个实体里)

四,每一层(UI—>BLL—>DAL)之间的数额传递(单向)是靠变量或实体作为参数来传递的,那样就组织了三层之间的联络,实现了功用的兑现。

而是对于大气的数据来讲,用变量做参数有个别复杂,因为参数量太多,轻易搞混。比方:作者要把职员和工人音信传送到下层,音讯包蕴:职员和工人号、姓名、年龄、性别、工资....用变量做参数的话,那么大家的方法中的参数就能够众多,极有非常的大几率在利用时,将参数相称搞混。那时候,如若用实体做参数,就能很便利,不用考虑参数匹配的主题素材,用到实体中哪些属性拿来直接用就可以,很便宜。那样做也拉长了成效。

 

注:此地怎么说能够一时半刻通晓为各类数据表对应3个实体??答:我们都领会,我们做系统的目标,是为用户提供劳务,用户可不爱戴你的种类后台是怎么工作的,用户只关切软件是否好用,分界面是还是不是吻合本人意志。用户在分界面上轻巧的增、删、改、查,那么数据库中也要有对应的增、删、改、查,而增加和删除改查具体操作对象就是数据库中的数据,说白了正是表中的字段。所以,将种种数据表作为一个实体类,实体类封装的习性对应到表中的字段,那样的话,实体在贯穿于三层之间时,就足以兑现增加和删除改查数据了)

 

综述**:三层及实体层之间的信赖性关系:**

亚洲必赢官网 9

 

思维根源生活:

 

亚洲必赢官网 10

 

服务员:只管招待客人;

厨师:即便做客人点的菜;

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

 

他俩各负其职,服务员不要通晓厨子如何是好菜,不用精通买卖员怎么样购买食材;大厨不用知道服务员招待了哪位客人,不用知道购销员怎么样购买食材;同样,购销员不用知道服务员应接了哪位客人,不用知道厨子如何做菜。

 

他俩三者是怎样联系的?

举例:大厨会做:炒矮瓜、炒鸡蛋、捞面——此时创设四个法子( cookEggplant()、cookEgg()、cookNoodle())

 

买主一向和服务员打交道,顾客和服务员(UI层)说:作者要八个炒落苏,而服务员不担任炒吊菜子,她就把请求往上递交,传递给厨神(BLL层),厨子须求吊菜子,就把请求往上递交,传递给购买出卖员(DAL层),购买发卖员从仓库里取来紫茄传回给大厨,厨子响应cookEggplant()方法,做好炒吊菜子后,又不知去向给服务生,服务员把吊菜子显示给顾客。

那样就完毕了二个完全的操作。

 

在此进程中,白茄作为参数在三层中传送,借使顾客点炒鸡蛋,则鸡蛋作为参数(那是变量做参数)。尽管,用户扩展需要,大家还得在措施中拉长参数,3个方法增多三个,二个办法设计到三层;何况实际中并不唯有设计到三个主意的改观。所以,为了化解这些主题素材,大家能够把白茄、鸡蛋、面条作为质量定义到消费者实体中,1旦消费者扩展了炒鸡蛋需要,直接把鸡蛋属性拿出去用即可,不用再去思念去每层的方法中增加参数了,更不要思索参数的相称难题。

 

这么讲,不精通大家是还是不是能够清楚。(待会实例解释啊)

 

 

  【表示层】

    首要担负完毕用户和系统的相互。

    它接受用户输入的音信,并把上级传来的管理结果表示给用户。盖层有时候包容一小部分政工逻辑层的功用(验证用户输入的数量及其合法性)

    一般作为Windows恐怕Web应用程序

2**,为啥采用三层?**

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

同样拿位置酒店的例子来说:

(一)服务员(UI层)请假——另找服务员;厨子(BLL层)辞职——招聘另一个大厨;购买出售员(DAL)辞职——招聘另2个购销员;

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

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

 

其它一层爆发变化都不会影响到别的一层!!!

 

很早此前,就据书上说过三层构造了。当时只领会三层组织 是把 系统的 分界面 跟 数据库操作等不相干的顺序分别开来。原来这么简单的贯彻,确实旧事中的
三层组织啊。

  【业务逻辑层】

    接收表示层传来的多寡,以参数的花样传给数据访问层;然后接过数据层发来的拍卖好的数量,传给表示层。

    该层所做的办事比较复杂,如:完毕业务流程、业务的多中校验

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

3**,与两层的区分??**

两层:

 

亚洲必赢官网 11

(当别的四个地点发生变化时,都要求再行开采总体连串。“多层”放在壹层,分工不明显耦合度高——难以适应须求变动,可保证性低、可扩充性低)

 

三层:

 

亚洲必赢官网 12

 

(产生在哪1层的转移,只需改动该层,无需转移全体种类。档期的顺序显明,分工显著,每层之间耦合度低——进步了作用,适应要求调换,可维护性高,可增加性高)

 

综上:三层架构的

优势:一,结构清晰、耦合度低,二,可维护性高,可增添性高;三,利于开采职分同步进行;轻巧适应供给变化

 

劣势:一、下降了系统的习性。那是威名赫赫的。倘使不利用分层式结构,多数事务能够平素访问数据库,以此博得相应的多寡,近日却无法不透过中间层来造成。

2、有时会导致级联的修改。那种修改尤其映未来自上而下的势头。假使在表示层中供给扩张一个成效,为力保其设计适合分层式结构,可能必要在相应的作业逻辑层和多少访问层中都追加对应的代码

叁、扩张了代码量,扩大了工作量

 

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

  【数据访问层】

    数据访问层为系统提供了标准,统一数据的走访入口,保障工作逻辑层对系统数据访问层的标准和飞跃,从而实现数据被飞速、安全的拜会

    该层会遵照职业逻辑层的请求去管理和数据库之间的互相,不对数据做其余交事务情上的加工

四,三层的具体表现方式??

 

亚洲必赢官网 13

UI:

亚洲必赢官网 14

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

亚洲必赢官网 15

 

(一,作用:用户输入数据、反馈给用户数量;二,咱们旁观代码:未有涉嫌到事情逻辑,直接传参、函数、方法调用,未有涉及到与数据库打交道的SQL语句和ADO.NET)

 

BLL:

亚洲必赢官网 16

 

(一,BLL是表示层与数据访问层之间的大桥,负担数据管理、传递;贰,我们观望代码,未有关系到界面上的控件,未有涉嫌到SQL语句和ADO.net)

 

DAL:

亚洲必赢官网 17

 

亚洲必赢官网 18

 

亚洲必赢官网 19

 

亚洲必赢官网 20

 

(1,以上是DAL层中DbUtil类、user_DA类和workRecord_DA类中的代码;二,大家观望代码,没有关系到分界面控件,未有涉嫌到业务逻辑;唯有与数据库打交道的SQL语句和ADO.Net)

 

Entity(Model)层:

亚洲必赢官网 21

(定义了实体类user)

重点以上三层:

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

贰,通过传参、方法调用来落到实处效益;

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

 

对照两层构造,让我们深刻体会三层的高大好处:

抑或以机房收取薪金系统的登入为例:

亚洲必赢官网 22

(观察地方的两层的代码:将事情逻辑、数据访问都呈现在用户显示层,当必要需求改造时,供给更动整个连串。比方,笔者把文件框txtPassWord的名号改为txtPwd的话,大家观看一下得须求变越多少地点。那样的改换算是小的,若是确实有作业供给上的更动才叫麻烦复杂,技师不跳楼才怪。呵呵、、开个玩笑)

与那样难以适应须求变化的两层比较,我们又一次侦查三层代码,再度思索,三层框架结构有哪些便宜吗?自身想想。。。。。

 

团结去开掘吧!!!

 

 

表示层(UI),这一个最轻巧精通,就是用户看到的主分界面。

【本身见解】

  表示层接受用户的乞请,依据用户的央浼去文告业务逻辑层,业务逻辑层收到请求,首先对请求举行复核,然后将请求发给数据访问层只怕直接回到到表示层,数据访问层收到请求后就从头访问数据库,数据访问层通过数据库的拜会获得请求的结果,并把结果通知专门的职业逻辑层,业务逻辑层收到请求结果将呼吁结果通报表示层,表示层收到请求结果,然后把结果显示给用户;

  ps:用户登陆系统正是这一应用的实例。

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

    那种传递是一步一步的进行下去,一步一步的回来,不能够当先传递。

数据访问层(DAL),也简单驾驭,首要是担当数据的增加和删除改查。

 

 

政工逻辑层(BLL),算是表示层和数据访问层的桥梁吧。里面首要存放在一些业务流程。也正是逻辑。重要意义正是从DAL中获取数据,然后显示到UI上。

在三层之间,各层之间是互相正视的涉嫌的,表示层信赖业务层逻辑,业务层正视数据访问层,三层之间通过自己提供的对外方法来传递访问

举3个事例,三层构造得以用餐饮店的实例来领会。

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

 亚洲必赢官网 23

三层组织各层之间的的多少传递格局分为请求和响应八个艺术;

UI指的是服务员,BLL是炊事员,DAL是购买发卖员。

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

在消费者的眼底,只赏心悦目到服务员为他们服务。并不知道后台厨子和购买出售员是如何做的。对于上述三种不一样的角色的话,无论哪个环节出了难点,只需求转移2个职员和工人就能够照常营业的。

数值重临:数据层重回给业务逻辑层,在由职业逻辑层重返给表示层,然后由表示层举办展示;


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

三层架构的优势,依旧义务分开,降低耦合。

三层框架结构(笔者的领悟及详细分析)

接下去,看3个用到三层组织的登录实例。首先,必要声美赞臣(Meadjohnson)下。这几个实例中有众多bug供给优化。可是对此呈现三层的主要性思量足够了。仅仅是三个实例而已。

1怎样是三层

三层架构曾经学了一段时间,从来想做三个相比较完好、相比健全的总结。但是狼狈周章,不了解什么下笔。都说1切开始难嘛,明日重新整建了1晃繁杂的思绪,哎,依然没整理好,想到哪就说起哪吧。

 

初学者很不明了:

一,什么是三层?

2,为何使用三层?

3,三层与往年选择的两层相比较有怎样不一样?它的优势在哪儿?

4,如何学好三层?怎么着行使三层?

……

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

米先生一向重申:让学习和生存构成,把学习和生存联系,那样的上学才叫会学习,会生活。

对此三层笔者狼狈周章,怎样与实际相挂钩。好嘛,明晚黑马有了“灵感”。还记得大话设计方式里第一三章大鸟和菜肴吃羊肉串的典故——由在货摊吃到酒馆吃引来的3个指令格局(当然前日不是商量命令情势)。服务员、厨神、买卖员。

那不便是个规范的三层架构吗???(⊙ o ⊙ )啊!哈哈(那些前面再做表达)

 亚洲必赢官网 24

 

 

先了解:

 

数据库表:

1,什么是三层?

UI(表现层):重如若指与用户交互的分界面。用于吸收接纳用户输入的多寡和出示管理后用户须要的数据。

 

BLL:(业务逻辑层):UI层和DAL层之间的桥梁。完成工作逻辑。业务逻辑具体包括:验证、总计、业务规则等等。

 

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

 亚洲必赢官网 25

每1层都担当,那么该怎么样将三层沟通起来呢?

壹>单项引用(见下图)

二>那时候实体层(Entity)来了。(注:当然,实体层的法力不断那么些)

 

Entity(实体层):它不属于三层中的任何壹层,不过它是至关重要的1层。

 

Entity在三层架构中的功用:

一,达成面向对象观念中的”封装”;

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

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

三,对于初学者的话,能够这么敞亮:每张数据表对应一个实体,即每一种数据表中的字段对应实体中的属性(注:道理当然是那样的,事实上不是那般。为何?1>,大概大家供给的实体在数据表对应的实业中并不设有;2>,大家全然能够将富有数据表中的装有字段都放在一个实体里)

四,每壹层(UI—>BLL—>DAL)之间的数据传递(单向)是靠变量或实体作为参数来传递的,那样就组织了三层之间的关联,落成了遵循的得以达成。

然则对于大气的数码以来,用变量做参数有个别复杂,因为参数量太多,轻易搞混。比方:作者要把职工音信传送到下层,音讯蕴含:职员和工人号、姓名、年龄、性别、工资....用变量做参数的话,那么我们的点子中的参数就能点不清,极有相当大希望在使用时,将参数相称搞混。那时候,要是用实体做参数,就可以很便宜,不用思量参数相配的标题,用到实体中哪些属性拿来一贯用就能够,很有利。这样做也狠抓了作用。

 

注:这里怎么说能够暂时掌握为种种数据表对应1个实体??答:大家都知情,我们做系统的目的,是为用户提供服务,用户可不关注你的连串后台是怎么职业的,用户只关注软件是还是不是好用,分界面是或不是契合自身心意。用户在界面上轻巧的增、删、改、查,那么数据库中也要有相应的增、删、改、查,而增加和删除改查具体操作对象正是数据库中的数据,说白了就是表中的字段。所以,将每一个数据表作为三个实体类,实体类封装的天性对应到表中的字段,那样的话,实体在贯穿于三层之间时,就能够达成增加和删除改查数据了)

 

汇总:三层及实体层之间的借助关系:

 亚洲必赢官网 26

 

考虑根源生活:

 亚洲必赢官网 27

 

 

服务员:只管应接客人;

厨师:就算做客人点的菜;

采购员:只管按客人点菜的供给购买食材;

 

他俩各负其职,服务员不要了然厨子咋办菜,不用精通购销员怎么着购得食材;厨师不用知道服务员接待了哪位客人,不用知道买卖员怎么样购得食材;同样,购销员不用知道服务员接待了哪位客人,不用知道厨子咋办菜。

 

她们3者是什么联系的?

譬如说:厨子会做:炒矮瓜、炒鸡蛋、板面——此时营造多少个方法( cookEggplant()、cookEgg()、cookNoodle())

 

顾客一贯和服务员打交道,顾客和服务员(UI层)说:作者要3个炒落苏,而服务员不担任炒吊菜子,她就把请求往上递交,传递给厨神(BLL层),大厨须求白茄,就把请求往上递交,传递给购销员(DAL层),购买发售员从酒馆里取来吊菜子传回给厨神,厨子响应cookEggplant()方法,做好炒落苏后,又扩散给侍者,服务员把落苏突显给消费者。

那般就成功了3个一体化的操作。

 

在此进度中,吊菜子作为参数在三层中传送,假如买主点炒鸡蛋,则鸡蛋作为参数(那是变量做参数)。假使,用户扩展需要,我们还得在点子中加上参数,二个格局增添二个,二个格局设计到三层;何况实际中并不唯有设计到叁个办法的退换。所以,为了消除这一个难题,大家能够把紫茄、鸡蛋、面条作为品质定义到消费者实体中,1旦消费者扩大了炒鸡蛋须求,直接把鸡蛋属性拿出去用就可以,不用再去思考去每层的情势中加上参数了,更毫不思索参数的协作难点。

 

那样讲,不明白大家是还是不是足以清楚。(待会实例解释啊)

 

 亚洲必赢官网 28

二,为啥使用三层?

利用三层架构的目的:解耦!!!

同一拿地方饭店的事例来说:

(一)服务员(UI层)请假——另找服务员;厨神(BLL层)辞职——招聘另三个厨神;购销员(DAL)辞职——招聘另3个购销员;

(二)顾客反映:壹>你们店服务态度倒霉——服务员的主题素材。开掉服务员;

二>你们店菜里有虫子——厨子的标题。换厨神;

 

别的一层爆发变化都不会潜移默化到此外1层!!!

 

那是数码模块图:

三,与两层的分别??

两层:

 亚洲必赢官网 29

 

(当其余叁个地点产生变化时,都亟需重新开垦总序列统。“多层”放在1层,分工不鲜明耦合度高——难以适应须要变化,可爱抚性低、可扩张性低)

 

三层:

 亚洲必赢官网 30

 

 

(爆发在哪一层的变迁,只需改造该层,不要求更换全数系统。层次显明,分工明确,每层之间耦合度低——提升了频率,适应需要变动,可维护性高,可扩大性高)

 

综上:三层架构的

优势:一,结构清晰、耦合度低,二,可维护性高,可扩大性高;三,利于开采职分同步实行;轻便适应须要转换

 

劣势:一、降低了系统的性质。那是显然的。要是不选择分层式结构,多数事情能够直接待上访问数据库,以此博得相应的数据,近来却无法不通过中间层来达成。

二、有时会促成级联的修改。这种修改尤其映未来自上而下的趋向。纵然在表示层中须求追加八个成效,为保障其安顿符合分层式结构,可能供给在对应的业务逻辑层和数据访问层中都平添对应的代码

3、增添了代码量,增加了职业量

 

 亚洲必赢官网 31

四,三层的具体表现情势??

 亚洲必赢官网 32

 

UI:

 亚洲必赢官网 33

(我们不用误会,UI层不只是三个个用户分界面,也是内需有代码的)

 亚洲必赢官网 34

 

(1,成效:用户输入数据、反馈给用户数量;2,大家观望代码:未有提到到业务逻辑,直接传参、函数、方法调用,未有涉及到与数据库打交道的SQL语句和ADO.NET)

 

BLL:

 亚洲必赢官网 35

 

(一,BLL是表示层与数码访问层之间的大桥,肩负数据管理、传递;贰,大家观看代码,未有关系到分界面上的控件,未有关系到SQL语句和ADO.Net

 

DAL:

 亚洲必赢官网 36

 

 亚洲必赢官网 37

 

 亚洲必赢官网 38

 

 亚洲必赢官网 39

 

(1,以上是DAL层中DbUtil类、user_DA类和workRecord_DA类中的代码;二,大家观察代码,未有关系到分界面控件,未有关系到工作逻辑;唯有与数据库打交道的SQL语句和ADO.net)

 

Entity(Model)层:

 亚洲必赢官网 40

(定义了实体类user)

入眼以上三层:

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

2,通过传参、方法调用来得以落成效益;

三,各层之间负责;互不影响

 

比较两层结构,让大家深刻回味三层的天翻地覆好处:

依然以机房收取工资系统的登录为例:

 亚洲必赢官网 41

(观看地点的两层的代码:将业务逻辑、数据访问都显未来用户显示层,当需求必要改动时,需求改动整个连串。举个例子,小编把公文框txtPassWord的名号改为txtPwd的话,大家观望一下得必要改换多少地方。那样的改观算是小的,若是的确有业务须要上的退换才叫麻烦复杂,技士不跳楼才怪。呵呵、、开个笑话)

与那样为难适应供给变动的两层相比较,大家再次察看三层代码,再度思量,三层架构有哪些受益呢?本人想想。。。。。

 

投机去发现吧!!!

 

在互连网采集的相比较好的讲课三层架构的掌握,作者采访两有些,第三有个别轻便领悟,第3有的比较详细。也有…

精心的读者必定会开掘,除了UI,BLL,DAL这多个之外还有一个Moudel存在,这么些Moudel不属于别的一层,只是为着越来越好地链接三层而留存的。这些类只存款和储蓄,与以上3类共同选拔的东西。起3个和睦的功用。Moudel类,也正是实体类。

上面是这多少个档期的顺序的涉嫌。

 亚洲必赢官网 42

接下去供给看一下,他们分别是怎样兑现各自的分工的。

Entity类:

 

 

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; }

    }

}

U层:

 

 

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);

            }

        }

    }

}

B层:

 

 

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("登陆失败");

            }

        }

    }

}

 

D层:

 

 

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";

    }

}

 

 

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;

            }

             

        }

    }

}

 

 

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();

            }

        }

    }

}

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

施行成功的意况:

亚洲必赢官网 43

 

输入错误音信:

 亚洲必赢官网 44

固然那是一个非常的小的实例,但是用来读书三层却足足了。有写的不得了的地点可以知晓。

总计:对于使用三层架构的顺序来讲,哪层出错改哪个地方。一点都不小程度的狂跌了系统的耦合性。当然,具备档期的顺序的主次,维护起来明确要有益于广大。

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

二、

理解C#中得三层架构

       

  • 表示层
  • 事务逻辑层(BLL)
  • 数据访问层(DAL)

关联:发生依赖性关系

描述:三层种类布局便是在客户端和数据库之间加二个中间层,平日状态下客户端无法直接和数据库举办相互,而是经过中间层和数据层实行交互的。

  【表示层】

    首要承担落成用户和系统的交互。

    它接受用户输入的新闻,并把上级传来的管理结果表示给用户。盖层有时候包容一小部分事情逻辑层的职能(验证用户输入的数码及其合法性)

    一般作为Windows只怕Web应用程序

  【业务逻辑层】

    接收表示层传来的数码,以参数的情势传给数据访问层;然后接受数据层发来的拍卖好的多少,传给表示层。

    该层所做的干活相比复杂,如:落成业务流程、业务的数目校验

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

  【数据访问层】

    数据访问层为系统提供了标准,统壹数据的拜访入口,保障职业逻辑层对系统数据访问层的科班和高效,从而落成数量被火速、安全的造访

    该层会依照职业逻辑层的恳求去管理和数据库之间的相互,不对数据做任何事情上的加工

【本人见解】

  表示层接受用户的央求,依照用户的乞求去公告业务逻辑层,业务逻辑层收到请求,首先对请求实行查处,然后将呼吁发给数据访问层只怕直接重返到表示层,数据访问层收到请求后就从头走访数据库,数据访问层通过数据库的拜访取得请求的结果,并把结果通报纸出版业务逻辑层,业务逻辑层收到请求结果将请求结果文告表示层,表示层收到请求结果,然后把结果显示给用户;

  ps:用户登入种类就是那1施用的实例。

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

    那种传递是一步一步的拓展下去,一步一步的回来,不能够超过传递。

 

 

在三层之间,各层之间是相互信赖的涉嫌的,表示层依赖业务层逻辑,业务层注重数据访问层,三层之间通过自己提供的对外方法来传递访问

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

三层结构各层之间的的数目传递方式分为请求和响应两个主意;

种类正视方向:先从表示层传递到业务层再到数据层;

数值重临:数据层重回给职业逻辑层,在由职业逻辑层再次回到给表示层,然后由表示层进行展现;


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

三层架构(小编的接头及详细分析)

一如何是三层

  1. 2怎么使用三层
  2. 三与两层的分别
  3. 四三层的具身体表面现格局 

三层架构业已学了1段时间,一向想做二个相比较完整、相比健全的下结论。可是搜索枯肠,不知道哪些下笔。都说整个早先难嘛,今日整理了一晃繁杂的思绪,哎,依旧没整理好,想到哪就说起哪吧。

 

初学者很不通晓:

一,什么是三层?

二,为何接纳三层?

3,三层与过去选取的两层比较有何样两样?它的优势在哪儿?

4,怎么着学好三层?怎么着运用三层?

……

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

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

对于三层笔者费尽脑筋,怎么着与事实上相交流。好嘛,明晚突然有了“灵感”。还记得大话设计方式里第一三章大鸟和菜肴吃羝肉串的传说——由在地摊吃到饭馆吃引来的1个命令情势(当然明天不是研商命令方式)。服务员、厨子、购买出卖员。

那不正是个杰出的三层架构吗???(⊙ o
⊙ )啊!哈哈(这一个前面再做解释)

 亚洲必赢官网 45

 

 

先了解:

 

一,什么是三层?

UI(表现层):首如若指与用户交互的分界面。用于收纳用户输入的数量和呈现管理后用户需求的数目。

 

BLL:(业务逻辑层):UI层和DAL层之间的大桥。落成工作逻辑。业务逻辑具体包涵:验证、总结、业务规则等等。

 

DAL:(数据访问层):与数据库张罗。主要达成对数据的增、删、改、查。将积累在数据库中的数据交到给业务层,同时将业务层管理的数码保存到数据库。(当然那个操作都是基于UI层的。用户的需要反映给分界面(UI),UI反映给BLL,BLL反映给DAL,DAL实行多少的操作,操作后再一1重回,直到将用户所需数据上报给用户)

 亚洲必赢官网 46

每一层都负责,那么该哪些将三层交换起来吧?

壹>单项引用(见下图)

二>那时候实体层(Entity)来了。(注:当然,实体层的意义持续那几个)

 

Entity(实体层):它不属于三层中的任何1层,然则它是必需的壹层。

 

Entity在三层架构中的成效:

1,落成面向对象思想中的”封装”;

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

注:适龄的说实体层贯穿于三层之间,来再而三三层)

3,对于初学者的话,能够这么敞亮:每张数据表对应二个实体,即各种数据表中的字段对应实体中的属性(注:本来,事实上不是如此。为何?一>,大概大家必要的实业在数据表对应的实体中并不存在;2>,我们全然能够将有着数据表中的全体字段都坐落一个实体里)

四,每一层(UI—>BLL—>DAL)之间的数额传递(单向)是靠变量或实体作为参数来传递的,那样就布局了三层之间的调换,达成了职能的贯彻。

唯独对于大气的数据以来,用变量做参数有个别复杂,因为参数量太多,轻巧搞混。举个例子:作者要把职员和工人消息传递到下层,音讯包含:职员和工人号、姓名、年龄、性别、薪金....用变量做参数的话,那么我们的措施中的参数就能够不计其数,极有异常的大只怕在选择时,将参数相配搞混。那时候,假诺用实体做参数,就能够很有益,不用思索参数相配的题目,用到实体中哪些属性拿来直接用就足以,很方便。这样做也加强了频率。

 

注:此间为啥说能够一时精通为各样数据表对应1个实体??答:大家都精通,大家做系统的目的,是为用户提供服务,用户可不关怀你的系统后台是怎么工作的,用户只关切软件是或不是好用,分界面是或不是吻合本人意志。用户在界面上轻巧的增、删、改、查,那么数据库中也要有相应的增、删、改、查,而增加和删除改查具体操作对象就是数据库中的数据,说白了正是表中的字段。所以,将各样数据表作为四个实体类,实体类封装的性质对应到表中的字段,那样的话,实体在贯穿于三层之间时,就足以兑现增加和删除改查数据了)

 

综上所述:三层及实体层之间的信赖关系:

 亚洲必赢官网 47

 

牵挂根源生活:

 亚洲必赢官网 48

 

 

服务员:只管接待客人;

厨师:尽管做客人点的菜;

采购员:亚洲必赢官网 ,只管按客人点菜的渴求购买食材;

 

她们各负其职,服务员不要精晓厨神怎么做菜,不用精晓购买出售员怎么样购得食材;大厨不用知道服务员招待了哪位客人,不用知道购买发卖员怎么样购买食材;同样,购销员不用知道服务员应接了哪位客人,不用知道大厨如何是好菜。

 

她们叁者是什么样联系的?

譬如:大厨会做:炒落苏、炒鸡蛋、大刀面——此时营造八个主意( cookEggplant()、cookEgg()、cookNoodle())

 

顾客一直和服务员打交道,顾客和服务员(UI层)说:笔者要二个炒白茄,而服务员不担负炒吊菜子,她就把请求往上递交,传递给厨子(BLL层),厨子须要白茄,就把请求往上递交,传递给购销员(DAL层),买卖员从仓Curry取来矮瓜传回给厨子,厨神响应cookEggplant()方法,做好炒紫茄后,又传来给服务生,服务员把白茄显示给消费者。

如此就完事了二个全部的操作。

 

在此过程中,落苏作为参数在三层中传递,假诺消费者点炒鸡蛋,则鸡蛋作为参数(那是变量做参数)。倘诺,用户扩充要求,大家还得在艺术中加上参数,叁个主意增多二个,3个措施设计到三层;何况实际中并不只有设计到三个艺术的改造。所以,为了减轻那么些难点,大家得以把紫茄、鸡蛋、面条作为质量定义到买主实体中,壹旦消费者扩张了炒鸡蛋要求,直接把鸡蛋属性拿出来用就可以,不用再去怀想去每层的点子中丰裕参数了,更毫不考虑参数的合营难题。

 

如此讲,不掌握大家是否足以驾驭。(待会实例解释吗)

 

2,为何使用三层?

应用三层框架结构的目的:解耦!!!

平等拿地方酒馆的事例来说:

(一)服务员(UI层)请假——另找服务员;厨子(BLL层)辞职——招聘另3个大厨;购买发售员(DAL)辞职——招聘另1个买卖员;

(贰)顾客反映:1>你们店服务态度不佳——服务员的标题。开除服务员;

二>你们店菜里有虫子——厨神的标题。换厨子;

 

别的一层产生变化都不会潜移默化到此外1层!!!

 

3,与两层的差异??

两层:

 亚洲必赢官网 49

 

(当别的1个地点发生变化时,都亟需重新开拓总连串统。“多层”放在一层,分工不举世瞩目耦合度高——难以适应供给转换,可爱戴性低、可扩张性低)

 

三层:

 亚洲必赢官网 50

 

 

(产生在哪壹层的变通,只需退换该层,无需退换全部系统。档次明显,分工明显,每层之间耦合度低——提升了频率,适应供给变化,可维护性高,可增加性高)

 

综上:三层架构的

优势:一,结构清晰、耦合度低,二,可维护性高,可增加性高;叁,利于开荒职责同步举行;轻巧适应要求变动

 

劣势:一、降低了系统的质量。这是领悟的。如若不应用分层式结构,多数作业能够一直访问数据库,以此博得相应的数额,近日却无法不通过中间层来成功。

贰、有时会导致级联的修改。那种修改特别显示在自上而下的动向。倘使在表示层中需求充实3个意义,为力保其设计适合分层式结构,可能要求在相应的政工逻辑层和数目访问层中都追加对应的代码

三、扩大了代码量,增添了职业量

 

四,三层的具体表现情势??

 亚洲必赢官网 51

 

UI:

 亚洲必赢官网 52

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

 亚洲必赢官网 53

 

(1,功能:用户输入数据、反馈给用户数据;二,大家阅览代码:未有关系到业务逻辑,直接传参、函数、方法调用,未有涉嫌到与数据库打交道的SQL语句和ADO.NET)

 

BLL:

 亚洲必赢官网 54

 

(一,BLL是表示层与数量访问层之间的桥梁,担当数据管理、传递;二,大家阅览代码,未有提到到分界面上的控件,没有涉及到SQL语句和ADO.Net

 

DAL:

 亚洲必赢官网 55

 

 亚洲必赢官网 56

 

 亚洲必赢官网 57

 

 亚洲必赢官网 58

 

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

 

Entity(Model)层:

 亚洲必赢官网 59

(定义了实体类user)

考查以上三层:

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

二,通过传参、方法调用来兑现效益;

三,各层之间担当;互不影响

 

相比较两层结构,让大家长远体会三层的宏大好处:

或然以机房收取金钱系统的登录为例:

 亚洲必赢官网 60

(观看地点的两层的代码:将业务逻辑、数据访问都呈以往用户展现层,当须要须求退换时,要求改换一切体系。比方,笔者把文件框txtPassWord的称呼改为txtPwd的话,大家阅览一下得要求变更加多少地点。那样的改换算是小的,固然确实有作业须要上的转移才叫麻烦复杂,技师不跳楼才怪。呵呵、、开个笑话)

与那样难以适应须要变动的两层相比较,咱们再也考察三层代码,再一次思虑,三层架构有怎么着收益吗?自身思量。。。。。

 

温馨去开采吧!!!

 

网站地图xml地图