上篇文章我们介绍了一下三层架构的基础知识,这次就让我们来探寻一下他的运行机制吧。
1、实体层
(1)是什么
实体类——实体类其实是存放数据的,我们在数据库读取的数据就是存放在实体层里面的(是辅助数据库的映射,可以理解为传递数据的载体)。实体类主要是作为数据管理和业务逻辑处理层面上存在的类别;
它们主要在分析阶段区分实体类的主要职责是存储和管理系统内部的信息,它也可以有行为,甚至很复杂的行为,但这些行为必须与它所代表的实体对象密切相关。实体类对应数据库中一个表,实体类的每个属性对应表中相应的字段,使用实体类符合面向对象编程的思想,把一个表封装成一个类。
(2)有什么用
程序在运行时,每一层(UI—>BLL—>DAL)之间的数据传递(单向)是靠变量或实体作为参数来传递的,这样就构造了三层之间的联系,完成了功能的实现。但是对于大量的数据来说,用变量做参数有些复杂,因为参数量太多,容易搞混。比如:我要把员工信息传递到下层,信息包括:员工号、姓名、年龄、性别、工资....用变量做参数的话,那么我们的方法中的参数就会很多,极有可能在使用时,将参数匹配搞混。这时候,如果用实体做参数,就会很方便,不用考虑参数匹配的问题,用到实体中哪个属性拿来直接用就可以,很方便。。
因此,实体类有一下作用
1,实现面向对象思想中的"封装";
2,贯穿于三层,在三层之间传递数据;
3,提高了效率;
2、运行前提
程序要想运行,首先要将三层及Entity连接起来,也就是在项目中添加引用。
引用关系为:UI引用BLL和Entity;BLL引用DAL和Entity;DAL只引用Entity。
3、运行机制
4、运行实例
(1)登陆之UI层
主要是提供给用户界面,跟用户交互
登陆按钮的代码
[vb] view
plaincopy
- private void button1_Click(object sender, EventArgs e)
- {
- //实例化一个模型对象
- Login.Model.UserInfo user = new Login.Model.UserInfo();
- //讲参数传给该对象
- user.UserName=txtUserName.Text.Trim();
- user.Password=txtPassword.Text;
- //实例化B层
- Login.BLL.UserManager mgr = new Login.BLL.UserManager();
- //将该对象传给B层处理
- Login.Model.UserInfo User = mgr.UserLogin(user);
- //显示传回的信息
- MessageBox.Show ("登录用户名:"+User.UserName );
- }
(2)登陆之BLL层
UserManager类
[vb] view
plaincopy
- public class UserManager
- {
- public Login.Model.UserInfo UserLogin(Login.Model.UserInfo user)
- {
- //调用D层
- Login.DAL.UserDAO udao = new Login.DAL.UserDAO();
- //让D层判断信息是否正确
- Login.Model.UserInfo User = udao.SelectUser(user);
- if (User == null)
- {
- //如果用户名错误,将提示用户
- throw new Exception("用户名不正确!");
- }
- else if (User.Flag==false)
- {
- throw new Exception("密码错误,登陆失败!");
- }
- else
- {
- //成功登陆,返回用户信息
- return User;
- }
- }
- }
(3)登陆之DAL层
DBUtil类
[vb] view
plaincopy
- class DBUtil
- {
- //连接数据库语句
- public static string ConnString = @"server=localhost;Database=Login;User=sa;Password=123456;";
- }
UserDAO类
[vb] view
plaincopy
- public class UserDAO
- {
- public Login.Model.UserInfo SelectUser(Login.Model.UserInfo user)
- {
- //连接数据库,验证信息
- using (SqlConnection conn=new SqlConnection(DBUtil.ConnString))
- {
- SqlCommand cmd = conn.CreateCommand(); //用于处理数据库
- //判断用户名是否存在
- cmd.CommandText = @"SELECT * FROM USERS WHERE [email protected]";
- //获得查询语言
- cmd.CommandType = CommandType.Text;
- //添加查询语言中的参数
- cmd.Parameters.Add(new SqlParameter("@UserName", user.UserName));
- //cmd.Parameters.Add(new SqlParameter("@Password", user.Password));
- conn.Open();
- //查询并返回结果
- SqlDataReader reader = cmd.ExecuteReader();
- //声明一个返回实例,如果用户名不存就返回空实例
- Login.Model.UserInfo User = null;
- while (reader.Read())
- {
- //如果用户名存在,就验证密码是否正确
- if (User==null)
- {
- User=new Login.Model.UserInfo();
- }
- //如果密码存在就返回用户信息
- if (user.Password ==reader.GetString(2))
- {
- User.Flag = true; //用户密码正确的标志
- //传回用户信息,即实体的属性
- User.ID = reader.GetInt32(0);
- User.UserName = reader.GetString(1);
- User.Password = reader.GetString(2);
- //如果邮箱不为空,则取出
- if (!reader.IsDBNull(3))
- {
- User.Email = reader.GetString(3);
- }
- }
- else
- {
- User.Flag = false; //用户密码错误的标志
- }
- }
- return User; //传回实体
- }
- }
- }
(4)登陆之Model层
UserInfo类
[vb] view
plaincopy
- public class UserInfo
- {
- public int ID { get; set; }
- public string UserName { get; set; }
- public string Password { get; set; }
- public string Email { get; set; }
- public bool Flag;
- }
最后登陆成功
三层架构与四大天王之前传