使用 DDD 聚合的 REST 新 ID

REST new ID with DDD Aggregate

这个问题对我来说乍一看似乎很愚蠢,但后来我意识到我还没有合适的答案,有趣的是在我的搜索中也没有找到很好的解释。 我是领域驱动设计概念的新手,所以,即使问题很基础,也可以随意添加任何注意事项。

我在 Rest API 中设计以配置服务器实例,我想出了一个名为 Instance 的聚合,其中包含 Configurations 的列表,只有一个特定的配置会在给定的时间保持活跃。

要添加配置,可以在所需配置上使用 body 调用端点 POST /instances/{id}/configurations。作为响应,如果一切正常,它将收到一个 HTTP 204,其中 Header 位置包含新的配置 ID。

我打算只有一个控制器,InstanceController,它将调用 InstanceService 来操作实例聚合,然后存储到 Repo。

由于 ID 是由存储库生成的,如果我调用 Instance.addConfiguration,然后调用 InstanceRepository.store,我将如何获得新创建的配置的 ID?我的意思是,这是一个列表,所以调用 Instance.configuration.identity

并不简单

一个选项会在实例中实现一个方法,比如getLastAddedConfiguration,但这看起来真的很脆弱。

在这种情况下一般的做法是什么?

the ID's are generated by the repository

您可以消除这种额外的复杂性。由于 ConfigurationInstance 聚合的一个实体,它的 Id 只需要在聚合内是唯一的,而不是在整个应用程序中。因此,最简单的就是Aggregate在Instance.addConfiguration方法中赋值ConfigurationId(因为aggregate很容易保证新的Id的唯一性)。此方法可以 return 新的 ConfigurationId (或者如果需要,可以使用 Id 的整个对象)。

What is the general approach in this situation?

我不确定一般方法,但在我看来,越早创建 ID 越好。对于聚合,您将在存储它之前创建它(可能是 GUID),对于实体,聚合可以在 creating/adding 实体的时刻创建它。这允许您使用这些 ID 执行其他操作(例如发布事件),而不必从数据库中存储和检索 ID,这必然会影响您实现和使用存储库的方式,这并不理想。