【三层架构】——知识梳理

三层架构是什么

三层架构(3-tier architecture)通常意义上就是将整个业务应用划分为:显示层(UI)、业务逻辑层(BLL)、数据访问层(DAL)。区分层次的目的主要是为了“高内聚低耦合”的思想。

 

何时用

当业务复杂和数据存储单独存在时,需要将分层来编写程序

怎么用

拿一个小小的Demo来举例说明简单的运用

【三层架构】——知识梳理_第1张图片

  • 显示层(UI):主要是与用户交互的界面,用于接收用户输入的数据和显示处理后用户需要的数据。将用户输入的数据传递给业务逻辑层,一般不包含任何实际的业务处理,当业务逻辑层的数据发生变化时,显示层就会显示出更新的结果。显示层提供应用程序的用户界面,通常为Windows应用程序或Web应用程序。
  •  private void btnLogin_Click(object sender, EventArgs e)
            {
                
                string Username = txtUsername.Text.Trim();
                string Password = txtPassword.Text;
                Login.BLL.LoginManager mgr = new Login.BLL.LoginManager();
                Login.Model.UserInfo user = mgr.UserLogin(Username, Password);
    
                MessageBox.Show("登录用户:" + user.Username);
            }



  • 业务逻辑层(BLL:UI层和DAL层之间的桥梁,它代表应用程序的核心功能,负责处理数据层的数据,实现业务逻辑。

从DAL中获取数据,以供UI显示用

从UI中获取用户指令和数据,执行业务逻辑

从UI获取用户指令和数据通过DAL写入数据源

namespace Login.BLL
{
   public  class LoginManager// 业务逻辑层引用 数据访问层和实体层
    {
       public  Login.Model .UserInfo UserLogin(string Username, string Password)
       {
           
           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.UpdateScore(Username, 10);
               return user;
           }
           else
           {
               throw new Exception("登录失败");
           }
       }

    }
}


  • 数据访问层(DAL):与数据库打交道。将存储在数据库中的数据提交给业务层,同时将业务层处理的数据保存到数据库中。

从数据源加载数据(Select)

向数据源写入数据(Insert/Update)

从数据源删除数据(Delete)

namespace Login.DAL
{
    class DbUtil
    {
        // 连接 sql 数据库
        public static string ConnString = @"Server=XULU;Database=Login;User ID=sa;Password=123456";
        //public static string ConnString = @"Data Source=.; Initial Catalog = dataBase; Integrated Security = true;";
    }
}

namespace Login.DAL
{
     public class ScoreDAO
    {
         public void  UpdateScore(string Username,int value )
         {
             using (SqlConnection conn=new SqlConnection (DbUtil.ConnString ))
             {
                 SqlCommand cmd = conn.CreateCommand();
                 cmd.CommandText = @"Insert into Scores(Username,Score)Values(@Username,@Score)";
                 cmd.Parameters.Add(new SqlParameter("@Username", Username));
                 cmd.Parameters.Add(new SqlParameter("@Score", value));

                 conn.Open();
                 cmd.ExecuteNonQuery();
             }
         }
    }
}

namespace Login.DAL
{
   
   public  class UserDAO
    {
       public Login .Model .UserInfo  SelectUser(string Username,string Password)
        {
            using (SqlConnection conn=new SqlConnection(DbUtil .ConnString))
            {
                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 ));
                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 .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 ;
            }
        }
   }
}


  • 实体层(Entity

贯穿于上面三层,他的作用就是在三层之间传递数据,这是面向对象的编程模式,

例子中:

DAL的一个insert方法,需要传递UsernamePasswordEmail等三个参数,使用实体层,那么传递的参数就只有一个User类,这样的好处就是减少系统出错的可能,提高开发效率~~

 

新建一个Model 层,专门存放数据模型。主要是为业务逻辑层服务,但有是数据访问层数据存放。具体归为那一层,具业务流程情况而定Model层是不会引用任何层级的,但是其他三个层级都会引用Model中的实体

namespace Login.Model
{
    public class UserInfo
    {
        public int ID { get; set; }
        public string Username { get; set; }
        public string Password { get; set; }
        public string Email { get; set; }
    }
}


 

生活中的三层

就餐餐馆顾客,服务员 ,厨师,采购人员

显示层就像饭店服务员,直接和客户打交道,提供软件系统与用户交互的借口;业务逻辑层是显示层和数据访问层之间的桥梁,负责数据处理和传输,就像饭店的厨师,负责把采购回来的食品加工完成,传递给服务员,数据访问层只负责数据的存取工作,雷士饭店的采购,系统里有什么数据取决于数据访问层的工作,饭店能够提供什么样的饭菜首先取决于采购购买的材料


小结

  • DAL只提供基本的数据访问,不包含任何业务相关的逻辑处理
  • UI只负责显示和采集用户操作,不包含任何的业务相关的逻辑处理
  • BLL负责处理业务逻辑。通过获取UI传来的操作指令,决定执行业务逻辑,在需要访问数据源的时候直接交给DAL处理,处理完成后,返回必要数据给UI。
  • 各层项目间不能循环引用。
  • 使用DataSet或实体对象在三层之间传递数据。

你可能感兴趣的:(【三层架构】——知识梳理)