管理聚合实体 (DDD)

Manage Aggregates entities (DDD)

在我的项目草稿中,我想知道 DDD 聚合根及其实体。 假设我的聚合是 Ticket 模型,它包含其回复的实体。我应该如何管理我的回复?每个示例都表明我应该像这样直接从聚合管理回复:

$ticket->updateReply(...);

但我真正想做的是:

$ticket->getReply(id)->update(...)

或更多:

$ticket->getReplies()->get(id)->update(...)

我的聚合 Api 不仅仅是可读的,但逻辑在聚合之外看起来很少。我的想法错了吗?或者它真的很糟糕?

$ticket->updateReply(id, ...);

如何检索和更新实际回复隐藏在工单抽象之后;这意味着,除其他事项外,如果您想要更改实现回复结构的方式,则只需更改一个地方的代码(在 Ticket 的实现中)。其他一切都只与 API.

对话
$ticket->getReplies()->get(id)->update(...)

这是一个经典的反模式;消费者需要更多地了解 Ticket,而不是更少,因此改变 Ticket 的实现更难而不是更容易。

此外,因为您允许消费者直接更新回复,所以您阻止了 Ticket 保护回复结构;任何 validation/consistency 检查现在都需要由每个消费者执行,而不是一次性执行。

作为设计考虑:您想要通过 Ticket 获取回复这一事实可能试图告诉您 Reply 应该是独立于 Ticket 的聚合。 Reply 实体和 Ticket 实体具有连接它们的关系这一事实并不意味着它们必须是同一聚合的一部分。