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

.NET 分布式架構實戰 (四) 構建理想與實現的橋梁 (前篇):DAL 核心操作與查詢對象設計

     編輯:關於.NET

前言:架構師的三大核心能力

Richard 認為設計框架需具備:**整體把控力、抽象能力、分析能力**。本篇從「以不變應萬變」的 DAL 核心操作出發,推導出通用 IDataContext 介面與基於 Interpreter 模式的 IQuery 查詢對象。

一、DAL 基本操作:CRUD 的演進

1. 初版:冗長但自解釋


AddSingleDataEntity(T entity)
AddDataEntityList(List list)
UpdateSingleDataEntity(T entity)
UpdateDataEntityList(List list)
DeleteSingleDataEntity(T entity)
DeleteDataEntityList(List list)
GetSingleDataEntity(...)
GetDataEntityList(IQuery query)

命名遵循 .NET Framework Design Guidelines「自解釋性」,但過於冗長。

2. 參數抽象:IDataEntity 標記介面

  • 所有 ORM 實體 (LINQ to SQL / EF) 實作 IDataEntity (空介面,僅作標記)。
  • 置於 Common 組件,BLL/DAL 雙向引用不產生循環依賴。
  • 泛型約束:where T : class, IDataEntity, new() (滿足 LINQ/EF 實體要求)。

public class DataResult where T : IDataEntity
{
    public List EntityList { get; set; }  // 新增/修改後的實體 (含自增 PK)
    public bool IsSuccess { get; set; }
    public Exception Exception { get; set; } // 失敗時攜帶詳細異常
    public object CustomData { get; set; }   // 擴充欄位 (如影響行數、執行耗時)
}

解決「僅知成敗、不知細節」痛點:呼叫端可依異常類型決定重試/回滾/記錄。

3. 精簡命名:符合開發者習慣的 CRUD


public interface IDataContext
{
    // Query
    IList Query(IQuery query) where T : class, IDataEntity, new();
    IList Query(IQuery query, int pageIndex, int pageSize) where T : class, IDataEntity, new();

    // CUD
    T Add(T item) where T : class, IDataEntity, new();
    IList Add(List items) where T : class, IDataEntity, new();
    bool Delete(T item) where T : class, IDataEntity, new();
    bool Delete(List items) where T : class, IDataEntity, new();
    T Update(T item) where T : class, IDataEntity, new();
    IList Update(List items) where T : class, IDataEntity, new();
}
  • 單筆回傳實體 (含資料庫生成的 PK/時間戳),列表回傳集合。
  • 分頁查詢內建於介面,避免上層手工 Skip/Take 造成 SQL 注入風險。

二、查詢對象 (Query Object) 深度思考

1. 來源:Fowler《企業應用架構模式》第 316 頁

Query Object = **Interpreter Pattern** 應用:客戶端用領域術語組裝查詢條件,框架負責解釋為 SQL/LINQ/EF 語法樹。

2. 核心優勢

  • 業務解耦:BLL 完全不知資料庫表/欄位名,僅操作實體屬性。
  • 多提供者支援:LinqQuery、EFQuery、SqlQuery 實作同一 IQuery,配置切換。
  • 緩存友善:查詢對象可序列化/比較,相同查詢可緩存解析後的 SQL 或編譯後的 Lambda。
  • 唯讀優化:標記唯讀查詢,直接緩存結果集 (需配合緩存失效策略)。

3. IQuery 介面草案


public interface IQuery
{
    string UniqueKey { get; }           // 查詢唯一標識 (用於緩存鍵)
    bool IsReadOnly { get; }            // 是否唯讀
    // 流暢式建構 API 由具體實現提供 (如 Where, OrderBy, Select)
}

三、回顧:DAL 定位與職責邊界

經過層層推演,Richard 確認:**DAL 單純負責「存取與操作資料」**,不包含業務規則、驗證、工作流。上層 (BLL/Repository) 透過 IDataContext 以統一 CRUD + IQuery 與 DAL 交互,達到「以不變應萬變」。

下篇預告

  • Query Object 具體實現:LinqQuery / EFQuery 解析器。
  • Repository 模式封裝 IDataContext,提供領域語義 API。
  • 單元測試策略:In-Memory Fake 替換真實 DAL。

出處:https://www.cnblogs.com/yanyangtian

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