`
feiliboos
  • 浏览: 664417 次
文章分类
社区版块
存档分类
最新评论

基于.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}
复制代码
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics