【问题标题】:REST new ID with DDD Aggregate使用 DDD 聚合的 REST 新 ID
【发布时间】:2020-08-10 06:11:25
【问题描述】:

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

我正在设计 Rest API 来配置服务器实例,我想出了一个名为 Instance 的聚合,其中包含一个 Configurations 列表,在给定时间只有一个特定配置处于活动状态。

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

我计划只有一个控制器 InstanceController,它会调用 InstanceService 来操作实例聚合然后存储到存储库。

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

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

在这种情况下,一般方法是什么?

【问题讨论】:

    标签: rest architecture aggregate domain-driven-design ddd-repositories


    【解决方案1】:

    ID 由存储库生成

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

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

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

    【讨论】:

    • 在不需要存储库的情况下使用/引用新创建的实体的可能性似乎是架构的一个非常好的方面。我会等待其他答案,但到目前为止,还没有考虑到这一点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-10
    • 1970-01-01
    • 1970-01-01
    • 2015-12-01
    • 1970-01-01
    • 2017-05-25
    • 2016-03-21
    相关资源
    最近更新 更多