三层浅析及示例分析
来源:互联网 发布:mac创建新文件夹 编辑:程序博客网 时间:2024/06/06 02:53
三层都是哪三层?它们的作用是什么?三层结构包含:表示层UI,业务逻辑层BLL,数据访问层DAL。1显示层,就是软件的显示部分,主要是客户端,通常表现为WEB或窗体。主要功能:接受用户输入信息、显示系统输出信息、为用户提供一个交互界面。 2 业务逻辑层,系统主要功能部分,主要处理软件的业务逻辑,处理数据。 3数据访问层,用于对数据库的操作,但不是数据库。
为什么要使用三层?设计模式告诉我们,软件设计开发要遵循开放--封闭原则,也就是说一款软件可以增加功能或代码,但是不能修改。使用三层结构以前,显示层、业务逻辑层、数据访问层都是耦合在一起的,如果我们需要变动客户端的内容,那么业务逻辑层就必须要改动,这是不安全的,所以我们需要把业务逻辑层单独处理,以减少它们之间的耦合。
以一个简单的登录示例来介绍三层的具体实现。看一下三层之间的关系图:
三层之间通过传递参数进行联系,如果参数过多,会使程序变得复杂化,这里我们引入实体来进行参数传递,同时数据库应该独立于数据访问层而存在,关系图需要改进,改进后的关系图如下:
(sqlhelper用于封装数据库连接语句,属于DAL层):
解决方案:
看一下各层的代码是如何实现各自功能的。U层代码:
- namespace LoginUI
- {
- public partial class Form1 : Form
- {
- public Form1()
- {
- InitializeComponent();
- }
- private void btnOK_Click(object sender, EventArgs e) //双击事件
- {
- Login.Model.UserInfo user1 = new Login.Model.UserInfo(); //使用实体传递数据
- user1.UserName = txtUserName.Text.Trim();
- user1.Password = txtPassword.Text.Trim();
- Login.BLL.LoginManager mgr = new Login.BLL.LoginManager(); //定义一个业务逻辑类
- Login.Model.UserInfo user4 = mgr.UserLogin(user1); //定义实体存放登录结果(逻辑层比较结果)
- if (user4 == null)
- {
- MessageBox.Show("信息不正确"); //账号或密码不正确
- }
- else
- {
- MessageBox.Show("登录用户" + user1.UserName); //登录
- }
- }
- }
- }
namespace LoginUI{ public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void btnOK_Click(object sender, EventArgs e) //双击事件 { Login.Model.UserInfo user1 = new Login.Model.UserInfo(); //使用实体传递数据 user1.UserName = txtUserName.Text.Trim(); user1.Password = txtPassword.Text.Trim(); Login.BLL.LoginManager mgr = new Login.BLL.LoginManager(); //定义一个业务逻辑类 Login.Model.UserInfo user4 = mgr.UserLogin(user1); //定义实体存放登录结果(逻辑层比较结果) if (user4 == null) { MessageBox.Show("信息不正确"); //账号或密码不正确 } else { MessageBox.Show("登录用户" + user1.UserName); //登录 } } }}U层代码要实现两个功能,获得用户输入信息和显示系统输出信息,我们使用user1获得用户输入信息,使用user4获得B层的下层反馈信息,并且最后显示系统登录内容。U层没有任何的系统逻辑事物处理,也没有和数据库直接联系,降低了系统耦合度。
D层代码:
- namespace Login.DAO
- {
- public class UserDAO //用户数据操作类
- {
- public Login.Model.UserInfo SelectUser(Login.Model.UserInfo user1) //使用user1为参数连接数据库
- {
- string ConnString = @"Server=GE-PC;Database=Login;User=sa;Password=123456;"; //数据库连接字段
- using (SqlConnection conn = new SqlConnection (ConnString )) //连接数据库
- {
- SqlCommand cmd = conn.CreateCommand(); //
- cmd.CommandText = @"SELECT UserName, PassWord
- FROM USERS
- WHERE UserName=@UserName AND Password=@Password";
- cmd.CommandType = CommandType.Text; //
- cmd.Parameters.Add(new SqlParameter ("@UserName",user1.UserName)); //用户名
- cmd.Parameters.Add(new SqlParameter ("@Password",user1.Password)); //密码
- conn.Open();
- SqlDataReader reader = cmd.ExecuteReader(); //
- Login.Model.UserInfo user2 = new Login.Model.UserInfo(); //连接数据库获得数据放到user2
- while(reader.Read()) //
- {
- user2.UserName = reader.GetString(0).ToString().Trim(); //
- user2.Password = reader.GetString(1).ToString().Trim ();
- }
- return user2; //返回user2
- }
- }
- }
- }
namespace Login.DAO{ public class UserDAO //用户数据操作类 { public Login.Model.UserInfo SelectUser(Login.Model.UserInfo user1) //使用user1为参数连接数据库 { string ConnString = @"Server=GE-PC;Database=Login;User=sa;Password=123456;"; //数据库连接字段 using (SqlConnection conn = new SqlConnection (ConnString )) //连接数据库 { SqlCommand cmd = conn.CreateCommand(); // cmd.CommandText = @"SELECT UserName, PassWord FROM USERS WHERE UserName=@UserName AND Password=@Password"; cmd.CommandType = CommandType.Text; // cmd.Parameters.Add(new SqlParameter ("@UserName",user1.UserName)); //用户名 cmd.Parameters.Add(new SqlParameter ("@Password",user1.Password)); //密码 conn.Open(); SqlDataReader reader = cmd.ExecuteReader(); // Login.Model.UserInfo user2 = new Login.Model.UserInfo(); //连接数据库获得数据放到user2 while(reader.Read()) // { user2.UserName = reader.GetString(0).ToString().Trim(); // user2.Password = reader.GetString(1).ToString().Trim (); } return user2; //返回user2 } } }}D层代码主要功能是根据上层需要,连接数据库,操作数据库返回信息。这一层我们使用user2存放数据库信息并且把数据返回上一层,这里也没有任何的系统业务逻辑处理,只有对数据库操作。
最后看看B层是如何实现系统功能的:
- namespace Login.BLL
- {
- public class LoginManager
- {
- public UserInfo UserLogin(Login.Model.UserInfo user1)
- {
- Login.DAO.UserDAO uDao = new Login.DAO.UserDAO(); //实例化用户数据操作类
- Login.Model.UserInfo user3 = uDao.SelectUser(user1); //
- if (user3.UserName!=user1.UserName ||user3.Password!=user1.Password) //判断账号密码是否正确
- {
- return null; //信息不正确
- }
- else
- {
- return user3; //返回数据库内容
- }
- }
- }
- }
namespace Login.BLL{ public class LoginManager { public UserInfo UserLogin(Login.Model.UserInfo user1) { Login.DAO.UserDAO uDao = new Login.DAO.UserDAO(); //实例化用户数据操作类 Login.Model.UserInfo user3 = uDao.SelectUser(user1); // if (user3.UserName!=user1.UserName ||user3.Password!=user1.Password) //判断账号密码是否正确 { return null; //信息不正确 } else { return user3; //返回数据库内容 } } }}B层主要就是实现系统的逻辑功能,这里使用U层的user1来存放登录的用户名和密码,使用user3来存放数据库中的用户名和密码,然后判断是否相同,实现登录功能,最后把判断结构返回到U层来显示出来。
运行结果:
三层解决了数据显示和数据库的耦合问题,使软件的可维护性和灵活性增强。但是三层的使用,是系统更加复杂,对软件的有效性提出了考研。三层不是万能的,需要谨慎使用。
- 三层浅析及示例分析
- 三层浅析及示例分析
- EF浅析及示例分析
- EF浅析及示例分析2
- 三层交换原理及示例详解
- 三层交换原理及示例详解
- ThreadLocal示例及源码浅析
- 浅析ListenableFuture使用场景及介绍示例
- 浅析三层架构
- 浅析什么是三层架构
- 浅析三层架构
- 浅析三层架构
- 三层结构浅析
- 三层架构示例代码
- 浅析ajax请求json数据并用js解析(示例分析)
- linux子系统分析及触摸屏驱动浅析
- linux子系统分析及触摸屏驱动浅析
- 浅析可变参数列表及实例分析
- hdu 2037 今年暑假不AC
- FMDB with SQLCipher Tutorial
- sqlserver事务与回滚
- Handler和HandlerThread
- SRM448(500待填)
- 三层浅析及示例分析
- C++/CLR ref class 中 int 类型的几种区别
- 用C#编写写字板相关总结
- java web中servlet笔记
- 你的笔记本需要整理么
- Beginning Python Chapter 21
- ios图片处理
- 创建一个新闻信息的表需要的字段
- jdbc连接powerDesigner