前言
其实这篇文章早就应该写了,可是我刚刚看完三层视频后,对于它的了解好像真的不是那么深刻,就一拖再拖,直到现在在画机房重构UML图七层的时候,我才知道原来三层并没有自己想象中的那么难,也不是自己想象中已经完成了高内聚,低耦合;感觉一直学习,就越会发现原来学习的东西很浅显,很容易懂,所以在面对一个新的东西,我们不是害怕,而是一直学习,前进,过一段时间回来看看,发现突然就顿悟了!
内容
一:什么是三层?
三层结构的划分方式:物理/逻辑;物理上的三层:显示层/业务层/数据层;客户Pc;应用服务器;数据库服务器;逻辑层/UL/BLL/DAL/DB;主要的三层结构为逻辑三层:UI,BLL,DAL,有时候会加上DB。
二:每一层的功能是什么?
UI层是呈现给用户的界面,它就是一个外交官,主要是和用户打交道,在这个过程当中用户只认识,而且也只能看见这个外交官;而BLL层就是处理逻辑关系的,就是外交官的智囊团,处理一系列的关系数据,抛给外交官最后的决议;DAL就是数据层,相当与谈判时准备的各种资料。他们各司其职,互相联系,但是又互不干扰,其实这句话在程序设计上的意思就是高内聚,低耦合。
三:为什么使用三层架构?
业务复杂一定程度,数据访问和业务访问层分开,UI与业务访问分开。用一个包图表示他们关系:
其实在验收的时候我师父问道我一个问题就是实体层在三层当中到底充当了什么样的角色,为什么三层每一个层都会调用他呢?那时候我真的没有想过,后来了解到一切都是为了高内聚,低耦合做准备,为了让数据库增加或是删减字段不会影响到其他层!
四:处理的原则
DAL:提供基本的数据访问,不包含任何业务相关的逻辑处理。
UI:负责显示和采集用户操作。不包含相关的业务处理。只是将数据传给了业务逻辑层。
BLL:负责相关的业务逻辑。通过获取UI传来的操作指令,决定执行业务逻辑,在需要访问数据源的时候直接交给DAL处理。处理完成后,返回必要的数据给UI.
五.代码的编译:
程序未行,文档驱动,这是做架构师的精髓,所以在开始一个程序少不了的就是时序图了(当然也是聆听了米老师的课的时候加上去的)。
代码编写如下:
Entity层:
public class userInfo //只被引用。
{
public int ID { get; set; }
public string UserName { get; set; }
public string Password { get; set; }
public string Email { get; set; }
}
DAL层如下:
public class userDAO
{
public Login.model.userInfo selectUser(string userName, string Password)
{
using (SqlConnection conn = new SqlConnection(Dbuti.ConnString))
{
conn.Open();
SqlCommand cmd = conn.CreateCommand();
cmd.CommandText = @"SELECT ID, UserName, Password, Email FROM USERS WHERE [email protected] AND [email protected] ";
cmd.CommandType =CommandType.Text;
cmd.Parameters.Add(new SqlParameter("@UserName", userName));//传参数username
cmd.Parameters.Add(new SqlParameter("@Password", Password));
SqlDataReader reader = cmd.ExecuteReader();
Login.model.userInfo user= null;
while (reader.Read())
{
reader.GetInt32(0);
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;
}
}
}
BLL层:
public class loginManager
{
public Login.model.userInfo userlogin(string userName, string Password, ref string message)
{
DAL.userDAO uDao = new DAL.userDAO(); //呼叫数据源。
Login.model.userInfo user = uDao.selectUser(userName, Password); //处理的情况返还给user
if (user != null) //判断user值,做出相应处理,如果user为null值,那么说明用户名或密码错误;
{
DAL.ScortDAO sdo = new DAL.ScortDAO();
sdo.UpdateScore(userName, 10);
message = "登陆成功了用户";
}
else
{
message = "用户名或密码有误";
}
return user;
}
}
UI层:
private void btlogin_Click(object sender, EventArgs e)
{
string userName = txtusername.Text.Trim();
string Password = txtpassword.Text.Trim();
string message;
message = "";
login.BLL.loginManager mgr = new login.BLL.loginManager();
Login.model.userInfo user= mgr.userlogin(userName, Password, ref message);
MessageBox.Show(message);
}
总结:
编程的最高境界就是永远在无止尽的在使程序模块间的关联越来越少,但是内在包装联系却很紧系,所以在学习了三层之后就又出现了七层,可能以后又会出现很多层,谁都说不准,现在我们就是要有这种思想,一步一个脚印,成为一名合格的架构程序师!