【问题标题】:Domain Driven Design: "If E exists do A, otherwise do B" logic belongs to application service or domain service?领域驱动设计:“如果 E 存在,做 A,否则做 B”逻辑属于应用服务还是领域服务?
【发布时间】:2024-01-23 21:07:01
【问题描述】:

假设我想根据特定实体是否存在采取不同的操作,例如:

item := itemRepository.Find(id)
if item != nil {
    item.Description = newItem.Description
    ...  // More actions
    itemRepository.Save(item)
} else {
    ...  // More actions
    itemRepository.Save(newItem)
}

我认为这段代码应该属于应用程序服务或域服务,但无法真正确定哪个是正确的。请问有什么建议吗?

【问题讨论】:

  • 这不就是createOrUpdate(newItem)的逻辑吗?在这种情况下,它将由存储库 IMO 处理,并且大多数 ORM 会免费这样做。

标签: domain-driven-design


【解决方案1】:

真的没有。依赖于领域状态的逻辑属于领域模型。

item = items.Find(id)
item.doTheCleverThing(newItem)
items.Save(item)

您在此处拥有的分支逻辑属于存储库。

Find (Id id) {
    state = database.Fetch(id)
    if (null == state) {
        return factory.defaultItemWithId(id)
    } else {
        return factory.item(state)
    }
}

免责声明:这在阅读 Evans 的原文时显而易见。他关于生命周期的章节确实没有很好地解释创建模式,而且他对存储库的描述非常单薄。

【讨论】:

    最近更新 更多