最近在学习三层结构,将所学的知识总结如下。
一:什么是三层结构;
所谓的三层开发就是将整个业务应用划分为表示层-业务逻辑层―数据访问层-数据库等,有的还要细一些,明确地将客户端的表示层、业务逻辑访问、和数据访问及数据库访问划分出来,十分有利于系统的开发,维护、部署和扩展。
二:为什么要使用三层结构,即使用三层结构的好处;
为什么要使用三层结构,它有那些优势?.net平台为我们提供强大的技术支持,通过code behind的强大支持,可以将页面设计和代码设计进行有效的分离,看起来非常清晰,也没有什么不好的。但是这种情况对于简单的应用来说,结构简单,代码清晰,这种一层结构开发就完全够了,没有必要使用分层结构。但是对于复杂的系统而言,如果不使用分层结构,将带来很大的麻烦。比如:在开发过程中会用到大量的重复或是相似的代码,导致代码冗长。一个很小的业务更改就有可能导致整个系统的大修,不利于修改。更为重要的是没有很好的利用面向对象的编程思想,是利用面向对象幌子走得确是面向过程的老路,不利于并行开发。
三:三层简介及其结构关系图
三层及作用:
1:显示层(UI):向用户展现特定业务数据,采集用户的输入信息和操作;
2:业务逻辑层(BLL):从DAL中获取数据,以供UI层显示,从UI层获取用户指令和数据,执行业务逻辑,从UI层中获取用户指令和数据,通过DAL写入数据库;
3:数据访问层(DAL):从数据源加载数据(select),向数据源写入数据(insert/update),从数据源中删除数据(delete);
四:小的实例
用单层结构和三层结构分别实现简单的登录。
单层结构:
using System;
using System.Data.SqlClient;
using System.Windows.Forms;
namespace Login
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void btn_submit_Click(object sender, EventArgs e)
{
string userName = txt_name.Text.ToString().Trim();
string password = txt_pwd.Text.Trim();
SqlConnection conn = new SqlConnection();
conn.ConnectionString = " Server=.;DataBase =DB_text;user Id=sa; Password=123456; ";
string selectstring = "select * from T_Login where UserName = '" + userName + "'";
SqlCommand cmd = new SqlCommand(selectstring, conn);
conn.Open();
SqlDataReader dr = cmd.ExecuteReader();
if (dr.Read())
{
if (dr[2].ToString().Trim() == password)
{
MessageBox.Show("登录成功!");
}
else
{
MessageBox.Show("密码错误!");
}
}
else
{
MessageBox.Show("用户名错误!");
}
dr.Close();
conn.Close();
}
}
}
三层结构:
UI层代码:
using System;
using System.Windows.Forms;
namespace LoginUI
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void btn_submit_Click(object sender, EventArgs e)
{
string userName = txt_name.Text.ToString().Trim();
string password = txt_pwd.Text.ToString().Trim();
LoginBLL.UserManager umg = new LoginBLL.UserManager();
UserModel.UserInfo user = umg.userLogin(userName,password);
if (user != null) //不知道这段代码写在这里是否合适???
{
if(user.password == password)
MessageBox.Show("登录成功!");
else
MessageBox.Show("密码错误!");
}
else
MessageBox.Show("用户名错误!");
}
}
}
BLL层代码:
namespace LoginBLL
{
public class UserManager
{
public UserModel.UserInfo userLogin(string userName, string password)
{
LoginDAL.UserDAO uDAO = new LoginDAL.UserDAO();
UserModel.UserInfo user = uDAO.checkUser(userName,password);
return user;//这里是将user直接返回给UI层,是不是可以在这里做个判断?
}
}
}
DAL层代码:
1:负责与数据库连接的连接字符串
namespace LoginDAL
{
public class DBUtil
{
public static string connString = "Server=.;DataBase =DB_text;user Id=sa; Password=123456;";
}
}
对数据库的操作:
using System.Data.SqlClient;
namespace LoginDAL
{
public class UserDAO
{
public UserModel.UserInfo checkUser(string userName, string password)
{
UserModel.UserInfo user = null;
SqlConnection conn = new SqlConnection();
conn.ConnectionString = DBUtil.connString;
string selectstring = "select * from T_Login where UserName = '"+userName+"'";
SqlCommand cmd = new SqlCommand(selectstring, conn);
conn.Open();
SqlDataReader dr = cmd.ExecuteReader();
if (dr.Read())
{
if(user==null)
user=new UserModel.UserInfo();
user.name = dr.GetString(1);
user.password = dr.GetString(2);
}
dr.Close();
conn.Close();
return user;
}
}
}
负责联系三层的数据模型:
namespace UserModel
{
public class UserInfo
{
public string name { get; set; }
public string password { get; set; }
}
}