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

布满荆棘的人生 2021-09-24 14:18 711阅读 0赞

目录

何为三层?

在代码中如何实现

DAL层的思维逻辑

BLL层的思维逻辑

UI层的思维逻辑


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

何为三层?

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

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

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3Byb21zaW5n_size_16_color_FFFFFF_t_70

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3Byb21zaW5n_size_16_color_FFFFFF_t_70 1

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

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3Byb21zaW5n_size_16_color_FFFFFF_t_70 2


在代码中如何实现

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

  1. namespace Login.Model
  2. {
  3. /// <summary>
  4. ///实体类,用于保存用户信息。一个SQL表对应一个实体类
  5. /// </summary>
  6. public class UserInfo
  7. {
  8. /// <summary>
  9. /// 封装数据
  10. /// </summary>
  11. public int ID { get; set; }
  12. public string UserName { get; set; }
  13. public string Password { get; set; }
  14. public string Email { get; set; }
  15. }
  16. }

DAL层的思维逻辑

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

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

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

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

5、使用实体类传递信息

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

  1. namespace Login.DAL_
  2. {
  3. class DbUtil
  4. {
  5. //创建数据库连接字符串
  6. public static string ConnString = @"Server =ZYB; Database =Login; User ID = sa;Password =123456";
  7. }
  8. }
  9. namespace Login.DAL_
  10. {
  11. /// <summary>
  12. /// User类
  13. /// </summary>
  14. public class UserDAO
  15. {
  16. public Login.Model.UserInfo SelectUser(string userName, string password)
  17. {
  18. //实例化SqlConnection对象,实现数据库连接
  19. using (SqlConnection conn = new SqlConnection(DbUtil.ConnString)) //没有分号,释放资源
  20. {
  21. //实例化SqlCommadn对象,执行SQL命令(对数据库执行操作)
  22. SqlCommand cmd = conn.CreateCommand();
  23. //连接数据库中的User表(连接数据库的代码容易出错)
  24. cmd.CommandText = @"SELECT ID,UserName,Password,Email
  25. FROM USERS WHERE UserName=@Username AND Password=@Password";
  26. cmd.CommandType = CommandType.Text;
  27. //给命令对象添加参数,将userName的值传给@UserName
  28. cmd.Parameters.Add(new SqlParameter("@UserName",userName));
  29. cmd.Parameters.Add(new SqlParameter("@Password",password));
  30. //打开数据库连接,添加后解决conn关闭异常
  31. conn.Open();
  32. //若要创建 SqlDataReader,必须调用 SqlCommand 对象的 ExecuteReader 方法,而不要直接使用构造函数。
  33. SqlDataReader reader = cmd.ExecuteReader();
  34. //SqlDateReader reader = cmd.ExecuteReader();//字母打错了
  35. //使用实体类传递信息,初始值为null
  36. Login.Model.UserInfo user = null;
  37. while (reader.Read())
  38. {
  39. //判断有查询结果时
  40. if (user==null)
  41. {
  42. user = new Login.Model.UserInfo();
  43. }
  44. //赋值
  45. user.ID = reader.GetInt32(0);
  46. user.UserName = reader.GetString(1);
  47. user.Password = reader.GetString(2);
  48. if (!reader.IsDBNull(3))
  49. {
  50. user.Email = reader.GetString(3);
  51. }
  52. }
  53. return user;
  54. }
  55. }
  56. }
  57. }
  58. namespace Login.DAL_
  59. {
  60. /// <summary>
  61. /// 加分类
  62. /// </summary>
  63. public class ScoreDAO
  64. {
  65. public void UpdateScore(string userName, int value)
  66. {
  67. //实例化SqlConection对象,实现数据库连接
  68. using (SqlConnection conn = new SqlConnection(DbUtil.ConnString))//自动释放资源
  69. {
  70. 实例化SqlCommadn对象,执行SQL命令(对数据库执行操作)
  71. SqlCommand cmd = conn.CreateCommand();
  72. //连接数据库中的Scores表(连接数据库的代码容易出错)
  73. cmd.CommandText = @"INSERT INTO SCORES(UserName,Score) Values(@UserName,@Score)";
  74. cmd.Parameters.Add(new SqlParameter("@UserName",userName));
  75. cmd.Parameters.Add(new SqlParameter("@Score",value));
  76. //打开数据库
  77. conn.Open();
  78. //对数据库进行更新,使用ExecuteNonQuery()方法
  79. cmd.ExecuteNonQuery();
  80. }
  81. }
  82. }
  83. }

BLL层的思维逻辑

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

2、实例化数据访问对象

3、调用数据访问功能

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

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

  1. namespace Login.BLL
  2. {
  3. public class LoginManager
  4. {
  5. public Login.Model.UserInfo userLogin(string userName, string password)
  6. {
  7. //业务逻辑层需要调用数据访问层
  8. //实例化数据访问对象uDao
  9. Login.DAL_.UserDAO uDao=new Login.DAL_.UserDAO();
  10. //调用数据访问功能,将访问到的数据赋值给user
  11. Login.Model.UserInfo user= uDao.SelectUser(userName,password);
  12. //实现业务逻辑处理功能
  13. if (user!=null)//数据一致,登录成功
  14. {
  15. //实例化一个加分对象
  16. Login.DAL_.ScoreDAO sDao = new Login.DAL_.ScoreDAO();
  17. //进行加分更新
  18. sDao.UpdateScore(userName,10);
  19. //返回用户
  20. return user;
  21. }
  22. else
  23. {
  24. //一个throw,对应一个catch,并且弹出的内容显示在U层
  25. throw new Exception("登录失败!");
  26. }
  27. }
  28. }
  29. }

UI层的思维逻辑

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

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

3、数据绑定

4、调用业务逻辑层功能

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

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

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

发表评论

表情:
评论列表 (有 0 条评论,711人围观)

还没有评论,来说两句吧...

相关阅读