2017-05-17 47 views
0

我正在嘗試使用DDD模式,並且作爲持久存儲我正在考慮使用像LiteDB,RavenDB或DocumentDB這樣的NoSQL數據庫。DDD NoSQL存儲和域模型與視圖模型

的優點之一對我來說,在關係數據庫,將是我的域模型(全聚集)可以序列化爲JSON文件,並存儲在一個數據庫避免域模型到數據模型的映射。

但是,爲了在屏幕上顯示數據而讀取數據呢?我的UI基於視圖模型顯示視圖,但是如何構建視圖?我是否通過查詢文檔數據庫?我的域模型,然後將其映射到查看模型?

我這樣問,因爲它通常提到「不要使用你的域模型進行查詢(讀取模型)」。

+1

在您的應用程序服務中使用存儲庫從NoSQL數據庫檢索聚合,然後使用一些不同的視圖模型將其傳遞到前端。如果您遇到像這樣的問題,也請考慮獲取有關CQRS的一些知識。 –

回答

1

的優點之一對我來說,在關係數據庫,將是我的域模型(全聚集)可以序列化爲JSON文件,並存儲在一個數據庫避免域模型到數據模型的映射。

是啊,這是很好的。

但是如何讀取數據以便在屏幕上顯示數據。我的UI基於視圖模型顯示視圖,但是如何構建視圖?我是否通過查詢文檔數據庫?我的域模型,然後將其映射到查看模型?

是的。有趣的問題是當時

您可以與請求同步執行該操作。

您可以與請求同步執行該操作,但會緩存結果,以便後續對相同視圖的查詢更快。

你可以做到這一點異步工作 - 利用後臺進程加載的觀點到緩存中,這樣所有的疑問都很快。

的基本思路是,每次寫更改文檔時,你發出信號的變化已經發生異步處理,然後將處理加載它需要更新緩存的視圖中的數據。

「緩存」可能是,例如,保存您最近組成的視圖模型的文檔存儲。

緩存的視圖也可以包括元數據,允許在要求的時間,以確定是否需要重建的觀點。當考慮緩存元數據時,RFC 7234可能是一個很好的開始。

由於帕維爾指出,分離寫模式和讀模式是的大主題。有很多可用的文獻很安靜。我建議從Martin Fowler's overview開始。

+0

我的項目很小,沒有後端,一切都在本地運行,但我仍想嘗試在某些部分上應用DDD。我覺得像CQRS和異步寫/讀會是一個矯枉過正。我寧願在應用服務中構建我的虛擬機,就像Paweł提到的那樣。目前我唯一的擔心是如果我有一個聚合的幾個屬性和子集合,但我想檢索一些屬性以便在列表中顯示這些數據,我該怎麼做? ... >> –

+0

... >>獲取整個聚合,然後建立一個虛擬機只有2個屬性是完全浪費。我覺得我應該總是寫兩個版本的文件,一個用於細節,另一個用於清單。 –

1

重要的是要了解您的域模型包含行爲和狀態。你需要堅持的唯一的事情就是狀態。

當你意識到這一點時,你也會發現聚合狀態並不是可怕的運行你的查詢。但是你絕對不應該使用你的存儲庫來組成讀取/查看模型 - 簡單的查詢就足夠了。在這種情況下,將域對象狀態分離爲簡單的DTO(文檔)會很方便,您將存儲在數據庫中,並將它們作爲屬性保存在域對象中。這與書中顯示的有點不同,但實際上效果很好。如果封裝足夠好並且不會編寫序列化和持久性測試,您至少不用擔心。 This article提到的域對象支持狀態對象部分。