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

.NET 分布式架構實戰 (三) 資料訪問層深度思考:從查詢爆炸到 Query Object 突破

     編輯:關於.NET

前言:草圖背後的隱憂與歷史包袱

承接上篇草圖,Richard 發現三大核心問題:

  1. DAL 綁死 LINQ 實體:技術選型無彈性,專案 B 想換 EF 無從下手。
  2. 缺乏橫切關注點:無異常處理、日誌、緩存、事務、安全統一機制。
  3. 資料來源單一:僅支援資料庫,無法對接外部 Web Service / 檔案 / XML。

一、草圖問題剖析:Service Agent 還是 Interface?

初版草圖將 DAL 上層定為 Services Interface,靈感來自「資料源可為遠端服務」。但深思後發現:服務層意味著業務邏輯、驗證、授權,這屬於 BLL 職責。若 DAL 暴露服務介面,將導致資料層膨脹、職責模糊。結論:**DAL 上層保持普通 Interface (IDataContext),服務化層上移至 BLL 之上。**

二、歷史專案 DAL 痛點復盤

典型 EmployeeDAL


public Employee GetEmployeeById(string id);
public Employee GetEmployeeByName(string name);
public string GetEmployeePositionById(string id);
public int GetEmployeeCount();

觀察:

  • 查詢方法爆炸式增長,每個條件組合一個方法。
  • Add/Update/Delete 在 LINQ/EF 下幾乎相同:ctx.GetTable().InsertOnSubmit(entity)。
  • 結論:**查詢統一化是關鍵**,CRUD 已可泛型化。

三、思維突破:Query Object (Interpreter Pattern)

1. 理論來源

Fowler《企業應用架構模式》Query Object:客戶端以領域語言構建查詢,框架解釋為 SQL。

  • 查詢對象**隱藏 SQL**,最終仍需解釋為 SQL 執行 (資料庫只認 SQL)。
  • 以**介面形式**出現:IQuery → LinqQuery/EFQuery/SqlQuery 多實現。
  • 配置決定使用哪種查詢對象 + 哪種資料訪問技術,**編譯期零耦合**。
  • 客戶端 (BLL) 僅知實體屬性,**完全隔離資料庫結構**。

3. 實現難點與心態建設

  • 從抽象到代碼有鴻溝,但「萬事開頭難,思維周密性在嘗試中鍛鍊」。
  • 架構師視角:「如果我是框架設計者,我會怎麼做?」 提升思維高度,機會來時從容應對。

四、重新審視 DAL:職責單一化

最終確認:DAL 只是**資料存取管道**,提供統一的 Add/Update/Delete/Query(IQuery)。BLL 組裝 IQuery,DAL 解析執行。達成「以不變應萬變」。

結語

查詢對象是打通「業務語言」與「資料庫語言」的橋樑。下篇將展示 LinqQuery 具體解析器實現與 Repository 封裝。出處:https://www.cnblogs.com/yanyangtian

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved