上一篇博客介绍了一下三层的理论,本篇博客则是从一个简单的登录验证系统来对三层架构思想做了一个更深一步的诠释。
首先就是登录系统的流程图:从用户输入数据开始,U层将数据传到B层由B层进行逻辑判断,B层将数据传到D层交由D层进行验证,D层与数据库进行连接验证,之后将验证信息返回到B层由B层进行逻辑判断,B层接受到D层返回的验证结果进行判断,最后将判断的结果返回到U层中由U层显示最终的登录结果。
当然为了使得层传值顺利,这里还要额外的建立一个model层,方便各层随时调用数据。
其次就是各层的调用关系
层 | 调用 |
---|---|
UI层 | Model、BLL |
BLL层 | Model、DLL |
DLL层 | Model |
最后就是代码实现部分:
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; }
}
}
UI层
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();//实例化B层
Login .Model .UserInfo user= mgr.UserLogin(userName, password);//将用户名和密码传到B层
MessageBox.Show("登录用户:"+user.UserName );//登录成功
}
}
}
BLL层
namespace Login.BLL
{
public class LoginManager
{
public Login.Model .UserInfo UserLogin(string userName, string password)
{
Login.DAL.UserDAO uDao = new Login.DAL.UserDAO();//实例化D层的用户类
Login.Model.UserInfo user= uDao.SelectUser(userName, password);//将模块的值传入到D层用户类中
if (user !=null)//用户登录成功
{
Login.DAL.ScoreDAO sDao = new DAL.ScoreDAO();//调用D层的积分类
sDao.UpdateScore(userName, 10);//积分表更新
return user;
}
else
{
throw new Exception("登录失败:");
}
}
}
}
D层
user类
using System.Data;
using System.Data.SqlClient;
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并制定执行语句与执行连接
cmd.CommandText = @"SELECT ID,UserName,Password,Email
FROM USERS WHERE UserName=@UserName AND Password=@Password";//SQL 语句
cmd.CommandType = CommandType.Text;
cmd.Parameters.Add(new SqlParameter ("@UserName",userName ));//外界参数被正确转换,防止SQL注入
cmd.Parameters.Add(new SqlParameter ("@Password",password ));
conn.Open();
SqlDataReader reader = cmd.ExecuteReader();//执行查询命令并赋值给reader
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);//not suggestion
if (!reader.IsDBNull (3))//判断邮箱是否为空
{
user.Email = reader.GetString(3);
}
}
return user;
}
}
}
}
Score类
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并制定执行语句与执行连接
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();
}
}
}
}
数据库连接
namespace Login.DAL
{
class DbUtil//建立数据库连接:server=机器名;database=登录名;userID=数据库登录名;password=数据库登录密码
{
public static string ConnString = @"Server=DESKTOP-INKCLID;Database=Login;User ID=sa;Password=123456;";
}
}
总结:
以上就是对于三层架构的初步实践,通过简单登录系统可以清晰的看出数据的流向,以及各层的功能,同时通过三层可以让业务与逻辑相分离,减少各个类之间的耦合,从而达到软件的高可用,高复用,高维护。