2

最近,我正在重構我的DDD項目。當我看着我的存儲庫層。我發現它在我的存儲庫中返回IQueryable < T>。我感到困惑,我應該從我的DDD項目中的存儲庫中返回IQueryable < T> Repository Layer?我通常在我的Repository設計中返回IQueryable類型。但今天我發現了一個與此相反的想法article 我無法弄清楚!我應該從DDD庫中返回IQueryable <T>

+0

我應該在Repository Layer中返回什麼? – doublnt

+0

'IEnumerable'或'IReadOnlyList'似乎更合適。 – guillaume31

回答

4

如果您返回IQueryable您允許從域層泄漏到消費者層的域知識。它增加了您的域對象變得貧乏的風險,並且所有行爲都將移動到其他層。

雖然接縫非常方便返回IQueryable並且您認爲您的代碼變得更簡單,這只是一種幻覺;當項目將增長時,IQueryable將把你的代碼轉換成一大塊泥土,而域代碼分散在每個地方。您將無法優化您的存儲庫或更改與另一個存儲庫的持久性(即從sql到nosql)。

+0

Em,我應該在'Repository Layer'中返回什麼?我發現使用'Patten Patten'可能是一個好方法。 – doublnt

+0

我不明白爲什麼這個答案被接受。 – jannagy02

+0

@ jannagy02你不明白,更確切地說,是什麼? –

1

你可能不應該這樣做。

版本庫的工作不僅是抽象掉持久性細節,而且還提供了一個explicit query contract定義那些需要處理您的domain命令。

如果您覺得需要進一步過濾/轉換從存儲庫返回的內容,那麼很可能無法捕獲應該成爲存儲庫合同一部分的顯式查詢。

擁有這樣的合同可以讓查詢客戶表達他們的意圖並允許更輕鬆的優化。

1.現在,應用一些CQRS原理並將貝模模型完全用於查詢是非常常見的。鑑於這種情況,通過存儲庫的唯一查詢就是處理命令所需的查詢。然而,您不會以任何方式強制使用此方法,因此如果您願意,您的存儲庫也可以完成報告查詢。

相關問題