三层架构之登录窗体

什么是三层架构?

三层在物理上划分为:显示层、业务层、数据层

在逻辑上分为:UI/BLL + DAL/DB

我们在此所说的三层结构为:
UI(User Interface):显示和采集用户操作。

BLL(Business Login Layer):处理业务逻辑,通过获取U层传来的操作指令,决定业务逻辑,在访问数据源的时候直接交给D层处理,处理完成后返回必要数据给U层。

DAL(Data Access Layer):只提供最基本的数据访问。

实体Model层:保存实体以及传输数据。实体层不包含于任何一层。
在这里插入图片描述

具体应用:UI→BLL→DAL
①DAL所在的程序集不引用BLL和UI
②BLL需要引用DAL
③UI直接引用BLL,间接引用DAL,不能直接饮用DAL
④每一层都需要引用实体Model层
在这里插入图片描述

三层架构如何写(以登录为例)

  1. 首先我们需要建立四个类库,其中包括三层结构和实体层
    在这里插入图片描述

  2. 在U层建立一个From窗体,如图所示
    在这里插入图片描述
    U层代码:

private void btnLogin_Click_1(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);
        }
  1. B层代码:
public class LoginManager
    {
    
    
        
        //根据用户的需要,使用了用户登录的方便
            public Login.Model.UserInfo UserLogin(string userName, string Password)
            {
    
    
                //throw new NotFiniteNumberException();
                //需要用到数据源,把数据源调来
                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.UpdateScore(userName, 10);
                    return user;
                }
                else
                {
    
    
                    throw new Exception("登陆失败");
                }
            }
      }

4.D层与数据建立联系
首先需要在D层新建三个类分别为
在这里插入图片描述①DUtil类

class DbUtil
    {
    
    
        public static string ConnString = @"Server = LAPTOP-4EF4CAKC; Database = Login ; User ID = sa;Password = 123";
       //数据库的账户和密码
   }

②ScoreDAO类

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();
                
            }
        }
    }

③UserDAO类

 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;
            }
        }
    }

5.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; }
    }
}

登录成功!
在这里插入图片描述

使用三层架构的好处

  1. 避免了表示层直接访问数据访问层,表示层只和业务逻辑层有联系,提高了数据安全性。
  2. 高内聚、低耦合降低了层与层之间的依赖。
  3. 项目结构更清楚,分工更明确,有利于后期的维护和升级。
  4. 每一个层可以由不同的人员来开发,只要遵循接口标准,利用相同的对象模型实体类就可以了,这样就可以大大提高系统的开发速度。
    (比如机房合作项目)

猜你喜欢

转载自blog.csdn.net/weixin_44690047/article/details/109443059