《前言》
还没有开始学习三层的时候,就总是听他们说三层啊、七层的,当时特别好奇,是不是就像汉堡王一样,一层一层的夹起来?那三层究竟是什么东西呢?怎么样才叫做三层?三层用来做什么?带着问题开始了初步的三层学习。
《三层架构》
简单解释一下,代码中所有的三层项目都会在一个解决方案中,应用的关系是表示层依赖业务逻辑层,业务逻辑层依赖的数据访问层,从这里也体现出了低耦合,客户端不会直接和数据库进行交互,而是COM/DCOM通讯与数据库进行交互。
《搭建三层步骤》
(1)、搭建表达层(window)
(2)、搭建业务逻辑层(类)
(3)、搭建数据访问层(类)
(4)、实现各层之间的相互依赖
从步骤上来讲都很好理解,但是我们都知道数据在各层之间表达需要定义,那么我们知道ADO.NET中有DataSet组件帮我们做这个工作,它是从数据源中检索到的数据在内存中的缓存,应用它会使数据结构暴露在业务逻辑层和表达层中,因此,我们引入了实体,三层的demo:
通过王继斌老师讲的三层登录的Demo的就很好理解了,其中做了一个LoginUI的客户端,做了一个LoginBLL和一个LoginDAL,特殊的是还有一个LoginModel类,而这就是实体类,它可以与UI、BLL、DAL进行双向的传输。
下面是登录的三层例子:
UI:
namespace LoginUI
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void btnLogin_Click(object sender, EventArgs e)
{
string userName = txtName.Text.Trim(); //给实体层传值
string password = txtPassword.Text;
Login.BLL.loginService mgr = new Login.BLL.loginService(); //实例化业务层
Login.Model .UserInfo user=mgr.UserLogin (userName, password); //实体层传来的值
MessageBox.Show("登陆用户:" + user.UserName);
}
}
}
BLL:
namespace Login.BLL
{
public class loginService
{
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.UpdataScore(userName, 10);
return user;
}
else
{
throw new Exception("登陆失败!"); //抛出错误
}
}
}
}
DAL:
连接数据库字段:
namespace Login.DAL
{
class DbUtil
{
public static string ConnString = @"Server=mx; Database=Login; User ID=sa; Password=123456";//连接数据库的字段
}
}
User表:
namespace Login.DAL
{
public class UserDAO
{
public Login.Model.UserInfo SelectUser(string userName, string password)
{
using (SqlConnection conn = new SqlConnection(DbUtil.ConnString)) //用了using关键字,可以不用关闭连接
{
SqlCommand cmd = conn.CreateCommand();
cmd.CommandText = @"SELECT ID,UserName,Password,Email FROM [dbo].[User] 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; //声明一个变量user,初始值为null,不指向任何内存空间
while (reader.Read())
{
if (user == null) //判断user是否为空
{
user = new Login.Model.UserInfo();
}
user.ID = reader.GetInt32(0); //获取ID列的32为整数值 ,赋值
user.UserName = reader.GetString(1);
user.Password = reader.GetString(2);
if (!reader.IsDBNull(3))
{
user.Email = reader.GetString(3);
}
}
return user;
}
}
}
}
score表:
namespace Login.DAL
{
public class ScoreDAO
{
public void UpdataScore(string userName,int value)
{
using (SqlConnection conn = new SqlConnection(DbUtil.ConnString)) //连接数据库 {
SqlCommand cmd =conn.CreateCommand(); //command类
cmd.CommandText = @"INSERT INTO Score(UserName,Score) Values(@UserName,@Scores)"; //插入列
cmd.Parameters.Add(new SqlParameter("@UserName", userName)); //增加属性
cmd.Parameters.Add(new SqlParameter("@Scores", value));
conn.Open();
cmd.ExecuteNonQuery(); //查询 }
}
}
}
Model:
namespace Login.Model
{
public class UserInfo //定义了4个属性
{
public int ID{get;set;}
public string UserName { get; set; }
public string Password { get; set; }
public string Email { get; set; }
}
}