DAL 中的儲存庫與服務模式:EF 和 Dapper
我正在做項目,我需要設計 DAL。我將
Entity Framework用於大部分項目和Dapper一些對性能敏感的領域。我正在考慮使用儲存庫模式,但後來 EF 在某種意義上已經實現了這種模式。但 Dapper 的情況並非如此。然後我想知道在我的 DAL 中混合儲存庫和服務模式是否有效?或者這會進入業務邏輯層嗎?
我正在考慮建構的範例結構:
MyProjectName.Main Views/ Controllers/ Infrastructure/ ... MyProjectName.DAL DataService.EF/ fileName.cs ... DataService.Dapper/ fileName.cs ...
EF 或任何其他 ORM 不實現儲存庫。儲存庫旨在將域與持久性分離。域與域對像一起工作,EF/Nhibernate/Dapper 等與表示關係數據庫的 OOP 視圖的持久性實體一起工作。
看到不同?一個需要業務對象,另一個處理數據結構。它們相似但不相同。領域模型概念、行為和案例,持久性關心儲存數據以便快速檢索。不同的職責。儲存庫充當它們之間的中介,“轉換”持久性結構中的域對象,反之亦然。
始終,ORM 是儲存庫的實現細節。對於 CRUD 應用程序,您實際上並沒有域,而是直接與數據庫打交道,即(微)ORM。在這種情況下,Repo 僅作為一種外觀才有意義,以賦予數據訪問一些業務意義(GetOrders更容易理解整個 Linq 或 5 行 SQL 連接 3 個表)。
Repository 介面是在需要的地方定義的,但它是在 Persistence (DAL) 中實現的。與服務相同,它們可以在域中定義(作為介面),而它們的實現可以在 DAL 中。雖然儲存庫實現幾乎總是 DAL 的一部分,但只有一些服務駐留在 DAL 中,原因很簡單,它們更容易以這種方式完成工作。其他服務可以直接使用儲存庫(通常通過建構子注入)並且不接觸 DAL。
無論你使用什麼模式,試著理解它們的實際目的並始終考慮解耦。
查看Bradley Braithwaite創建的EF + Dapper 混合實現。
GitHub 回購:https ://github.com/bbraithwaite/HybridOrm
在建構項目層以避免“流血”方面,他是這樣做的。
來自部落格文章:使用 Dapper 創建數據儲存庫
