学习三层的资料是王继彬视频,下面先总结一下视频里面的知识点。
结合这张图,说一下自己对三层的理解。
1.三层架构的构成:
【表现层(UI)】通俗是展现给用户的界面,及用户在使用一个系统的时候他的所见所得.
作用:向用户展示特定的业务数据、采集用户的输入信息和操作
【业务逻辑层(BLL)】针对具体问题操作,也可以说是对数据层的操作,对数据业务逻辑处理
【数据访问层(DAL)】该层所做事物直接访问数据库,针对数据库的增,删,改,查等.
作用:从数据源加载、写入、删除数据
【实体层】可以简单的理解为是一个描述业务实体的类,是数据传输的载体。
作用:为我们在关系数据库和对象之间架起了一座桥梁。
重要性:它不是属于三层,但却是三层中必不可少的元素。
2.主要思想:降低耦合性。(分层是为了使任何一层的变化都不影响其他层)
3.各层之间的引用关系、原则
从上图中我们可以看出:U层引用B层、B层引用D层、三层均引用实体层。而且按照请求执行的方向,信息反馈再沿着相反方向反馈回来,完成命令的执行。
原则:各层之间不可相互引用。
4.为什么要使用三层?
项目描述:实现一个用户登录的功能,并且要求每登录一次加10个积分。
代码思路:首先是划分三层:表现层(显示用户需求界面)、业务逻辑层(编写业务处理流程代码)、数据访问层(新建数据库并做好数据连接访问。)实体层(考虑到User类和Score类,使用的频率较大,较复杂,所以抽象出来便于访问。)
具体代码实现:
Ⅰ、U层:
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.LoginManager mgr = new Login.BLL.LoginManager();
Login.Model.Userinfo user= mgr.UserLogin(userName, password);
MessageBox.Show("登录用户:" + user.UserName);
}
}
}
Ⅱ接下来要设计B层:业务逻辑分析,需要注意的是,编码的时候应该考虑到登录的各种具体情况。
namespace Login.BLL
{
public class LoginManager
{
public Login.Model.Userinfo UserLogin(string userName, string password)
{
Login.DAL.UserDAO uDao = new Login.DAL.UserDAO();
Login.Model.Userinfo user = uDao.SelectUser(userName, password);
if (user != null)
{
Login.DAL.ScoreDAO sDao = new Login.DAL.ScoreDAO();
sDao.UpdateScore(userName, 10);
return user;
}
else
{
throw new Exception("登录失败.");
}
}
}
}
Ⅲ、分析完需求并设计好界面之后,需要把这些东西存储在数据库中,接下来转向D层的设计。
public static string ConnString = @"Server=.; Database=Login; User ID=sa; Password=***";
namespace Login.DAL//User类
{
public class UserDAO
{
public Login .Model .Userinfo SelectUser(string userName, string password)
{
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))
{
user.Email = reader.GetString(3);
}
}
return user;
}
}
}
}
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 SCORES(UserName,Score)Values(@UserName,@Score)";
cmd.Parameters.Add(new SqlParameter("@UserName", userName));
cmd.Parameters.Add(new SqlParameter("@Score",value));
conn.Open();
cmd.ExecuteNonQuery();
}
}
}
Ⅳ、很明显,各层中均会用到User和Password,相互引用会引起不必要的麻烦,所以在这里有必要抽象出一个实体类来。
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; }
}
}
学习总结:
见到过这样的说法:成也三层,败也三层。由此可见三层的重要性。用好了的话,能更好的服务于我们设计研发的软件。一定要理解其思想,将其运用到实际当中。