三层敲完了,感觉只是大概的知道,对知识了解并不深入,还是有些混乱,停下来总结是理清思路最好的办法~
一、学习视频前我对三层的理解
很久以前就听大师父问过师父三层的问题,自己心里就觉得三层还应该很简单吧,如果把我们敲的机房收费系统分三层的话,那应该就是界面层是一层,代码层是一层,数据库是一层。
二、学习视频后我对三层的理解
学习视频后我就知道自己是华丽丽的错了,三层是把我们写得代码分了层,只不过是有一层的代码是专管界面的,有一层是专门控制逻辑思路的代码,还有一层只管与数据库连接的代码。那么它们到底是怎么分层?又该如何实现呢,下面详细介绍:
⒈What:三层按逻辑上划分:UI/BLL+DAL/DB 按物理划分:显示层/业务层/数据层 我们通常说的三层就是:显示层View/UI、业务逻辑层BLL(Business Logic Layer)、数据访问层DAL(Data Access Layer)三层之间的关系图如下:
对图的说明以及各个层的作用:
①数据访问层DAL(Data Access Layer)(其实就是对数据库进行的增、删、改、查的操作)
从数据源加载数据(Select)
向数据源写入数据(Insert / Update)
从数据源删除数据(Delete)
②显示层View/UI(主要的对界面上显示的显示的内容进行操作)
向用户展现特定业务数据
采集用户的输入信息和操作
③ 业务逻辑层BLL(Business Logic Layer)(各种函数方法,起连接作用)
从DAL中获取数据,以供UI显示用
从UI中获取指令和数据,执行业务逻辑
从UI中获取指令和数据,通过DAL写入数据员
⒉Why
使用三层的目的,主要是为了将控制不同层的代码隔离开,解耦。这样就可以增加软件的性能、安全性、可维护性和拓展性。
⒊How
各个层之间的引用关系:
UI -> BLL -> DAL
DAL所在程序集不引用BLL和UI
BLL需要引用DAL
UI直接引用BLL,可能会间接引用DAL
举个例子:(登录三层)
创建过程:VS新建窗体应用程序(新建UI层)—>在UI层工程中,点击文件—>添加新建项目,添加其他层,如用C#创建后的结果如下:
①LoginModel层(有时也会起名叫LoginEntity在下面就称为实体层),我感觉这一层就是将数据库中的内容,用代码的形式表示到我们的工程中,而且我们一定要注意的是,一定在这一层中的属性名一定要与表中的字段名一致。如图我们先建如下图:我们先新建数据库Login,然后在数据库中新建张表Users(字段为UserName、PWD):
那么我们在LoginModel层的代码一定要与之对应
namespace Login.Model
{
public class UserInfo
{
public string UserName { get; set; }
public string PWD { get; set; }
}
}
②UI层,引用BLL层和Model层,获取文本框中的用户名和密码,调用B层的方法,将B层中返回的参数的值赋值给实体层。
namespace LoginUI
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
//登录按钮点击事件
private void btnLogin_Click(object sender, EventArgs e)
{
string userName = txtUserName.Text.Trim();
string password = txtPassword.Text.Trim();
Login.BLL.LoginManage mgr = new Login.BLL.LoginManage();
Login .Model .UserInfo user = mgr.UserLogin(userName, password);
MessageBox.Show("登录用户"+user .UserName );
}
}
}
③BLL层,引用D层和Model层,调用D层的方法,将返回的参数值赋值给实体层
namespace Login.BLL
{
public class LoginManage
{
public Login .Model.UserInfo UserLogin(string UserName, string password)
{
//throw new NotImplementedException();
Login.DAL.UserDAL uDao = new Login.DAL.UserDAL();
Login.Model .UserInfo user=uDao.SelectUser(UserName, password);
if (user != null)//login succefully
{
Login.DAL.ScoreDAL sDao = new Login.DAL.ScoreDAL();
sDao.UpdateScore(UserName, 10);
return user;
}
else
{
throw new Exception("登录失败。");
}
}
}
}
④DAL层:引用实体层,主要是进行数据库的连接,将查询到的记录赋值给实体层。
namespace Login.DAL
{
public class UserDAL
{
public static string ConnecString = "Server=.;Database = Login;User ID=sa;Password =123";
public Login.Model.UserInfo SelectUser(string userName, string password)
{
//throw new NotImplementedException();
using (SqlConnection conn = new SqlConnection(ConnecString))
{
SqlCommand cmd = conn.CreateCommand();
cmd.CommandText = @"SELECT * FROM Users WHERE UserName=@userName AND PWD =@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.UserName = reader.GetString(1);
user.PWD = reader.GetString(1);//not suggestion
}
return user;
}
}
}
}
⒋我的体会:三层更有利于分工合作。就像一个饭店分为前台迎宾,传菜,和做菜的厨师。就像流水线一样,可以提高效率。U层和D层就像是两岸,而B层是座桥,将它们连接起来。我们加入自己思考和方法的是B层,一般U层和D层都是一些模式化的代码,但感觉连接数据库时好像总是更容易出错,可能是因为用得还不够多吧,对于其中有些代码的理解还不够成熟,还要多多理解,使对代码的运用更加纯熟。