目录
前言
概念:
表现层(UI):
业务逻辑层(BLL)
数据访问层(DAL):
实体类库(Model):
代码展示:
表现层(UI):
业务逻辑层(BLL):
数据访问层(DAL):
实体类库(Model):
以上内容是小编对三层架构的了解,代码注释为小编个人理解,如有问题欢迎在下方评论!
前言
三层架构就是为了符合“高内聚,低耦合”的思想,把整个业务应用划分为三层结构,即表现层(UI),业务逻辑层(BLL),数据访问层(DAL),还有实体类库(Model),但是具体代码如何实现,到底哪些代码应该写在哪一层,却是模模糊糊的,今天小编就分享一下自己的感受,希望能对你有所帮助。首先我们了解一下各层的概念与职责:
概念:
表现层(UI):
表现层又称为表示层,位于三层架构的最上层,与用户直接接触,主要功能是实现系统数据的传入和传出,将数据直接传送到BLL层中进行数据处理,处理后会将处理结果反馈到表示层中。简单的说,表示层就是实现用户界面功能,将用户的需求传达和反馈。
业务逻辑层(BLL)
业务逻辑层BLL是软件系统的核心,位于表示层与数据访问层之间,是表现层与数据访问层的桥梁,主要功能是对具体问题进行逻辑判断与执行操作,接收到表现层UI的用户指令后,执行业务逻辑,通过数据访问层DAL写入数据源,从DAL中获取数据,以供UI显示使用。
数据访问层(DAL):
数据访问层是对数据的操作,但不是数据库,因为DAL层的数据BLL层传入的,然后将传入的数据写入数据库,具体是为表示层和业务逻辑层服务的。
实体类库(Model):
实体类库是数据库的映射对象,在信息系统软件实际开发的过程,要建立对象的实例,将关系数据库表采用对象实体化的方式表现出来,辅助软件开发中对各个系统功能的控制与操作执行,并利用Get与Set把数据库表中的所有字段映射为系统对象,建立实体类库,进而实现各个结构层的参数传输。
代码展示:
下面以一个登陆的小例子为例,展示一下三层是如何使用的,当用用户登陆成功时,会为该用户增加10积分。
表现层(UI):
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();//初始化组件,加载窗体
}
private void btnLogin_Click(object sender, EventArgs e)
{
string userName = txtUserName.Text.Trim();//获取输入的userName
string password = txtPassword.Text;//获取输入的password
Login.BLL.LoginManager mgr = new Login.BLL.LoginManager();//调用B层的登录方法,从B层返回user的信息
Login .Model.UserInfo user = mgr.UserLogin(userName, password);//通过Model层,使用UserName、passwor
MessageBox.Show("登录用户:" + user.UserName);//提示用户成功
}
}
业务逻辑层(BLL):
public class LoginManager
{
public Login.Model.UserInfo UserLogin(string userName, string password)//执行Login操作,UI传来的指令UserLogin和传来的数据username、password,返回UserInfo
{
#region 判断登录的逻辑
// throw new NotImplementedException();//访问数据源
Login.DAL.UserDAO uDao = new Login.DAL.UserDAO();//呼叫DAL,实例化UserDAO,获取信息
Login.Model.UserInfo user = uDao.SelectUser(userName, password);//调用UserDAO的查询方法,传两个值,返回UserInfo
if (user != null)//判断User是否登录成功
{
Login.DAL.ScoreDAO sDao = new Login.DAL.ScoreDAO();//成功,调用ScoreDAO的方法增加积分
sDao.UpdateScore(userName, 10);//更新积分,给用户加10分
return user;//返回user
}
else
{
throw new Exception("登录失败");//失败,抛出异常
}
#endregion
}
}
数据访问层(DAL):
public class UserDAO//数据访问层,访问User表
{
public Login.Model.UserInfo SelectUser(string userName, string password)//判断用户是否存在的方法
{
using (SqlConnection conn = new SqlConnection(DbUtil.ConnString))//获取SqlConnection,通过DBUtil得到Connstring,Using使Connection自动关闭
{
SqlCommand cmd = conn.CreateCommand();//创建Command
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));//因为上面使用了参数,所以增加两个参数
cmd.Parameters.Add(new SqlParameter("@Password", password));
conn.Open();//打开链接,Using使Connection自动关闭链接
SqlDataReader reader = cmd.ExecuteReader();
Login.Model.UserInfo user = null;//构造User
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))//Email可以为空,判断Email是不是为空
{
user.Email = reader.GetString(3);
}
}
return user;//返回User
}
}
}
/// <summary>
/// 积分类
/// </summary>
public class ScoreDAO //DAO数据访问对象,访问Score表
{
public void UpdateScore(string userName, int value)//判断增加积分的方法
{
using (SqlConnection conn = new SqlConnection(DbUtil.ConnString))//通过Dbutil传字符串
{
SqlCommand cmd = conn.CreateCommand();//创建cmd
cmd.CommandText = @"INSERT INTO Scores(UserName, Score) values(@UserName,@Score)";//向Score表中插入积分
//cmd.Parameters.Add(new SqlParameter("@ID",value));
cmd.Parameters.Add(new SqlParameter("@UserName", userName));//构造两个参数
cmd.Parameters.Add(new SqlParameter("@Score", value));
conn.Open();//打开链接,Using自动关闭链接
cmd.ExecuteNonQuery();//向数据库中插入数据
}
}
}
实体类库(Model):
/// <summary>
/// 数据类库,封装数据,在三层之间传输数据
/// 不引用任何一个层次的程序集,独立于三层之外
/// 任何一层都要引用Model
/// </summary>
public class UserInfo//数据模型类UserInfo
{
public int ID { get; set; }
public string UserName { get; set; }
public string Password { get; set; }
public string Email { get; set; }
}