What:
UI层(显示层) |
---|
简单理解为直接和用户进行交互的层次,但并不代表它只有一个界面,它对用户的体验有着很重要的作用 |
特点:
- 简易
- 一致性:风格结构清晰一致
- 色彩的舒适度
- 文字主次分明
- 易用性:易上手傻瓜式操作
BLL(业务逻辑层) |
---|
对UI层传入的内容进行逻辑处理后传递给下一层,再由下一层返回值后再进行逻辑处理呈现给用户需要的内容 |
作用:
1. 系统架构的核心价值部分
2. 集中在制定业务规则的
3. 实现业务流程
4. 系统设计业务需求
5. 在UI和DAL层中起承上启下的作用
DAL(数据访问层) |
---|
对BLL层进行逻辑处理后传递给DAL层,DAL层只负责查找所需要的信息,不对信息进行操作,对于查到的信息返回给BLL层后再进行操作 |
用一个形象的图表示三层之间的关系:
服务员=UI;厨师=BLL;采购员=DAL
具体实现对比下图:
Why:
三层 |
---|
是在客户端和数据库之间的一种逻辑结构,是一种架构设计理念。界面-逻辑-数据 |
特点:
- 无需开发客户端软件,维护和升级方便
- 可跨平台操作
- 有良好的开放性和可扩充性
- 便于数据库移植
- 安全性好
- 资源重要性好
- 缺点:在UI层修改的时候可能会涉及到BLL和DBL层的修改。
How:
对比:之前用VB在弄机房登录界面的时候应用代码如下:
删减了部分内容,只留下了查询数据库验证后登录,同时在另一个登录记录表上添加登录信息。
前一部分:声明变量部分
中间部分:查询信息是否和数据库中相符验证,相符则在登录记录表上添加记录。
最后部分:如果都验证没有问题也记录在登录表上了,那么进入主界面。
Private Sub cmdOk_Click()
Dim txtSQL As String '用来存放SQL语句
Dim mrc2 As adodb.Recordset
Dim mrc As adodb.Recordset '用来存放记录集对象
Dim mrc1 As adodb.Recordset
Dim msgtext As String '用来存放返回信息
'查询指定用户的记录
txtSQL = "select * from User_Info where UserID = '" & txtUserName.Text & " ' "
'执行查询语句
Set mrc = ExecuteSQL(txtSQL, msgtext)
'判断输入密码是否正确
If Trim(mrc.Fields(1)) = Trim(txtPassword.Text) Then
OK = True
'登录的同时,要在Onworklog表上有正在登录的记录
txtSQL1 = "select * from OnWork_info "
Set mrc1 = ExecuteSQL(txtSQL1, msgtext1)
ComptName = VBA.Environ("computername")
mrc1.AddNew
mrc1.Fields(0) = Trim(txtUserName)
mrc1.Fields(1) =Trim(mrc.Fields(2))
mrc1.Fields(2) = Date
mrc1.Fields(3) = Time
mrc1.Fields(4) = Trim(ComptName)
mrc1.Update
mrc1.Close
'登录的同时,要在Worklog表上有登录的部分信息
txtsql2 = "select * from Worklog_info "
Set mrc2 = ExecuteSQL(txtsql2, msgtext2)
'让电脑名称存在computername里
ComptName = VBA.Environ("computername")
mrc2.AddNew
mrc2.Fields(1) = Trim(txtUserName)
mrc2.Fields(2) = Trim(mrc.Fields(2))
mrc2.Fields(3) = Date
mrc2.Fields(4) = Time
mrc2.Fields(7) = Trim(ComptName)
mrc2.Fields(8) = "True"
mrc2.Update
mrc2.Close
mrc.Close
Me.Hide
'登录窗体隐藏,主窗体显示之前进行赋值
UserName = Trim(txtUserName.Text)
frmMain.Show
End If
Exit Sub
End Sub
在三成中的登录窗体:
UI层:UI层引用BLL层。声明字符串、实例化BLL层下的LoginServerice类、相当于给最后用户信息验证的值找一个传递的载体通路,为了让传的值最后可以回到UI层。
private void btnLogin_Click_1(object sender, EventArgs e)
{
string userName = TextUserName.Text.Trim();
string password = txtPassword.Text;
Login.BLL.LoginServerice mgr = new Login.BLL.LoginServerice();
Login.Model .UserInfo user=mgr.UserLogin(userName, password);
MessageBox.Show("登录用户:" + user.UserName);
}
BLL层:BLL层引用DAL层。user参数从UI层传到BLL层,通过对DAL层中的UserDAO的实例化把值传递到DAL层进行查收,查询到的结果返回到BLL层、然后进行判断。如果User不等于空那么就在积分表上给这个用户+10分的积分
public class LoginServerice
{
public Login.Model.UserInfo UserLogin(string userName, string password)
{
//throw new NotImplementedException();
Login.DAL.UserDAO uDao = new Login.DAL.UserDAO();
Login.Model .UserInfo user = uDao.SelectUser(userName, password);
if (user!=null )
{
Login.DAL.ScoreDAO sDao = new Login.DAL.ScoreDAO();
sDao.UpdateScore(userName,10);
return user;
}
else
{
throw new Exception("登录失败");
}
}
DAL层:没有引用其他层次。数据访问层主要是进行与数据库的连接UserDAO和ScoreDAO是相似的内容。
public class UserDAO
{
public Login.Model .UserInfo SelectUser(string userName, string password )
{
//string ConnString = @"Server= ;DataBase=Login;User ID= sa;Password=123456";
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;
}
}
}
区别于VB登录窗体,除了没有分层此外,在VB中传递的UserName和Password是String类型而且每一个都声明了一个变量用来传值。在C#中我们刚刚说了在整个查询核对的过程中传的是Users,被称为是数据模型。数据模型它可以传递多个值,可以上传下达。
所以额外建立一个程序集Model创建一个类UserInfo:专门存放这个数据模型
public class UserInfo
{
public int ID { get; set; }
public string UserName { get; set; }
public string Password { get; set; }
public string Email { get; set; }
}
小结:
通过这样把每一个部分的职责都规范化,减少了不必要的耦合,在修改和维护上都方便了很多。