前言:
三层结构是基于模块化程序设计的思想,为实现分解应用程序的需求,而逐渐形成的一种标准模式的模块划分方法。三层架构的优点在于不必为了业务逻辑上的微小变化而迁至整个程序的修改,只需要修改商 业逻辑层中的一个函数或一个过程;增强了代码的可重用性;便于不同层次的开发人员之间的合作,只要遵循一定的接口标准就可以进行并行开发了,最终只要将各个部分拼接到一起构成最终的应用程序。
What?
什么是三层?
UI(显示层)、BLL(业务逻辑层)、DAL(数据访问层)
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiMyMDMxcDMxIDMxITM3EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
(两层结构)
(三层结构)
各层之间的引用关系:UI -> BLL -> DAL
关系图
1.DAL只提供基本的数据访问,不包含任何业务相关的逻辑处理;
2.UI只负责显示和采集用户操作,不包含任何的业务相关的逻辑处理;
3.BLL负责处理业务逻辑,通过获取UI传来的操作指令,决定执行业务逻辑,在需要访问数据源的时候直接交给DAL处理。处理完成后,返回必要数据给UI。
How?
1.连接数据库并建表
2.建立四个项目,在U层绘制登录界面
UI层
namespace LoginUI
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void btnLogin_Click(object sender, EventArgs e)
{
try
{
string userName = txtUserName.Text.Trim();
string password = txtPassword.Text;
//取出用户界面的数据
LoginBLL.LoginManager mgr = new LoginBLL.LoginManager();
//需要调用BLL层,实例化一个对象
Login.Model.UserInfo user = mgr.Login(userName, password);
//调用BLL层的方法,将用户输入的信息作为参数传入该方法
MessageBox.Show("登录用户:" + user.UserName);
//如果登陆成功则显示登录用户名
}
catch (Exception ex)
//如有登录异常,则提示登录失败,这里的catch对应B层中的Try
{
MessageBox.Show(ex.Message );
}
}
}
}
DAL层
namespace Login.DAL
{
class DbUtil
{
public static string ConnString = @"Server =BRYANT; Database =Login; User ID = sa;Password =123";
//创建数据库连接字符串
}
}
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.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();//打开数据库连接。添加后解决Conn关闭异常
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;
}
}
}
}
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));
//Scores表的主键设置错误,导致不能重复登录,修改数据库中表的主键则解决该问题。
conn.Open();//打开数据库连接,解决conn关闭异常
cmd.ExecuteNonQuery();
}
}
}
}
BLL层
namespace LoginBLL
{
public class LoginManager
{
public UserInfo Login(string userName, string password)
{
//throw new NotFiniteNumberException();
Login.DAL.UserDAO uDao = new Login.DAL.UserDAO();
//Login之前一直报检测到无法使用代码,原因是上一句未注释。
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("登录失败!");
//一个throw 对应一个Catch,并且弹出的显示在U层中显示出来
}
}
}
}
实体层
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; }
//实体类,用于保存用户信息
}
}
成功啦!
问题调试博客:
http://blog.csdn.net/l_mloveforever/article/details/78821870
小结:
在软件体系架构设计中,分层式结构是最常见,也是最重要的一种结构。所以,分层式设计可以达至如下目的:分散关注、松散耦合、逻辑复用、标准定义。一个好的分层式结构,可以使得开发人员的分工更加明确。一旦定义好各层次之间的接口,负责不同逻辑设计的开发人员就可以分散关注,齐头并进。虽然三层架构仍有不可避免的缺陷,但是软件分层结构使得代码维护非常方便,设计明确,各层独立,专注自己擅长的领域。通过这次学习,对软件体系结构又有了更深入的了解,为后面的机房重构打下基础。