Asp.net-Mvc

DAL 中的儲存庫與服務模式:EF 和 Dapper

  • February 20, 2016

我正在做項目,我需要設計 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

隨附的部落格文章:ORM:不要重新發明輪子

在建構項目層以避免“流血”方面,他是這樣做的。

項目佈局

來自部落格文章:使用 Dapper 創建數據儲存庫

引用自:https://stackoverflow.com/questions/19796223