三层-架构星星之火

时间:2022-06-22 14:59:41

  前言

   在上篇博客中我们已经了解了三层的一些基本概念,定义和为什么用三层。对于三层有了宏观上的概念,知道在软件架构设计中所处的位置,我们要做的是能够不断改进、持续完善的软件,这也正是三层存在的重大意义。解耦是重点,各个层次、模块之前的耦合度太高的话,根本不利于软件的维护和扩展。UML结合三层思想做出的软件是今后发展趋势。


  原则

   DAL:提供基本的数据访问,不包含任何业务相关的逻辑处理。 

    UI:负责显示和采集用户操作。不包含相关的业务处理。只是将数据传给了业务逻辑层。

    BLL:负责相关的业务逻辑。通过获取UI传来的操作指令,决定执行业务逻辑,在需要访问数据源的时候直接交给DAL处理。处理完成后,返回必要的数据给UI.


  包图

    业务复杂一定程度,数据访问和业务访问层分开,UI与业务访问分开。用一个包图表示他们关系三层-架构星星之火

    在包图中我们看到每一层都在调用实体层,而三层之间的联系不是错综复杂的,简单的联系而已,这就是需要我们知道“高内聚、低耦合”之所以做成这样,目的就是降低耦合,都是为了减少犯错,减少繁琐度,修改也只需要改实体就行。

    之前看过师姐描述三层结合生活,服务员(只管接待客人)、厨师(只管做客人点的菜)和采购员(只管按客人点菜的要求采购食材之间的关系,很生动形象的描述三层之间的数据传递。他们各负其职,服务员不用了解厨师如何做菜,不用了解采购员如何采购食材;厨师不用知道服务员接待了哪位客人,不用知道采购员如何采购食材;同样,采购员不用知道服务员接待了哪位客人,不用知道厨师如何做菜

    Entity将三层联系起来,也就是顾客把他们联系到一起为提供吃饭的条件。实体层是必不可少的一层。


  代码实现


  DAL(数据访问层)

public class UserDAO    //数据访问对象
{
//public Login.Model.UserInfo SelectUser(string userName, string password)
//{
// throw new NotFiniteNumberException();

//}
public Login.Model.UserInfo SelectUser(string userName, string password)
{
using (SqlConnection conn = new SqlConnection(Dbutil1.ConnString))
{
conn.Open(); //打开
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));//传参数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;
}
}
}

class Dbutil1
{
public static string ConnString = @"Server=zjc;Database=机房重构;User ID=zhaojinchao;Password=zjc";
}
  Entity(Model)层:

public  class UserInfo
    {


        public int ID { get;set; }
        public string UserName { get; set; }
        public string Password { get; set; }
        public string Email { get; set; }
 
}
  BLL(业务逻辑层)

public class LoginManager
{
public Login.Model.UserInfo UserLogin(string userName, string password)
{

Login.DAL.UserDAO uDAO = new Login.DAL.UserDAO();

Login.Model.UserInfo user = uDAO.SelectUser(userName, password);
if (user != null)//判断user值,做出相应处理,如果user为null值,那么说明用户名或密码错误;
{
Login.DAL.ScoreDAO sDAO = new Login.DAL.ScoreDAO();
sDAO.UpdateScore(userName, 10);
return user;
}
else
{
throw new Exception("登录失败");
}
}
}
   UI

private void btnLogin_Click(object sender, EventArgs e)
{
//IDbConnection conn = new SqlConnection("c");
//IDbCommand cmd = conn.CreateCommand();
//cmd.CommandText = "Selelcct UserName From USERS WHERE";
//cmd.ExecuteReader//显示层不能直接跟数据打交道
string userName=txtUserName.Text .Trim ();
string password=txtPassword.Text.Trim ();
Login.BLL.LoginManager mgr = new Login.BLL.LoginManager();
Login.Model.UserInfo user=mgr.UserLogin (userName,password);

//Login.BLL.LoginService sve = new Login.BLL.LoginService();
//Login.Model.UserInfo user=sve.UserLogin(userName, password);
MessageBox.Show("登录用户:" + user.UserName);
}


  总结
   通过实现登陆分析好三层之间的关系,清楚其中的一条数据传递线,在我们的学习过程中是极其重要的。BLL其实主要调用DAL层的操作,返回DAL层添加用户的Message(true或者false)。客户端与数据库之间犹豫存在业务逻辑层,使得两层的依赖性减小,降低之间的耦合度,便于为何更改。UI层则主要完成收取、显示响应用户的需求,去调用BLL层实现的a方法,DAL层就是实实在在做这件事情的操作。