DDD領域驅動設計初探(3):倉儲Repository(下)

發表於2016-04-08

前言:上篇介紹了下倉儲的程式碼架構示例以及簡單分析了倉儲了使用優勢。本章還是繼續來完善下倉儲的設計。上章說了,倉儲的最主要作用的分離領域層和具體的技術架構,使得領域層更加專注領域邏輯。那麼涉及到具體的實現的時候我們應該怎麼做呢,本章就來說說倉儲裡面具體細節方便的知識。

一、對倉儲介面以及實現基類的完善

1、倉儲實現基類的所有方法加上virtual關鍵字,方便具體的倉儲在特定需求的時候override基類的方法。

2、查詢和刪除增加了傳參lamada表示式的方法

倉儲介面:

倉儲的實現

增加這兩個方法之後,對於單表的一般查詢都可以直接通過lamada表示式的方法傳入即可,並且返回值為IQueryable型別。

3、對於涉及到多張表需要連表的查詢機制,我們還是通過神奇的Linq來解決。例如我們有一個通過角色取角色對應的選單的介面需求。

在選單的倉儲介面裡面:

對應倉儲實現:

這裡也是返回的IQueryable介面的集合,千萬不要小看IQueryable介面,它是一種表示式樹,可以延遲查詢。也就是說,在我們執行GetMenusByRole()之後,得到的是一個帶有查詢sql語句的表示式樹結構,並沒有去資料庫執行查詢,只有在我們ToList()的時候才會去查詢資料庫。我們來寫個Demo測試下。

來看執行過程:

當程式執行var lstMenu = oProgram.menuRepository.GetMenusByRole(new TB_ROLE() { ROLE_ID = “aaaa” })這一步的時候基本是不耗時的,因為這一步僅僅是在構造表示式樹,只有在.ToList()的時候才會有查詢等待。

在dax.net的系列文章中,提到了規約模式的概念,用於解決條件查詢的問題。博主感覺這個東西設計確實牛叉,但實用性不太強,一般中小型的專案也用不上。

DDD領域驅動設計初探系列文章:

相關文章