前面在学习UML图的时候了解了一下三层的思想,这次再学习感觉熟悉了很多,从实例中更深刻的了解了三层。
【知识点】
一、概念
简单的理解三层架构分为:显示层(UI)、业务逻辑层(BLL)、数据访问层(DAL),再加上实体层(Entity)。
1、显示层(UI):通俗讲就是展现给用户的界面,即用户在使用一个系统的时候他的所见所得,这里我就先简单的理解为主要就是软件的窗体界面类。
-UI作用:向用户展示现特定业务数据;采集用户的输入信息和操作
-UI设计原则:用户至上,兼顾简洁
2、业务逻辑层(BLL):针对具体问题的操作,也可以说是对数据层的操作,对数据业务逻辑处理。B层是联系U层和D层的桥梁,进行他们之间的数据交互。
-作用:从DAL中获得数据,以供UI显示用;
从UI中获得用户指令和数据,执行业务逻辑;
从UI中获得用户指令和数据,通过DAL写入数据源。
3、数据访问层(DAL):该层所做事务直接操作数据库,针对数据的增添、删除、修改、查找等。接受B层的命令,对数据进行处理。
-作用:从数据源加载数据(Select);
向数据源写入数据(Insert/Update);
从数据源删除数据(Delete)。
4、实体层(Entity):贯穿于三层,连接三层。
二、应用原则
1、DAL只提供基本的数据访问,不包含任何业务相关的逻辑处理
2、UI只负责显示和采集用户操作,不包含任何业务相关的逻辑处理
3、BLL负责处理业务逻辑。通过获取UI传来的操作指令,决定执行业务逻辑,在需要访问数据源的时候直接交给DAL处理。处理完成后,返回必要数据给UI.
三、各层之间引用关系
1、DAL所在程序集不引用BLL和UI
2、BLL引用DAL
3、UI直接引用BLL,通过BLL间接引用DAL
4、各层可以引用实体层,忌讳互相引用
如图:
四、实例
B层代码:
<span style="font-size:18px;">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.DAL.ScoreDAO sDao = new Login.DAL.ScoreDAO();
sDao.UpdateScore(userName, 10);
return user;
}
else //登录失败
{
throw new Exception("登录失败!");
}
}
}
}</span>
D层代码:
<span style="font-size:18px;">namespace Login.DAL
{
class DbUtil //建立数据库连接
{
public static string ConnString = @"server=192.168.24.182;DataBase=Login;User ID=sa;Password=123456";
}
}</span>
<span style="font-size:18px;">namespace Login.DAL
{
public class UserDAO
{
public Login.Model.UserInfo SelectUser(string userName,string password)
// //各层都要用到实体类userInfo 通过实体类连接
{
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;
}
}
}
}</span>
<span style="font-size:18px;">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();
}
}
}
}
</span>
U层代码:
<span style="font-size:18px;">namespace LoginUI
{
public partial class frmLogin : Form
{
public frmLogin()
{
InitializeComponent();
}
private void btnLogin_Click(object sender, EventArgs e)
{
//UI层将用户输入数据传递给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);
//UI层返回BLL层传递的数据给用户
MessageBox.Show("登录用户:" + user.UserName);
}
}
}
</span>
U层界面:
实体层代码:
<span style="font-size:18px;">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; }
}
}</span>
运行结果:
【小结】
开始了解三层好多不是很懂的地方,通过例子的实现感觉理解了一些,理解了各层的作用和各层之间的引用关系,接下来继续深入了解。