在這一篇文章中,將實現一個NGuestBook的商務邏輯層。
在實際應用中,商務邏輯層是至關重要的,他承載著整個系統最核心的部分,也是客戶最關注的部分。這一部分的實現,通常需要技術專家和領域專家通力合作。當然,在本文章{
tagshow(event)
}">系列的Demo中,由於商務邏輯的簡單性,這裡看的可能還不是很明顯。
在本篇文章的商務邏輯層實現中,商務邏輯層主要承擔了以下職責:
1.對不同資料訪問層的封裝。使得展示層可以不關心具體的資料訪問層。
2.商務邏輯資料的填充與轉換。如管理員口令的加密。
3.核心業務的實現。這裡很多商務邏輯只有一行代碼,即一個商務邏輯方法恰好對應一個資料存取方法,但是也有通過多個資料存取方法實現業務的。如AdminBLL中的ChangePassword方法就調用了AdminDAL的GetByID和Update兩個方法。另外,雖然許多方法只調用一個資料存取方法,但是從命名看也能看出兩者著眼點的不同。如AdminDAL中的GetByNameAndPassword,這個名字顯然是從資料庫的角度看問題——指按照指定的Name和Password兩個欄位的值取出相應資訊,至於這樣做的業務意義它不需要知道。而AdminBLL中,調用它的方法叫Login,這是從業務角度看問題——即這個方法是管理員登入。
下面分步驟實現商務邏輯層:
1.建立工程
在這個架構中,商務邏輯層是可以替換的。及商務邏輯層不是直接耦合於展示層,而是通過依賴注入{
tagshow(event)
}">機制實現。所以,我們這裡將這個商務邏輯層不直接命名為BLL,而是建立一個叫SimpleBLL的工程,放置我們這個商務邏輯層的相關代碼。
2.{
tagshow(event)
}">配置依賴注入
商務邏輯層要通過反射工廠載入相應的資料訪問層,這樣就需要在Web.config中配置需要使用的資料訪問層。開啟Web.config,找到appSettings節點下的“DAL”項,將其中的value賦予我們要使用的資料訪問層工程名稱,例如:要使用NBearDAL,則這一項應該這樣寫:
<add key="DAL" value="NBearDAL"/>
3.編寫散列加密{
tagshow(event)
}">工具類
因為在商務邏輯層的多處需要用到散列加密,所以在Utility工程下寫一個輔助類Encryptor,完成這個工作,這個輔助類的具體代碼如下:
Encryptor.cs
- 1using System;
- 2using System.Collections.Generic;
- 3using System.Text;
- 4
- 5namespace NGuestBook.Utility
- 6{
- 7 /**//// <summary>
- 8 /// 輔助類-用於對敏感性資料進行Hash散列,達到加密效果
- 9 /// </summary>
- 10 public sealed class Encryptor
- 11 {
- 12 /**//// <summary>
- 13 /// 使用MD5演算法求Hash散列
- 14 /// </summary>
- 15 /// <param name="text">明文</param>
- 16 /// <returns>散列值</returns>
- 17 public static string MD5Encrypt(string text)
- 18 {
- 19 return System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(text, "MD5");
- 20 }
- 21
- 22 /**//// <summary>
- 23 /// 使用SHA1演算法求Hash散列
- 24 /// </summary>
- 25 /// <param name="text">明文</param>
- 26 /// <returns>散列值</returns>
- 27 public static string SHA1Encrypt(string text)
- 28 {
- 29 return System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(text, "SHA1");
- 30 }
- 31 }
- 32}
複製代碼
4.實現商務邏輯層
有了上述準備工作和以前實現的{
tagshow(event)
}">組件,商務邏輯層的實現非常直觀。這裡僅以管理員為例,展示如何?商務邏輯層。
AdminBLL類建立在SimpleBLL工程下的AdminBLL.cs檔案中,實現了IAdminBLL{
tagshow(event)
}">介面,需具體代碼如下:
IAdminBLL
- 1using System;
- 2using System.Collections.Generic;
- 3using System.Text;
- 4using NGuestBook.Entity;
- 5using NGuestBook.Factory;
- 6using NGuestBook.IBLL;
- 7using NGuestBook.IDAL;
- 8using NGuestBook.Utility;
- 9
- 10namespace NGuestBook.IBLL
- 11{
- 12 /**//// <summary>
- 13 /// 商務邏輯層介面-管理員
- 14 /// </summary>
- 15 public class AdminBLL : IAdminBLL
- 16 {
- 17 /**//// <summary>
- 18 /// 添加管理員
- 19 /// </summary>
- 20 /// <param name="admin">新管理員實體類</param>
- 21 /// <returns>是否成功</returns>
- 22 public bool Add(AdminInfo admin)
- 23 {
- 24 admin.Password = Encryptor.MD5Encrypt(admin.Password);
- 25 return DALFactory.CreateAdminDAL().Insert(admin);
- 26 }
- 27
- 28 /**//// <summary>
- 29 /// 刪除管理員
- 30 /// </summary>
- 31 /// <param name="id">欲刪除的管理員的ID</param>
- 32 /// <returns>是否成功</returns>
- 33 public bool Remove(int id)
- 34 {
- 35 return DALFactory.CreateAdminDAL().Delete(id);
- 36 }
- 37
- 38 /**//// <summary>
- 39 /// 修改管理員密碼
- 40 /// </summary>
- 41 /// <param name="id">欲修改密碼的管理員的ID</param>
- 42 /// <param name="password">新密碼</param>
- 43 /// <returns>是否成功</returns>
- 44 public bool ChangePassword(int id, string password)
- 45 {
- 46 password = Encryptor.MD5Encrypt(password);
- 47 AdminInfo admin = DALFactory.CreateAdminDAL().GetByID(id);
- 48 admin.Password = password;
- 49 return DALFactory.CreateAdminDAL().Update(admin);
- 50 }
- 51
- 52 /**//// <summary>
- 53 /// 管理員登入
- 54 /// </summary>
- 55 /// <param name="name">管理員登入名稱</param>
- 56 /// <param name="password">管理員密碼</param>
- 57 /// <returns>如果登入成功,則返回相應管理員的實體類,否則返回null</returns>
- 58 public AdminInfo Login(string name, string password)
- 59 {
- 60 password = Encryptor.MD5Encrypt(password);
- 61 return DALFactory.CreateAdminDAL().GetByNameAndPassword(name, password);
- 62 }
- 63
- 64 /**//// <summary>
- 65 /// 取得全部管理員資訊
- 66 /// </summary>
- 67 /// <returns>管理員實體類集合</returns>
- 68 public IList<AdminInfo> GetAll()
- 69 {
- 70 return DALFactory.CreateAdminDAL().GetAll();
- 71 }
- 72 }
- 73}
複製代碼