【三层架构】入门知识梳理

   1.什么是三层?

  三层架构(3-tierarchitecture) 通常意义上的三层架构就是将整个业务应用划分为:表现层(UI)、业务逻辑层  (BLL)、数据访问层(DAL)

  2.三层架构使用背景

  当业务复杂到一定程度,数据需要在另外的数据库内存储时,需要将分层来编写程序

  3 程序分层的目的

  •    解耦和
  •    适应程序需求的变化 

  4.程序分层的优点

  • 1、开发人员可以只关注整个结构中的其中某一层;
  • 2、可以很容易的用新的实现来替换原有层次的实现;
  • 3、可以降低层与层之间的依赖;
  • 4、有利于标准化;
  • 5、利于各层逻辑的复用。
  • 6、结构更加的明确
  • 7、在后期维护的时候,极大地降低了维护成本和维护时间

  5 程序分层的缺点

  • 1、降低了系统的性能。这是不言而喻的。如果不采用分层式结构,很多业务可以直接造访数据库,以此获取相应的数据,如今却必须通过中间层来完成。
  • 2、有时会导致级联的修改。这种修改尤其体现在自上而下的方向。如果在表示层中需要增加一个功能,为保证其设计符合分层式结构,可能需要在相应的业务逻辑层和数据访问层中都增加相应的代码。
  • 3、增加了开发成本。

 6.三层架构工作流程图


  7.每层具体分析

    1.UI表现层

  •           表现层(UI):通俗讲就是展现给用户的界面,即用户在使用一个系统的时候他的所见所得。
  •      作用:主要表示WEB方式,也可以表示成WINFORM方式,WEB方式也可以表现成:aspx,如果逻辑层相当强大和完善,无论表现层如何定义和更改,逻辑层都能完善地提供服务。
  • 设计原则:用户至上,兼顾简洁

    2.BLL业务逻辑层

  •           业务逻辑层(BLL):针对具体问题的操作,也可以说是对数据层的操作,对数据业务逻辑处理。
  •      作用:主要是针对具体的问题的操作,也可以理解成对数据层的操作,对数据业务逻辑处理,如果说数据层是积木,那逻辑层就是对这些积木的搭建。

    3.DAL数据访问层

  •      数据访问层(DAL):该层所做事务直接操作数据库,针对数据的增添、删除、修改、查找等
  •      作用:主要是对原始数据(数据库或者文本文件等存放数据的形式)的操作层,而不是指原始数据,也就是说,是对数据的操作,而不是数据库,具体为业务逻辑层或表示层提供数据服务.


    8.每层区分方法 

  •      1 UI表示层  离用户最近的,为用户提供一种交互式操作界面
  •    2 BLL业务逻辑层  对支持可扩展的框架尤为重要,他是表示层的被调用者
  •    3 DAL数据访问层  主要负责数据库的访问 实现对数据的增删改查

  9.生活中的三层

   此处已餐馆顾客,服务员 ,厨师,采购人员为例子 参照下图:
 
  注释: 顾客点菜->服务员记菜单->厨师根据菜单做菜->采购员提供材料
         顾客吃菜<-服务员送菜<-厨师提供菜<-采购员提供菜
         这也就像图中所示,每个环节就类似三层架构,各司其职,每个环节出了问题都不会影响其他环节的正常运行

  10 如何构建三层

     以VS2010为平台,C#为例子

    1.每个层次都需要如何创建?

      表示层:windows应用程序
      业务逻辑层:类库
      数据访问层:类库
      实体类:类库   (加入实体类,用于存储参数,进而在三层之间传递)

   2  UI层创建


   3.D层创建


  4.其他层的创建

    其他层也是创建相应的类库,因此创建方法与D层的创建相同 那么在创建后这些层之间是没有任何联系的,因此我们需要给他们之间联系起来,这就需要了解层之间的关系,然后再项目中添加引用即可  创建好了三层后,余下的任务也就是写出我们想要实现的程序了

  5.创建好的例子



  6 关于添加引用


  11.简单的三层登陆例子

  三层的搭建在我们仔细的手下,完成了,那么我们来实现一个小例子,更深一步的了解三层,在这里我要分享一下自己的一点学习心得,在我们敲例子之前,首先要会数据库的连接以及基本的操作,其次,对于命名空间,以及Using的使用也要会点,关于实体类的作用等等   如果你敲的三层例子不能正常运行,那么也许就是我们疏忽了引用using 。事先打好基础,会在自己的学习道路上少走许多弯路  下面看例子

实体类  Model
  
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Login.Model
{
    public class UserInfo
    {
        public  string userName;
        public string UserName
        {
            get { return userName; }
            set { userName = value; }
        }
       public   string password;
       public string PassWord
       {
           get { return password; }
           set { password = value; }
       }


    }
}
BLL层
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Login.BLL;
using Login.DAL;
using Login.Model;
namespace Login.BLL
{
   public  class LoginManager
    {
       public UserInfo UserLogin(string userName, string password)
       {
          
           UserDAO uDao = new UserDAO();  //实例化D层的类
           UserInfo user = uDao.SelectUser(userName, password); //将user信息传递给D层
           if (user == null)  //判断user信息
           { 
               throw new Exception("登陆失败");
           }
           else
           {
               return user;
           }


       }
    }
}

DAL层
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Login.Model ;
using System.Data .SqlClient ;
using System.Data;

namespace Login.DAL
{
    public class UserDAO
    {
       //连接数据库
        public static string ConnString = @"Server=ASUS-pc; Database=chargeStudent; User ID=sa; Password=123456";
       
        public  UserInfo SelectUser(string userName, string password) //每层都要用到实体类userInfo 通过实体类连接

        {
            
            using (SqlConnection conn = new SqlConnection(ConnString))
            {
                SqlCommand cmd = conn.CreateCommand(); //数据库连接命令
                cmd.CommandText = @"select * from user_Info where user_Name=@userName AND user_PWD=@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();  //读取数据
                 UserInfo user = new UserInfo();
                while (reader.Read())
                {
                    
                    user.userName = reader.GetString(0);
                    user.password = reader.GetString(1);
                   
                }
                  return user;
            }
          
        }

    }
}

UI层界面


代码:
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;
using System.Data.SqlClient;
using Login.BLL;
using Login.Model;
namespace LoginUI
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }


        private void btnLogin_Click(object sender, EventArgs e)
        {
          LoginManager mgr = new LoginManager(); //实例化B层的类
            string userName = txtUserName.Text.Trim();
            string Password = txtPassword.Text;
          UserInfo user= mgr.UserLogin (userName, Password);  //将user信息传递给B层
          MessageBox.Show("登录用户:" + userName   );
        }
    }
}

    12 小结

 该例子经过实践可以运行,在运行小例子的过程中,通过代码,让我对于三层以及之间的关系更进一步的了解了,再次分享,如有错误,欢迎指正! 到此为此,三层的初步学习告一段落!  向下一目标进军

  • 6
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 13
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值