如何处理使用DDD更新实体(CRUD)和域名事件?

问题描述:

我知道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调用?

我应该如何以正确的方式使用更新操作?

通常的答案是域事件不是要修改的对象的一部分,而是在单独的数据结构中描述修改。

由于贫血模型,我期望调用者负责事件。这可能是而不是框架如果框架只是自动映射DTO字段的任务。您希望在能够理解编辑业务上下文的代码中定义事件。换句话说,您可能需要TaskRescheduled而不是TaskUpdated

在初稿中,您可以在知道保存成功的时候发布事件。

更强大的是保存任务列表的事件。这给了你更好的故事围绕可靠的消息传递 - 请参阅Udi Dahan Reliable Messaging Without Distributed Transactions,以更好地了解这种情况。

对于非贫血的域模型,您确实可以在任务更新中定义事件(数据模型中的事件仍将与任务的状态分开)。 “

+0

”对于非贫血的领域模型,您确实可以在任务更新“ ”中定义事件,非贫血模型的代码是什么?我的意思是如何在同一时间更新几个领域,以及这是否是一个好主意? –