使用 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
您可以消除这种额外的复杂性。由于 Configuration
是 Instance
聚合的一个实体,它的 Id
只需要在聚合内是唯一的,而不是在整个应用程序中。因此,最简单的就是Aggregate在Instance.addConfiguration
方法中赋值ConfigurationId
(因为aggregate很容易保证新的Id
的唯一性)。此方法可以 return 新的 ConfigurationId
(或者如果需要,可以使用 Id 的整个对象)。
What is the general approach in this situation?
我不确定一般方法,但在我看来,越早创建 ID 越好。对于聚合,您将在存储它之前创建它(可能是 GUID),对于实体,聚合可以在 creating/adding 实体的时刻创建它。这允许您使用这些 ID 执行其他操作(例如发布事件),而不必从数据库中存储和检索 ID,这必然会影响您实现和使用存储库的方式,这并不理想。
这个问题对我来说乍一看似乎很愚蠢,但后来我意识到我还没有合适的答案,有趣的是在我的搜索中也没有找到很好的解释。 我是领域驱动设计概念的新手,所以,即使问题很基础,也可以随意添加任何注意事项。
我在 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
您可以消除这种额外的复杂性。由于 Configuration
是 Instance
聚合的一个实体,它的 Id
只需要在聚合内是唯一的,而不是在整个应用程序中。因此,最简单的就是Aggregate在Instance.addConfiguration
方法中赋值ConfigurationId
(因为aggregate很容易保证新的Id
的唯一性)。此方法可以 return 新的 ConfigurationId
(或者如果需要,可以使用 Id 的整个对象)。
What is the general approach in this situation?
我不确定一般方法,但在我看来,越早创建 ID 越好。对于聚合,您将在存储它之前创建它(可能是 GUID),对于实体,聚合可以在 creating/adding 实体的时刻创建它。这允许您使用这些 ID 执行其他操作(例如发布事件),而不必从数据库中存储和检索 ID,这必然会影响您实现和使用存储库的方式,这并不理想。