发现我养成了一个非常不好的习惯,总结光拖着,这个习惯得改,所以现在就来总结总结。
在初识三层架构后,知道了为什么要用三层以及三层的优缺点等。具体就来谈谈如何来用,三层是如何来传的。先来个简单图来介绍:(前一个是手绘,第二个是vs自动生成的。)
具体的如何做的呢?
用代码来展示:
UI层
<span style="font-family:KaiTi_GB2312;font-size:24px;">using System.Threading.Tasks;
using System.Windows.Forms;
using LoginModel;
using Login.BLL;
namespace LoginUI
{
public partial class Login : Form
{
public Login()
{
InitializeComponent();
}
private void btnLogin_Click(object sender, EventArgs e)
{
string userName = txtUserName.Text.Trim();//将文本框的数据赋值给userName
string password = txtPassword.Text;//将文本框数据赋值给password
LoginManager mgr = new LoginManager(); //引用B层的方法
mgr.UserLogin(userName, password);
LoginModel.UserInfo user = mgr.UserLogin(userName, password);//
//用户输入的东西传给业务逻辑层,属于拿来主义。
MessageBox.Show("登录用户:" + user.UserName);
}
private void Login_Load(object sender, EventArgs e)
{
}
}
}</span>
userName和password是在U层通过实体层实例化B层的到对象mgr,然后通过调用mgr的Loginmanager方法传到B层的。
BLL层
<span style="font-family:KaiTi_GB2312;font-size:24px;">using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Login.BLL
{
public class LoginManager
{
public LoginModel.UserInfo UserLogin(string userName, string password)
{
Login.DAL.UserDAO uDao = new Login.DAL.UserDAO();//引用D层的UserDAO类
LoginModel.UserInfo user=uDao.SelectUser(userName, password);//引用实体层的SelectUser方法
if (user != null) //login successfully.
{
Login.DAL.ScoreDAO sDao = new Login.DAL.ScoreDAO();
sDao.UpdateScore(userName, 10); //分数增加10
return user;//实体返回U层
}
else
{
throw new Exception("登录失败");
}
}
}
}</span>
B层传递到D层数据是通过实体实例化D层的对象uDao,然后调用uDao的SelectUser来实现的
DAL层
DbUtil
<span style="font-family:KaiTi_GB2312;font-size:24px;">using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Login.DAL
{
//连接数据库字符串
class DbUtil
{
public static string ConnString = @"Server=DESKTOP-59O7O1G;Database=Login;User ID=sa;Password=1"; //server等于SQL SERVER的名字
}
}</span>
DAL
<span style="font-family:KaiTi_GB2312;font-size:24px;">using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;
using System.Data.SqlClient;
namespace Login.DAL
{
public class UserDAO
{
//查询用户
public LoginModel.UserInfo SelectUser(string userName, string password)
{
using (SqlConnection conn = new SqlConnection(DbUtil.ConnString))//数据库的链接;引用链接数据库的字符串.有了using,connection就可以自动关闭了。
{
SqlCommand cmd = conn.CreateCommand();//定义命令语句,创建并返回一个与SqlConnection关联的SqlCommand对象
cmd.CommandText = @"SELECT ID,UserName,Password,Email FROM USERS WHERE UserName=@UserName AND Password=@Password";
cmd.CommandType = CommandType.Text;//设置一个值来解释CommandText属性
cmd.Parameters .Add (new SqlParameter ("@UserName",userName));//将userName给参数
cmd.Parameters.Add(new SqlParameter ("@Password",password));
conn.Open();//打开数据库
SqlDataReader reader=cmd.ExecuteReader();
LoginModel .UserInfo user=null;
while (reader.Read())
{
if (user==null )
{
user=new LoginModel.UserInfo();
}
user.ID =reader .GetInt32 (0);
user.UserName = reader.GetString(1);//获取数据库中username相应的字段
user.Password = reader.GetString(2);// not suggestion
if(!reader .IsDBNull (3))
{
user.Email = reader.GetString(3);
}
}
return user;
}
}
}
}</span>
UserDAO的作用为根据从B层传过来的值执行相应的查询,并根据查询到的内容返回相应的查询结果。即:return userScoreDAO
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
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();//查询数据库受影响的行数
}
}
}
}
这个就是我随意给的一个要求:当登录成功时,给加分
Entity
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace LoginModel//封装数据,传输数据,独立于其他三个层次。不会引用其他的。其他三个层次级都会引用model
{
public class UserInfo
{
public int ID { get; set; }
public string UserName { get; set; }
public string Password { get; set; }
public string Email { get; set; }
}
}
生成的序列图:
小结
三层的逻辑很重要,思想也很重要。三层理清了,转七层的逻辑也就容易理解了。Ps:不是什么时候都适合使用三层