【三层架构】——C#代码分析
2016-01-27 10:26
671 查看
前言
上篇博客我们讲到三层架构的基本理论知识,这篇我们来说一下三层之间信息是如何传递的以及如何表现在代码里。
调用关系
图1
图2
分析:根据图1我们可以看到BLL引用DAL和Model,DAL引用Model,UI引用BLL和Model,所以也就可以转换成图2所示的UI引用BLL,BLL引用DAL,它们三者都引用Model。
代码分析
时序图如下:
U层代码
U层调用B层:在U层中初始化B层,然后将参数传递给实体类中的user。namespace LoginUI { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void btnLogin_Click(object sender, EventArgs e) { //将UI层文本框获得的数据传给实体类中参数 string userName = txtUserName.Text.Trim(); string password = txtPassword.Text.Trim(); //初始化BLL层中LoginManager类 Login.BLL.LoginManager mgr = new Login.BLL.LoginManager(); //将userName和password传到B层,B层返回user到U层 Login.Model.UserInfo user=mgr.UserLogin (userName ,password ); MessageBox.Show("登录用户:"+user .UserName ); } } }
B层代码
B层调用D层:在B层中初始化d层,然后将参数传递给实体类中的user。namespace Login.BLL { public class LoginManager { public Login.Model.UserInfo UserLogin(string userName, string password) { //初始化D层中的UserDAO类 Login.DAL.UserDAO uDao=new Login.DAL.UserDAO (); //userName和password传到D层,D层返回user到B层 Login.Model .UserInfo user=uDao.SelectUser(userName,password ); //判断user是否为空 if (user!=null) { Login.DAL.ScoreDAO sDao = new Login.DAL.ScoreDAO();//初始化D层中的ScoreDAO类 sDao .UpdateScore (userName,10);//将userName、10更新到数据库中 return user; } else { throw new Exception("登录失败"+user.UserName );//抛出异常 } } } }
D层代码
打开数据库服务器namespace Login.DAL { class DbUtil { public static string ConnString = @"Server=HOME-LOVE\MSSQLSERVER1;Database=Login;User ID=sa;Password=1"; } }
B层所调用D层的内容,D层连接数据库
namespace Login.DAL { 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; } } } }
B层所调用D层的内容(增加积分),D层连接数据库
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(); } } } }
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; } } }
实体类解析:
在登录窗体中我们可以看到实体类作为一个载体去传递信息,它在三层之间是可以互相传递进入的。打个比方我们要把文件交到省里,首先需要交给学校,然后是市里,最后是省里,期间这个文件是不同的,它是我们沟通的一个桥梁,也就是实体类。
相关文章推荐
- 有用的学习网站链接
- 牛逼的密码破解网站
- 如何在局域网内分享你的网站
- 判断是否是手机访问网站
- 网站开发进阶(三十)HTML5--本地存储Web Storage
- 网站开发进阶(三十)HTML5--本地存储Web Storage
- IMCART解析外贸网站如何进行SEO优化
- 跨境电商外贸建站决定商城运营的四个关键因素
- vSAN 6.0设计与规模设定——混合架构与全闪存架构对比
- Controller+Service+DAO初试水
- Corosync+Pacemaker+DRBD+NFS高可用实例配置
- 网站管理之IIS怎样设置能实现同服务器上有多个不同域名的网站
- 大型网站架构系列:消息队列(二) (转)
- 大型网站架构系列:分布式消息队列(一) (转)
- web的负载均衡 集群高可用(HA)解决方案
- 阿里无线11.11 | 手机淘宝移动端接入网关基础架构演进之路
- Linux电源管理(2)_Generic PM之基本概念和软件架构
- Linux ALSA 声卡驱动之一:ALSA架构简介
- 逆向推演:交互设计说明文档+信息架构
- 应用服务器集群的Session管理