上篇介紹了實體類(Entity)、資料庫通路類(DAL)、資料通路接口(IDAL)的相關設計,本篇主要讨論下面幾個部分内容:業務邏輯層、緩存機制、界面層等方面。
業務邏輯層,主要是業務邏輯基類的設計,由于資料庫通路類(DAL)的基類封裝了大量的操作實作,是以,業務邏輯層的主要工作是進一步封裝對底層通路接口的實作,如下所示。
public class BaseBLL<T> where T : BaseEntity, new()
{
構造函數
對象添加、修改、删除等接口
傳回集合的接口
}
業務層基類封裝了大量的調用,那麼對于業務層的具體操作類,它的工作就很簡單了,基本上隻需要繼承一下基類就可以了,這就是有一個優秀父親的好處,呵呵
public class Equipment : BaseBLL<EquipmentInfo>
public Equipment() : base()
{
}
基本上,業務層的設計到此應該收尾了,可是我們注意到,很多開發都使用了緩存的機制來進一步提高程式的性能,下面對這方面進行讨論。緩存的機制,一般是把建立過的對象資源放到一個集合中,需要的時候,調出來,如下業務層的工廠類所示。
public class BLLFactory<T> where T : class
private static Hashtable objCache = new Hashtable();
public static T Instance
get
{
string CacheKey = typeof(T).FullName;
T bll = (T)objCache[CacheKey]; //從緩存讀取
if (bll == null)
{
bll = Reflect<T>.Create(typeof(T).Name, "HuaweiSoftware.IPSPBD.BLL"); //反射建立,并緩存
}
return bll;
}
}
這是一個業務邏輯類工廠建立類,我們在界面層隻需要如下調用即可構造一個(利用了緩存)具體的業務類出來
CustomerInfo info = BLLFactory<Customer>.Instance.FindByID(ID);
在上面的BaseBLL和BLLFactory類中,有一個Reflect的操作類,這是反射緩存的具體實作所在,我們探讨一下它的實作。
public class Reflect<T> where T : class
private static Hashtable m_objCache = null;
public static Hashtable ObjCache
if (m_objCache == null)
m_objCache = new Hashtable();
return m_objCache;
public static T Create(string sName, string sFilePath)
return Create(sName, sFilePath, true);
public static T Create(string sName, string sFilePath, bool bCache)
string CacheKey = sFilePath + "." + sName;
T objType = null;
if (bCache)
objType = (T)ObjCache[CacheKey]; //從緩存讀取
if (!ObjCache.ContainsKey(CacheKey))
Assembly assObj = CreateAssembly(sFilePath);
object obj = assObj.CreateInstance(CacheKey);
objType = (T)obj;
ObjCache.Add(CacheKey, objType);// 寫入緩存 将DAL内某個對象裝入緩存
else
objType = (T)CreateAssembly(sFilePath).CreateInstance(CacheKey); //反射建立
return objType;
public static Assembly CreateAssembly(string sFilePath)
Assembly assObj = (Assembly)ObjCache[sFilePath];
if (assObj == null)
assObj = Assembly.Load(sFilePath);
ObjCache.Add(sFilePath, assObj);//将整個DLL裝入緩存
return assObj;
另外,如果你在業務層需要實作更加複雜的功能,而資料庫通路基類BaseDAL提供的函數不能滿足你的需要,可以擴充資料通路層的接口和實作,如下所示。
public interface ICustomer : IBaseDAL<CustomerInfo>
List<string> GetAllCustomerNumber();
CustomerInfo GetByCustomerNumber(string number);
public class Customer : BaseDAL<CustomerInfo>, ICustomer
對象執行個體及構造函數
ICustomer 成員
那麼在業務層的類修改如下
public class Customer : BaseBLL<CustomerInfo>
public Customer() : base()
public List<string> GetAllCustomerNumber()
ICustomer customerDAL = baseDal as ICustomer;
return customerDAL.GetAllCustomerNumber();
public CustomerInfo GetByCustomerNumber(string number)
return customerDAL.GetByCustomerNumber(number);
最後,界面方面的設計是見仁見智,但根本一條是利用一些控件,可以統一風格,減少勞動,給出幾個界面的設計截圖供大家參考
WinForm方面的(顔色标明的是使用了特定的界面控件,其中紅色部分為和整個架構整合起來的分頁控件,內建了一些基本的右鍵菜單操作,包括列印功能、資料導出功能等):
Winform分頁控件設計視圖
可以選擇列進行列印
在實際運用過程中的界面效果
WebForm方面的(可以使用之前文章介紹的查詢控件、分頁控件、内容編輯控件):
下圖是查詢控件和分頁控件的一起運用:
修改内容時候的編輯控件
檢視内容時候的編輯控件