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