三层架构视频学习总结
学习三层的资料是王继彬视频,下面先总结一下视频里面的知识点。
结合这张图,说一下自己对三层的理解。
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; } } }
学习总结:
见到过这样的说法:成也三层,败也三层。由此可见三层的重要性。用好了的话,能更好的服务于我们设计研发的软件。一定要理解其思想,将其运用到实际当中。