18

示例:您的數據庫具有名爲「CustomerOrdersOnHold」的SQL視圖。該視圖返回特定客戶和訂單數據字段的過濾組合。您需要在應用程序中從此視圖獲取數據。如何訪問這種視圖適合存儲庫模式?你會創建一個「CustomerOrdersOnHoldRepository」嗎?像這樣的只讀視圖被視爲聚合根?只讀數據庫視圖如何適應存儲庫模式?

回答

24

我寧願分開讀庫,優選地甚至更名爲Finder或閱讀器,資料庫是指對於不用於查詢只讀數據的域用法,您可以參考this articlethis,它解釋了Finder分離表單存儲庫的用法。

我也建議讀模式的分離從寫模型架構CQRSthere

這種架構可以讓你即使在數據存儲和使用事件採購方面,從寫模型讀取模型分開。

因爲你可以利用一些CQRS概念,而不由剛剛從發現者分開儲存庫分離數據庫的複雜中間的解決方案,對於這種類型的解決方案的樣品閱讀本post

(使用同一個數據庫,但分離發現者表格存儲庫)檢查this sample

+0

我認爲這是最好的答案。這種類型的數據/對象與域無關,正如穆罕默德指出的那樣,術語庫與聚合/域/交易相關聯,所以使用這個術語可能會產生誤導。 CQRS旨在解決這個確切的問題。我回過頭問了一個類似的問題:http://stackoverflow.com/questions/2098112/ddd-how-to-implement-performant-repositories-for-searching –

+0

偉大的答案,由於偉大的聯繫。這幫助我從另一個更清晰的角度看待我的代碼。 –

+0

如果您有Finder,您如何命名「Saver」?庫?但是,然後存儲庫應該能夠訪問數據AKA「查詢」...如何解決這個問題? – JorgeeFG

0

我認爲可以擁有一個像「CustomerOrdersOnHoldRepository」這樣的獨立存儲庫。存儲庫的接口將反映對象是隻讀的(通過不定義Save/Add/MakePersistent方法)。

How to write a repository

...但還有另一種策略,我很喜歡:多 庫。在我們的訂購示例中,我們沒有理由可以擁有兩個存儲庫:AllOrders和SurchargedOrders。 AllOrders代表 包含系統中每一單的訂單,SurchargedOrders 代表它的一個子集。

我不會調用返回的對象一個Aggrgate根。聚合是爲了一致性,數據交換和生命週期。你的物體沒有任何這些。看起來它們也不能被歸類爲值對象('特徵或屬性')。他們只是獨立的課程。

+0

我傾向於給視圖自己的存儲庫,但是,這是我的理解是,存儲庫僅在聚合根上運行(http://thinkddd.com/glossary/aggregate-root/)。 –

+0

該規則是關於避免直接訪問聚合的內部部分。你沒有這些內部部件,就像你沒有任何不變式和生命週期一樣。可以從存儲庫返回這些對象。如果你喜歡,稱它們爲聚合根,但這可能有點誤導。 – Dmitry

0

您的只讀數據將被視爲DDD世界中的值對象。

我通常會將值對象的訪問方法放在現有存儲庫中,直到創建單獨的存儲庫時纔有意義。它類似於可能返回狀態的靜態列表是一個地址表上所使用的方法:

IAddressRepository 
{ 
    Address GetAddress(string addressID); 

    List<string> GetStates(string country); 
} 
+0

那麼在你的場景中,如果我有一個CustomerRepository或一個OrderRepository,我會添加一個方法到這些倉庫之一?即'ICustomerRepository.GetCustomerOrdersOnHold(args)'或'IOrderRepository.GetCustomerOrdersOnHold(args)'? –