CQRS中命令可以返回值嗎? -OSKAR
CQRS中通常建議命令的處理要"乾淨",實際上將其視為“無效函式void”。這種函式不返回任何業務結果,但可以返回操作狀態或所需的後設資料。
在CQRS中,命令和查詢的隔離基於操作行為。查詢返回資料,並且不更改應用程式的狀態;命令修改狀態。這種隔離有助於建立鬆散耦合的元件,不斷髮展的解決方案,並透過專注於特定任務,可伸縮性等來減輕程式設計師的認知負擔。
是否有一種用例可以證明從命令處理中返回值是合理的?當然,我們不應該返回任何資訊,因為客戶端已經知道了他發出的命令。客戶端不知道的是在伺服器端生成/計算的資料。通常,它這些資料是後設資料,例如修改日期,版本,有時還包括業務資料(例如新記錄狀態)。
我們可以返回更新期間的物件識別符號ID,然後,我們可以執行查詢命令來獲取更新後的資料後,也就是查詢需要的讀取模型資料。新物件的建立很複雜,除非我們返回客戶端生成的識別符號ID,否則客戶端就不會知道建立了哪個記錄。
CQRS與API
我們必須記住,我們可以從兩個角度看待我們的應用程式:
- 邏輯-顯示我們如何劃分和組織業務程式碼。
- 技術-描述如何組織特定的實施方式,例如儲存結構,部署等。
CQRS代表邏輯檢視,API代表技術檢視。它們不必相同,我們可能需要將一個概念對映到另一個概念。如果我們正在使用REST API,則在處理了建立新記錄的命令之後,我們想返回帶有識別符號的201狀態。如果錯誤是由業務邏輯引發/返回的,我們希望獲得特定的HTTP錯誤型別。
我們必須做出務實的決定。我認為,CQRS命令返回ID或狀態或與我們觸發的行為相關的任何其他所需的後設資料都是可以的。當然,我們應該小心謹慎,並始終確保需要這種妥協。如果我們濫用它,那麼CQRS的關鍵要素-隔離充其量將是紙面上的契約。
這不僅會影響程式碼的純度和耦合性,還會影響效能和可伸縮性。讀取模型可以由不同的節點,儲存引擎,負載均衡等處理。
我們必須記住,命令本身並沒有告訴我們它進行了哪些具體更改。它沒有定義將新增,更新還是刪除記錄。而且,它還不能確定更改是否會影響哪一條記錄或更多其他記錄。即使是單個更改,也可能涉及重新整理幾個讀取的模型(例如,確認訂單會更新使用者的訂單列表,賣方管理皮膚,通知檢視,訂單歷史記錄等)。所有這些都是由處理命令的業務邏輯定義的,而不是由命令本身定義的。命令代表意圖,而不是其處理方式及其產生的影響。
如何使用REST處理CQRS?通常,我嘗試將WebAPI合同與命令和查詢定義分開。我將WebAPI視為反腐敗層。在控制器方法中,我可以生成一個識別符號並基於該識別符號建立命令。然後,可以將相同的識別符號返回到“建立”狀態。
相關文章
- 命令和事件有什麼區別? - Oskar事件
- 命令查詢職責分離 - CQRS
- CQRS時是否使用儲存庫模式嗎?模式
- DDD 中的那些模式 — CQRS模式
- Linux的中斷可以巢狀嗎?Linux巢狀
- JAVA中的註解可以繼承嗎?Java繼承
- 子執行緒中建立Handler可以嗎?(上)執行緒
- Java中可以宣告一個類為Static嗎?Java
- DCI中的Context可以理解為“用例”嗎?Context
- 可以在applet中執行MS Word嗎?APP
- C語言呼叫System命令並獲取命令的返回值C語言
- 伺服器中的pagefile.sys可以刪除嗎伺服器
- 沒學歷可以學IT嗎?
- jvm 可以限制cpu嗎JVM
- temp是什麼資料夾可以刪除嗎 電腦c盤中temp檔案可以清空刪除嗎
- Java可以自學嗎?自學能學好嗎?Java
- kakafka - 為CQRS而生fka - 為CQRS而生Kafka
- Laravel-admin 展開列中可以增加行操作嗎Laravel
- [轉載] .NET 中可以有類似 JVM 的幻像引用嗎?JVM
- Linux中哪個命令可以檢視所有檔案?Linux
- sublime可以寫python嗎Python
- 自學linux可以成功嗎Linux
- oracle檢視可以update嗎Oracle
- threejs可以做遊戲嗎JS遊戲
- CQRS+ES專案解析01-Diary.CQRS
- 關於投標保證金,招標檔案中可以不要求嗎?有硬性規定嗎
- 業務和IT分離的時代已經過去! - OSKAR
- 業務和IT分離的時代已經過去? - OSKAR
- php exec 執行java命令時無任何返回值PHPJava
- users是什麼資料夾可以刪除嗎 可以複製到D盤嗎
- 學習Python需要培訓嗎?可以自學嗎?Python
- https 真的安全嗎,可以抓包嗎,如何防止抓包嗎HTTP
- C中方法的返回值可以是多個(Android之JNI)Android
- cqrs模式下ddd中的domain service如何實現模式AI
- Go中多個返回值的技巧Go
- 多型中的返回值型別多型型別
- 學校可以變得敏捷嗎?敏捷
- python可以開發遊戲嗎Python開發遊戲