三层:
在客户端和数据库之间加入中间层。
(1)页面层
也称UI层或U层,接受返回的数据和客户的应用请求,并且显示出客户所需要的数据。
(2)业务逻辑层
也称BLL层或B层。主要是负责对数据层的操作,从UI中获取用户指令和数据,执行业务逻辑。在需要的时候将数据传给D层,
也可以从DAL中获取数据,以供 UI 显示用 。
(3)数据访问层
主要是对数据库的操作,为业务逻辑层和页面层提供服务。
三成架构之间的数据传递方向:
优点:
(1)降低了耦合,各层之间的依赖降低
(2)各层之间的结构和功能明确
(3)增加了代码的复用
(4)使代码更加符合封闭开放原则。
缺点:
(1)降低了系统的性能。
(2)开发的难度较大。
实例
实现登录功能
U层代码
namespace LoginUI
{
//只提供用户交互不包含任何的逻辑处理
public partial class Form1 : Form
{
public Form1()
{
//初始化窗体上的所有控件
InitializeComponent();
}
public void butLogin_Click(object sender, EventArgs e)
{
//获得登录窗体的用户名 Trim去空格操作,注意和VB的形式不一样
string userName = textUsername.Text.Trim();
//因为密码中可能是空格所以不用去空格操作
string password = textPassword.Text;
///只和业务逻辑层和model交互
//和业务逻辑层进行交互,实例化LoginService类
Login.Bll.LoginService mgr = new Login.Bll.LoginService();
//和MODEL交互将数据层的信息传入MODEL
Login.Model.UserInfo user=mgr.UserLogin(userName, password);
//登陆成功提示登陆成功
MessageBox.Show("登录用户:"+user.UserName);
}
private void Form1_Load(object sender, EventArgs e)
{
}
}
}
B层代码
namespace Login.Bll
{
public class LoginService
{
//通过获取UI层传来的操作,决定执行业务逻辑,在需要数据访问时将数据交给Dal层
public Login.Model.UserInfo UserLogin(string userName,string password)
{
//实例化USERDAo类
Login.DAl.UserDAO uDao = new Login.DAl.UserDAO();
//给UserInfo进行赋值
Login.Model.UserInfo user=uDao.SelectUser(userName, password);
if (user != null) //登录成功
{
Login.DAl.ScoreDAO sDao = new Login.DAl.ScoreDAO(); //增加积分
sDao.UpdateScore(userName, 10);//登录成功增加10积分
return user;
}
else
{
MessageBox.Show("登录失败");
throw new Exception("登录失败");
}
}
}
}
D层
连接数据库
namespace Login.DAl
{
class DbUtil
{
//连接数据库,被数据访问层其他的UserDAO和SCOReDAO调用
public static string ConnString = @"Server=.;Database=loginin;User ID=sa;Password=123456";
}
}
namespace Login.DAl
{
public class ScoreDAO
{
public void UpdateScore(string userName,int value)
{
//调用并且实例化一个链接
using (SqlConnection conn = new SqlConnection(DbUtil.ConnString))
{
// //创建命令
SqlCommand cmd = conn.CreateCommand();
//设置操作语句
cmd.CommandText = @"INSERT INTO Score(UserName,Score) Values(@UserName,@Score)";
//Parameters范围 获取并添加SqlParameter的值
cmd.Parameters.Add(new SqlParameter("@UserName", userName));
cmd.Parameters.Add(new SqlParameter("@Score", value));
//打开链接
conn.Open();
//返回受影响的行数
cmd.ExecuteNonQuery();
conn.Close();
namespace Login.DAl
{
public class UserDAO
{
//根据用户名和密码选择用户,
public Login.Model.UserInfo SelectUser(string UserName,string PassWord)
{
//using 表示调用SqlConnection conn = new SqlConnection(DbUtil.ConnString) 创建连接
using (SqlConnection conn = new SqlConnection(DbUtil.ConnString))
{
//创建命令
SqlCommand cmd = conn.CreateCommand();
//设置操作语句
cmd.CommandText = @"SElECT * FROM Users Where UserName=@UserName AND PassWord=@PassWord";
//CommandType 获取或设置一个值,该值指示释 CommandText 是SQL语句,存储过程还是表操作。
cmd.CommandType = CommandType.Text;
//获取 SqlParameter的值,将SqlParameter的值传给Parameters
cmd.Parameters.Add(new SqlParameter("@UserName", UserName));
cmd.Parameters.Add(new SqlParameter("@Password", PassWord));
conn.Open();
// SqlDataReader读取数据
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)) //not suggestion
{
user.Email = reader.GetString(3);
}
}
conn.Close();
return user;
}
//throw new NotImplementedException();
}
}
}
}
}
}
}
为了方便三层之间传递数据增加MODEL类
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; }
}
}