初始三层架构(超超超详细)

举报
小小张自由--张有博 发表于 2021/11/22 22:08:22 2021/11/22
【摘要】 目录 何为三层? 在代码中如何实现 DAL层的思维逻辑 BLL层的思维逻辑 UI层的思维逻辑 三层架构你还不太懂吗?赶紧抽5分钟的时间阅读一下博客,保证你有不一样的收获哦! 何为三层? 三层架构就是为了符合“高内聚,低耦合”思想,把各个功能模块划分为表示层(UI)、业务逻辑层(BLL)和数据访问层(DAL)三层架构,各...

目录

何为三层?

在代码中如何实现

DAL层的思维逻辑

BLL层的思维逻辑

UI层的思维逻辑


三层架构你还不太懂吗?赶紧抽5分钟的时间阅读一下博客,保证你有不一样的收获哦!

何为三层?

三层架构就是为了符合“高内聚,低耦合”思想,把各个功能模块划分为表示层(UI)、业务逻辑层(BLL)和数据访问层(DAL)三层架构,各层之间采用接口相互访问,并通过对象模型的实体类(Entity)作为数据传递的载体,不同的对象模型的实体类一般对应于数据库的不同表,实体类的属性与数据库表的字段名一致。

看定义看不明白不要紧,上图

将上面的需求、内容抽象一下,就出了包图。(Entity类与Model类先近似认为一样)


在代码中如何实现

写代码就跟盖楼一样,先做地基、才能有上层建筑。UI层、BLL层、DAL层都引用了Model(实体)层。所以我们先写Model层。


      namespace Login.Model
      {
         /// <summary>
         ///实体类,用于保存用户信息。一个SQL表对应一个实体类
         /// </summary>
         public class UserInfo
          {
             /// <summary>
             /// 封装数据
             /// </summary>
             public int ID { get; set; }
             public string UserName { get; set; }
             public string Password { get; set; }
             public string Email { get; set; }
          }
      }
  
 

DAL层的思维逻辑

1、在数据访问实现类中引用业务实体项目命名空间

2、实例化SqlConnection对象,实现数据库连接

3、实例化SqlCommand对象,执行SQL命令

4、实例化SqlDataReader对象,读取数据

5、使用实体类传递信息

层层相扣、D层需要引用Model层。具体代码如下(有详细注释哦,认真阅读)


      namespace Login.DAL_
      {
         class DbUtil
          {
             //创建数据库连接字符串
             public static string ConnString = @"Server =ZYB; Database =Login; User ID = sa;Password =123456";
          }
      }
  
 

      namespace Login.DAL_
      {
         /// <summary>
         /// User类
         /// </summary>
         public class UserDAO
          {
             public Login.Model.UserInfo SelectUser(string userName, string password)
              {
                 //实例化SqlConnection对象,实现数据库连接
                 using (SqlConnection conn = new SqlConnection(DbUtil.ConnString)) //没有分号,释放资源
                  {
                     //实例化SqlCommadn对象,执行SQL命令(对数据库执行操作)
                      SqlCommand cmd = conn.CreateCommand();
                     //连接数据库中的User表(连接数据库的代码容易出错)
                      cmd.CommandText = @"SELECT ID,UserName,Password,Email
       FROM USERS WHERE UserName=@Username AND Password=@Password";
                      cmd.CommandType = CommandType.Text;
                     //给命令对象添加参数,将userName的值传给@UserName
                      cmd.Parameters.Add(new SqlParameter("@UserName",userName));
                      cmd.Parameters.Add(new SqlParameter("@Password",password));
                     //打开数据库连接,添加后解决conn关闭异常
                      conn.Open();
                     //若要创建 SqlDataReader,必须调用 SqlCommand 对象的 ExecuteReader 方法,而不要直接使用构造函数。
                      SqlDataReader reader = cmd.ExecuteReader();
                     //SqlDateReader reader = cmd.ExecuteReader();//字母打错了
                     //使用实体类传递信息,初始值为null
                      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;
                  }
              }
          }
      }
  
 

      namespace Login.DAL_
      {
       /// <summary>
         /// 加分类
         /// </summary>
        public class ScoreDAO
          {
             public void UpdateScore(string userName, int value)
              {
                //实例化SqlConection对象,实现数据库连接
                 using (SqlConnection conn = new SqlConnection(DbUtil.ConnString))//自动释放资源
                  {
                      实例化SqlCommadn对象,执行SQL命令(对数据库执行操作)
                      SqlCommand cmd = conn.CreateCommand();
                     //连接数据库中的Scores表(连接数据库的代码容易出错)
                      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();
                     //对数据库进行更新,使用ExecuteNonQuery()方法
                      cmd.ExecuteNonQuery();
                  }
              }
          }
      }
  
 

BLL层的思维逻辑

1、在业务逻辑处理类中引用数据访问层、业务实体层命名空间

2、实例化数据访问对象

3、调用数据访问功能

4、实现业务逻辑处理功能

层层相扣,B层需要引用D层、Model层,具体代码如下。


      namespace Login.BLL
      {
         public class LoginManager
          {
             public Login.Model.UserInfo userLogin(string userName, string password)
              {
                //业务逻辑层需要调用数据访问层
                //实例化数据访问对象uDao
                  Login.DAL_.UserDAO uDao=new Login.DAL_.UserDAO();
                 //调用数据访问功能,将访问到的数据赋值给user
                  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,对应一个catch,并且弹出的内容显示在U层
                     throw new Exception("登录失败!");
                  }
              }
          }
      }
  
 

UI层的思维逻辑

1、在窗体后台实现类中引用业务逻辑层、业务实体层命名空间

2、实例化业务逻辑处理对象和业务实体对象

3、数据绑定

4、调用业务逻辑层功能

层层相扣,U层需要引用B层、Model层。


      private void btnOK_Click(object sender, EventArgs e)
      {
          try
           {
               //定义变量userName,password 取出用户界面的数据
               string userName = txtName.Text.Trim();
               string password = txtPassword.Text;
               //UI层需要调用BLL层,实例化一个具体执行业务逻辑得到对象mgr,
                Login.BLL.LoginManager mgr = new Login.BLL.LoginManager();
               //调用BLL层的方法,将用户输入的信息作为参数传入方法
               //数据绑定,将用户输入的信息赋值给实体
                Login.Model.UserInfo user = mgr.userLogin(userName, password);
                MessageBox.Show("登录成功!!!" + userName);
           }
               //如果登录异常,则提示登录失败,catch 对应B层的try
               catch (Exception ex)
           {
                MessageBox.Show(ex.Message);
           }
      }
  
 

博文至此,关于三层的知识就介绍完了,有不足的地方欢迎评论区留言。如果本篇博客对您有一定的帮助,大家记得点赞哦。

文章来源: blog.csdn.net,作者:小小张自由—>张有博,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/promsing/article/details/107928337

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。