首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

泛型與設計模式實踐:NHibernate 資料存取的兩種封裝策略

     編輯:關於.NET

背景

參考 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,較繁瑣。

選型建議

  • 專案較小、實體少、無須多資料庫切換 → 方式一 輕量足夠。
  • 專案大、需支援多資料庫提供者、強調關注點分離 → 方式二 架構更清晰,便於單元測試與擴展。
  • 進階:可結合 Repository 模式,進一步將 HQL 構建邏輯封裝於 Specification/Query Object 中,達到更高內聚。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved