如果您需要在頁面上生成只讀數據列表,並且該數據自然來自多個,可能包含5個或更多不同的儲存庫?在DDD中,您如何使用多個存儲庫進行只讀列表
我們使用的是DDD,並且通過存儲庫強制訪問我們的數據庫,但是出現了一種似乎不適合DDD的情況,我們試圖決定使用最佳模式。
例如,假設您有一個基於社區的網站,包括視頻,論壇,博客等。您有一個包含評論列表的論壇頁面。這很粗糙,但我希望它是有道理的。
<table>
<tr><td>User Name (with possible link)</td><td>User's community score.</td><td>User Avatar</td><td>User's E-mail</td><td>User's blog</td><td>User's videos</td></tr>
</table>
<table>
<tr><td>This is a comment.</td></tr>
</table>
所以每個註釋包含幾個不同的部分組成:一個用戶名,社區得分,化身,電子郵件,用戶的博客和用戶的視頻頁面。傳統上,這些信息都來自不同的存儲庫。
問題在於效率。存儲庫可以被最大化,但只能圍繞它們創建的集合。在您需要訪問位於多個存儲庫中的數據時,使用存儲庫對於讀取訪問而言效率低下。
我的解決方案是創建一個UserInformation DTO的有關信息,並放置方法在UserForumsRepository與簽名
ILIst<UserInformation> GetUserForumsUserInformationByForumPostID(int forumPostID).
我的一位同事認爲,以這種方式使用DTO打破設計模式我們一直在使用並建議更好的方法是獲取論壇評論ID列表,然後將這些ID傳遞到各個存儲庫以返回結果。
我個人認爲,存儲庫的主要目的是封裝對CRUD的CUD部分很重要的業務邏輯,但應該以最有意義的方式生成只讀列表。如果合適的話,我認爲從存儲庫中完全刪除只讀列表方法(例如,在用於多個不同類型頁面的常用窗口小部件中)是有意義的。
你如何處理這種情況?
一個行爲較少的域模型是一個稱爲貧血域模型的反模式。我們使用dto來解決您遇到的問題。一個或多個存儲庫被組合起來,將多個實體映射到一個扁平dto,然後發送給客戶端。如果您將您的實體發送給客戶端,那麼您就會冒着域模型以不一致的方式進行狀態變異的風險。 – 2010-05-02 12:26:39
您是在服務層還是在存儲庫層中執行此操作? – John 2010-05-03 16:20:50