參考 PetShop 4.0 架構,實體層使用 NHibernate ORM。需封裝對業務實體的通用查詢。
實體層 BaseDAL:
public static IList<T> GetData<T>(string hql) {
return new NHibernateHelper().Select<T>(hql);
}
業務層 EmployeeBLL:
public List<EmployeeInfo> GetData() {
return (List<EmployeeInfo>)BaseDAL.GetData<EmployeeInfo>("From Employee E");
}
優點:簡單直觀。缺點:每個業務類都要寫 GetData,難以套用工廠等模式統一創建。
實體層 BaseDAL 定義模板方法:
public IList<BaseInfo> GetData() {
string hql = InitHQL();
return new NHibernateHelper().Select<BaseInfo>(hql);
}
protected abstract string InitHQL();
EmployeeDAL 實現:
protected override string InitHQL() { return "From Employee E"; }
業務層透過反射 + 配置創建 DAL:
string dalAssembly = ConfigurationManager.AppSettings["DAL"]; // "SQLServerDAL"
string className = dalAssembly + "." + key + "DAL"; // "SQLServerDAL.EmployeeDAL"
BaseDAL dal = (BaseDAL)Assembly.Load(dalAssembly).CreateInstance(className);
List<BaseInfo> data = dal.GetData();
優點:可套用工廠模式、依賴倒置,業務層不依賴具體 DAL。缺點:每個實體需建立 DAL 子類並重寫 InitHQL,較繁瑣。