0

我有一大組數據偶爾會在後臺更新。作爲一個自我教學實驗,我不希望依賴任何框架。現在我正試圖在DDD/CQRS上下文中找到MVC/MVVC模式的正確位置。將大型且動態變化的數據集加載到表中

爲了填充表格我做了一個大型數據集的查詢,並將結果限制爲顯示行數的兩倍。一旦用戶滾動查詢的一半,我查詢下一批結果。

當用戶滾動時,我將所有結果加載到數組中,只是逐漸加載而不會丟棄未顯示的行。

誰負責構建轉換爲域對象的結果數組? MVC模型還是數據倉庫?

理想情況下,我想重用我的MVC模型,而不總是在擔心限制查詢結果。

如果數據在後臺更新,則會創建系統事件。但是,在創建新行的情況下,我希望我的應用程序爲新行的背景插入設置動畫,而不僅僅放棄查詢並重新加載表。在這種情況下,我想後臺進程必須加載當前查詢的一個副本,並將其與現有查詢進行比較。它應該用新行的位置創建一個「新行系統事件」。

哪個組件應該將當前查詢結果與前一個查詢結果進行比較以計算插入點和刪除點?系統服務? MVC模型?

我的最終關注的是,上載一組與多個有限查詢行的數據是否在後臺更新,可能是不一致的。如何/應在哪裏執行此一致性?

+1

顯示的數據在某種程度上始終是陳舊的。爲什麼不讓用戶刷新或使系統定期執行。 – Hippoom

+0

考慮到CQRS體系結構,如果用戶請求新行,則該命令和查詢是異步事件。我認爲,在這種情況下,如果你想盡快將新的空行渲染,它只能是制度,而不是用戶,誰決定何時基於當數據庫更新重新加載查詢,而不是當用戶單擊新行的按鈕。 – SystematicFrank

+0

我認爲客戶端負責檢測數據變化(通過定期掃描),否則服務器需要廣播一個dataUpdatedEvent(我認爲這是浪費網絡)或者保留一份客戶備忘錄來決定哪個客戶端對更新感興趣我認爲這增加了很多複雜性)。嗯...如何在StackOverflow上實現註釋通知功能? – Hippoom

回答

1

CQRS和DDD =一個域模型和至少一個查詢模型。現在,爲了您自己的利益,不要將DDD視爲具有許多違反規則的事情,這些規則會使您成爲DDD公共敵人no1。

讓我們考慮了一下:一旦一個域對象被更新和域事件發佈後,你就會有一個事件處理程序將更新查詢模型。哪一種查詢模型正是您需要的用戶界面(視圖模型)。

客戶端UI應該間隔地請求更新(傳遞當前模型日期時間戳)。哪些更新也是查詢模型的一部分。爲了檢測發生了什麼變化,更新應該有一個日期時間標記,它將與當前顯示的標記進行比較。如果它是一個Web應用程序,那麼我強烈建議使用js框架,如angularjs.org

現在,此場景中的MVC模型是查詢存儲庫。當插入/編輯一行時,模型將是一個將更新域的服務(或命令處理程序)。與域更改和查詢模型生成相關的所有內容都在UI之外,作爲服務/應用程序(稱之爲任何您想要的)層的一部分。

+0

好!所以在MVC中,模型應該是應用程序和域之間的服務,對吧?我使用NoSQL數據庫,只要mapreduce函數被觸發,就會向我發送消息,因此我不需要請求更新。每當我的repos返回一系列根對象時,我都會返回一個自定義的Array類,它爲我提供了一些延遲加載。我現在想着用時間戳擴展這個類,甚至可以在我的回購庫中創建一個UID集......但這看起來不像我以前見過的東西。這太瘋狂了嗎?然後回購應該管理查詢的年齡:/ – SystematicFrank

+0

MVC模型表示UI可用的其他圖層的位。 MVC只存在於用戶界面中。無論使用哪個數據庫,UI都應該要求更新。此外,延遲加載(LL)的概念在此處或Repository模式中沒有地方。 LL是一種ORM解決方法,將其留在那裏。查詢回購應該返回無論用戶界面需要作爲DTO。查詢模型的更新在UI或db之外完成。數據庫只是堅持更改,但另一個組件管理過程。再一次,不要太擔心圖層如何被調用。我更喜歡把它稱爲服務,但這是我的意見只有 – MikeSW

+0

謝謝!我意識到我的評論後,我的CustomArray不應該有UID或時間戳,因爲只有某些模型需要。然而,你讓我想到「查詢回購任何UI需要作爲DTO返回」。在CQRS之前,我的回購僅返回了根實體(列表),但由於CQRS的查詢部分可以與域的實體分離,因此我添加了列表。哦,那是一個完全不同的問題,我必須回顧一下關於CQRS – SystematicFrank

相關問題