• 基于.NET平台的分层架构实战(十)——业务逻辑层的实现


    在这一篇文章中,将实现一个NGuestBook的业务逻辑层。

          在实际应用中,业务逻辑层是至关重要的,他承载着整个系统最核心的部分,也是客户最关注的部分。这一部分的实现,通常需要技术专家和领域专家通力合作。当然,在本文章系列的Demo中,由于业务逻辑的简单性,这里看的可能还不是很明显。

          在本篇文章的业务逻辑层实现中,业务逻辑层主要承担了以下职责:
          1.对不同数据访问层的封装。使得表示层可以不关心具体的数据访问层。
          2.业务逻辑数据的填充与转换。如管理员口令的加密。
          3.核心业务的实现。这里很多业务逻辑只有一行代码,即一个业务逻辑方法恰好对应一个数据访问方法,但是也有通过多个数据访问方法实现业务的。如AdminBLL中的ChangePassword方法就调用了AdminDAL的GetByID和Update两个方法。另外,虽然许多方法只调用一个数据访问方法,但是从命名看也能看出两者着眼点的不同。如AdminDAL中的GetByNameAndPassword,这个名字显然是从数据库的角度看问题——指按照指定的Name和Password两个字段的值取出相应信息,至于这样做的业务意义它不需要知道。而AdminBLL中,调用它的方法叫Login,这是从业务角度看问题——即这个方法是管理员登录。

          下面分步骤实现业务逻辑层:

    1.建立工程
          在这个架构中,业务逻辑层是可以替换的。及业务逻辑层不是直接耦合于表示层,而是通过依赖注入机制实现。所以,我们这里将这个业务逻辑层不直接命名为BLL,而是新建一个叫SimpleBLL的工程,放置我们这个业务逻辑层的相关代码。

    2.配置依赖注入
          业务逻辑层要通过反射工厂加载相应的数据访问层,这样就需要在Web.config中配置需要使用的数据访问层。打开Web.config,找到appSettings节点下的“DAL”项,将其中的value赋予我们要使用的数据访问层工程名称,例如:要使用NBearDAL,则这一项应该这样写:
          <add key="DAL" value="NBearDAL"/>

    3.编写散列加密工具
          因为在业务逻辑层的多处需要用到散列加密,所以在Utility工程下写一个辅助类Encryptor,完成这个工作,这个辅助类的具体代码如下:


    Encryptor.cs

    1. 1using System;
    2. 2using System.Collections.Generic;
    3. 3using System.Text;
    4. 4
    5. 5namespace NGuestBook.Utility
    6. 6{
    7. 7    /**//// <summary>
    8. 8    /// 辅助类-用于对敏感数据进行Hash散列,达到加密效果
    9. 9    /// </summary>
    10. 10    public sealed class Encryptor
    11. 11    {
    12. 12        /**//// <summary>
    13. 13        /// 使用MD5算法求Hash散列
    14. 14        /// </summary>
    15. 15        /// <param name="text">明文</param>
    16. 16        /// <returns>散列值</returns>
    17. 17        public static string MD5Encrypt(string text)
    18. 18        {
    19. 19            return System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(text, "MD5");
    20. 20        }
    21. 21
    22. 22        /**//// <summary>
    23. 23        /// 使用SHA1算法求Hash散列
    24. 24        /// </summary>
    25. 25        /// <param name="text">明文</param>
    26. 26        /// <returns>散列值</returns>
    27. 27        public static string SHA1Encrypt(string text)
    28. 28        {
    29. 29            return System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(text, "SHA1");
    30. 30        }
    31. 31    }
    32. 32}
    复制代码

    4.实现业务逻辑层
          有了上述准备工作和以前实现的组件,业务逻辑层的实现非常直观。这里仅以管理员为例,展示如何实现业务逻辑层。
          AdminBLL类建立在SimpleBLL工程下的AdminBLL.cs文件中,实现了IAdminBLL接口,需具体代码如下:


    IAdminBLL

    1. 1using System;
    2. 2using System.Collections.Generic;
    3. 3using System.Text;
    4. 4using NGuestBook.Entity;
    5. 5using NGuestBook.Factory;
    6. 6using NGuestBook.IBLL;
    7. 7using NGuestBook.IDAL;
    8. 8using NGuestBook.Utility;
    9. 9
    10. 10namespace NGuestBook.IBLL
    11. 11{
    12. 12    /**//// <summary>
    13. 13    /// 业务逻辑层接口-管理员
    14. 14    /// </summary>
    15. 15    public class AdminBLL : IAdminBLL
    16. 16    {
    17. 17        /**//// <summary>
    18. 18        /// 添加管理员
    19. 19        /// </summary>
    20. 20        /// <param name="admin">新管理员实体类</param>
    21. 21        /// <returns>是否成功</returns>
    22. 22        public bool Add(AdminInfo admin)
    23. 23        {
    24. 24            admin.Password = Encryptor.MD5Encrypt(admin.Password);
    25. 25            return DALFactory.CreateAdminDAL().Insert(admin);
    26. 26        }
    27. 27
    28. 28        /**//// <summary>
    29. 29        /// 删除管理员
    30. 30        /// </summary>
    31. 31        /// <param name="id">欲删除的管理员的ID</param>
    32. 32        /// <returns>是否成功</returns>
    33. 33        public bool Remove(int id)
    34. 34        {
    35. 35            return DALFactory.CreateAdminDAL().Delete(id);
    36. 36        }
    37. 37
    38. 38        /**//// <summary>
    39. 39        /// 修改管理员密码
    40. 40        /// </summary>
    41. 41        /// <param name="id">欲修改密码的管理员的ID</param>
    42. 42        /// <param name="password">新密码</param>
    43. 43        /// <returns>是否成功</returns>
    44. 44        public bool ChangePassword(int id, string password)
    45. 45        {
    46. 46            password = Encryptor.MD5Encrypt(password);
    47. 47            AdminInfo admin = DALFactory.CreateAdminDAL().GetByID(id);
    48. 48            admin.Password = password;
    49. 49            return DALFactory.CreateAdminDAL().Update(admin);
    50. 50        }
    51. 51
    52. 52        /**//// <summary>
    53. 53        /// 管理员登录
    54. 54        /// </summary>
    55. 55        /// <param name="name">管理员登录名</param>
    56. 56        /// <param name="password">管理员密码</param>
    57. 57        /// <returns>如果登录成功,则返回相应管理员的实体类,否则返回null</returns>
    58. 58        public AdminInfo Login(string name, string password)
    59. 59        {
    60. 60            password = Encryptor.MD5Encrypt(password);
    61. 61            return DALFactory.CreateAdminDAL().GetByNameAndPassword(name, password);
    62. 62        }
    63. 63
    64. 64        /**//// <summary>
    65. 65        /// 取得全部管理员信息
    66. 66        /// </summary>
    67. 67        /// <returns>管理员实体类集合</returns>
    68. 68        public IList<AdminInfo> GetAll()
    69. 69        {
    70. 70            return DALFactory.CreateAdminDAL().GetAll();
    71. 71        }
    72. 72    }
    73. 73}
    复制代码
  • 相关阅读:
    MySQL的数据库时间与电脑系统时间不一致
    csv文件处理——Opencsv
    java中的注解大全@controller、@service、@repository等
    浅谈HTTP中Get、Post、Put与Delete的区别
    plsql导入.dmp步骤
    解决maven官方库中没有oracle jdbc驱动的问题:Missing artifact com.oracle:ojdbc14:jar:10.2.0.1.0
    String的拼接
    使用java中汇编指令解析String对象(String s1="a";String s2=s1+"b";String s3=new String("a");String s4=s3+"a";)
    集合 List ,Set
    关于==和equals的区别和联系,面试这么回答就可以
  • 原文地址:https://www.cnblogs.com/encounter/p/2188819.html
Copyright © 2020-2023  润新知