上一篇文章我们知道了了解了什么是三层,它的工作流程,它的优势与劣势,这篇文章主要讲解三成的具体实现过程。
首先第一步要建立数据库,包含两个表:
(1)Users表
(2)Scores表
数据库建完之后,就是具体的代码实现阶段了。根据三层之间的引用原则(DAL所在程序集不引用BLL和UI,BLL需要引用DAL,UI直接引用BLL,可能会间接引用DAL),另外实体层供其它层引用,但是它不能引用其它层,所以我们首先着手实体层(LoginModel):
(1)实体(LoginModel):
它的作用是封装数据,使数据在三层中传输,更倾向于业务逻辑层。添加类:UserInfo
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; }
}
}
(2)数据访问层(LoginDAL):
它的作用是:Select、Insert/Update、Delete。添加类:DbUtil、UserDAO、ScoreDAO DbUtil类:
namespace Login.DAL
{
public class DbUtil
{
public static string ConnString = @"Server=(local);Database=Login;User ID=sa;Password=123456";
}
}
UserDAO类:
namespace Login.DAL
{
public class UserDAO
{
public Login.Model.UserInfo SelectUser(string userName, string passWord)
{
//建立数据库的连接
using (SqlConnection conn=new SqlConnection (DbUtil.ConnString ))
{
//执行SQL语句查询
SqlCommand cmd = conn.CreateCommand();
cmd.CommandText = @"SELECT ID,UserName,Password,Email FROM USERS WHERE [email protected] AND [email protected]";
//输出查询结果
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;
}
}
}
}
ScoreDAO的作用是每次登陆成功后,Score的数值都会增加10。具体代码不再粘贴。
(3)业务逻辑层(LoginBLL)
它从DAL中获取数据,提供给UI层显示;从UI层获取用户和指令,执行业务逻辑;从UI层获取用户和指令,通过DAL写入数据。添加类LoginManager。
namespace Login.BLL
{
public class LoginManager
{
public Login.Model.UserInfo UserLogin(string userName, string passWord)
{
//实例化DAL层
Login.DAL.UserDAO uDao = new Login.DAL.UserDAO();
Login.Model.UserInfo user = uDao.SelectUser(userName, passWord);
//不需要访问数据源,直接执行业务逻辑
if (user !=null )//login successfully
{
Login.DAL.ScoreDAO sDao = new Login.DAL.ScoreDAO();
sDao.UpdateScore(userName, 10);
return user;
}
else
{
throw new Exception("登录失败。");
}
}
}
}
(4)显示层(UI)
它的作用是向用户展现特定业务数据,采集用户的输入信息和操作。 原则:用户至上,兼顾简洁。添加类:frmLogin。
namespace LoginUI
{
public partial class FrmLogin : Form
{
public FrmLogin()
{
InitializeComponent();
}
private void btnLogin_Click(object sender, EventArgs e)
{
//显示层将用户输入的数据传给BLL层
string userName = txtUserName.Text.Trim();
string password = txtPassword.Text;
Login.BLL.LoginManager mgr = new Login.BLL.LoginManager();
Login.Model.UserInfo user = mgr.UserLogin(userName, password);
//显示层返回业务层传递的数据给用户
MessageBox.Show("登录用户:" + user.UserName);
}
}
}