0

我知道DDD在基於任務的用戶界面方面很好,但我正在重構遺留應用程序,我在那裏有貧血域模型(許多設置者沒有業務邏輯)。如何處理使用DDD更新實體(CRUD)和域名事件?

其中一個步驟是使其到達模型並添加域事件。在添加事件創建(TaskCreated在構造函數中)和刪除(TaskRemoved)模型是一個簡單的過程,我正在努力與更新模型。

我們有一個RESTful API和PUT /tasks/{id}端點。引擎蓋下框架映射響應DTO對象的身體,然後調用制定者一個接一個:

task.setText('new text'); 
task.setStartDate(newStartDate); 
// and so on 

我要當任務被更新,以聽取一些事件,並在例如更新Google日曆。 正如你可以成像,如果我在每個setter(TextChanged,StartDateChanged)中記錄事件並監聽所有這些事件,我將最終得到很多API調用Google API,這不是我想要的。

問題是:我應該如何以正確的方式使用更新操作?我是否應該將所有setters呼叫替換爲一個update(newData)呼叫並僅派遣一個域事件?如何只做一個任務更新後調用谷歌日曆的API調用?

回答

0

我應該如何以正確的方式使用更新操作?

通常的答案是域事件不是要修改的對象的一部分,而是在單獨的數據結構中描述修改。

由於貧血模型,我期望調用者負責事件。這可能是而不是框架如果框架只是自動映射DTO字段的任務。您希望在能夠理解編輯業務上下文的代碼中定義事件。換句話說,您可能需要TaskRescheduled而不是TaskUpdated

在初稿中,您可以在知道保存成功的時候發佈事件。

更強大的是保存任務列表的事件。這給了你更好的故事圍繞可靠的消息傳遞 - 請參閱Udi Dahan Reliable Messaging Without Distributed Transactions,以更好地瞭解這種情況。

對於非貧血的域模型,您確實可以在任務更新中定義事件(數據模型中的事件仍將與任務的狀態分開)。 「

+0

」對於非貧血的領域模型,您確實可以在任務更新「 」中定義事件,非貧血模型的代碼是什麼?我的意思是如何在同一時間更新幾個領域,以及這是否是一個好主意? –