1、三层结构开发模式
三层结构式基于模块化程序设计的思想,为实现分解应用程序的需求,而逐渐形成的一种标准模式的模块划分方法。
2、为什么要用三层结构
个人理解:采用分层增强了类和类之间的独立性,在团队合作开发的过程中能大大提高了开发的速率;在后期的维护工作中更容易;在程序员写代码的过程中,不会因为某个小小的需求的改变而大整整个系统模块,只需要改有问题的那一层就好了,比如说当数据库要改变的时候,只需要调整数据库就好了,不需 要重新开发,只做一些简单的调整即可。但是三层也有缺点就是执行速度不够快,所以说并不是所有的系统都要用三层架构去实现。
3、三层架构分类
三层架构划分为表现层(UI,user interface)、业务逻辑层(BLL,Business Logic Layer)、数据访问层(DAL,Data Access Layer),这样有利于系统的开发、维护、部署,实现了“高内聚,低耦合”。采用分层方法,把问题划分开一个一个解决,易于控制,易于延展,易于分配资源。
4、三层结构的概念以及之间的关系
概念
表示层位于最上层,用于显示和接收用户提交的数据,为用户提供交互式的界面。表示层一般为Windows窗体应用程序或Web应用程序。
业务逻辑层是表示层和数据访问层之间沟通的桥梁,主要负责数据的传递和处理。
数据访问层主要实现对数据的读取、保存和更新等操作。
关系
下图是各层的工作流程
在三层结构中,各层之间相互依赖,表示层依赖于业务逻辑层,业务逻辑层依赖于数据访问层。
5、如何搭建三层结构?
创建
打开VS2012,新建一个解决方案,新建一个类库LoginSolution,命名为LoginDAL,如下图
添加一个类库,业务逻辑层
创建一个WinForm窗体,UI表示层
代码
Model层
namespace MyBookShop.Models
{
public class User
{
public User() { }
//编号属性
public int id;
public int Id
{
//属性id的get和set方法
get { return id; }
set { id = value; }
}
//登录名属性
private string loginId;
//属性loginId的get和set方法
public string LoginId
{
get { return loginId; }
set { loginId = value; }
}
//密码属性
private string loginPwd;
//loginPwd属性的get和set方法
public string LoginPwd
{
get { return loginPwd; }
set { loginPwd = value; }
}
//姓名属性
private string name;
//属性name的get和set方法
public string Name
{
get { return name; }
set { name = value; }
}
}
}
业务逻辑层BLL
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using MyBookShop.DAL;
using MyBookShop.BLL;
using MyBookShop.Models;
namespace MyBookShop.BLL
{
public class UserManager
{
//登录验证
public static bool Login(string loginId, string loginPwd, out User validUser)
{
User user = UserService.GetUserByLoginId(loginId);
//没有该用户信息
if (user == null)
{
validUser = null;
return false;
}
//密码正确
if (user.LoginPwd == loginPwd)
{
validUser = user;
return true;
}
//密码错误
else
{
validUser = null;
return false;
}
}
}
}
数据访问层DAL
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;
using System.Data.SqlClient;
namespace MyBookShop.DAL
{
public class UserService
{
//根据登录名查询用户信息
public static User GetUserByLoginId(string LoginId)
{
string sql = "select * from Users where LoginId=@LoginId";
using (SqlDataReader reader = DBHelper.GetReader(sql, new SqlParameter("@LoginId", LoginId)))
{
if (reader.Read())
{
//找到该用户信息后,将其保存到User对象中,并返回该对象
User user = new User();
user.id = (int)reader["Id"];
user.LoginId = (string)reader["LoginId"];
user.LoginPwd = (string)reader["LoginPwd"];
reader.Close();
return user;
}
else
{
reader.Close();
//未找到该用户,返回null
return null;
}
}
}
}
}
表示层UI
界面
namespace LoginUI
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void btnLogin_Click(object sender, EventArgs e)
{
string userName = txtUserName.Text.Trim();
string password=txtPassword .Text;
Login.BLL.UserManager mgr = new Login.BLL.UserManager();
Login.Model .User user=mgr.UserLogin(userName, password);
MessageBox.Show("登录用户:" + user.UserName);
}
}
}
6、实体类
把数据表或其它持久化数据的格式映射成的类,就是实体类。
对实体类的理解:
1)与数据库里面表做对应,一个实体类对应一张表,这样与数据库交互时就可以一一对应,对数据库进行操作
2)把常用的字段封装到一起,为我们在关系数据库和对象之间架起一座桥梁
3)避免U层,B层,D层互相引用,交叉引用
4)实体类用来传输数据的业务数据模型
5)实体类不用知道其他三层的存在