java - 需要存储另一个领域模型的领域模型

标签 java domain-driven-design ddd-repositories

假设我有以下简单的域模型设置:

class Event { ... }

class PlannedEvent { Event event; DateTime date; .. }

我想尽可能描述性地计划 Activity ,我会把它写成

class Event {   

    public void plan(DateTime date) {
        // Can I create and Store a PlannedEvent here ?
        // in other words access a Repository
    }  

我添加了计划方法,因为在通用语言中,您计划一个事件,这会导致 future 某个地方发生计划事件。所以将 plan 方法放在 Event 类中感觉很自然。

我一直读到,你不能在域对象中使用存储库,我可以理解为什么,但是我该如何解决上述问题呢?

这就是领域事件发挥作用的地方吗?

class Event {   

    public void plan(DateTime date) {
        DomainEventPublisher
            .instance()
            .publish(new PlannedEventCreated(this, date)));
    }  

领域事件将在哪里确保创建并存储 PlannedEvent(通过存储库)?

最佳答案

是否可以认为Event和PlannedEvent都是聚合根?我怀疑 Event 应该知道有关 PlannedEvent 的任何信息,当然不知道如何构造一个事件 - 这超出了它的范围。埃文斯谈到工厂时说道:

When creation of an object, or an entire AGGREGATE becomes complicated or reveals too much of the internal structure, FACTORIES provide encapsulation.

也许您使用聚合工厂来为事件构建 PlannedEvent。为了将两者解耦,我更愿意通过 PlannedEvent 中的某个唯一事件 ID 来引用事件,而不是直接对象引用。您可以使用此 ID 通过其存储库查找事件。

关于java - 需要存储另一个领域模型的领域模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23265835/

相关文章:

java - Android 原生应用程序源代码

grails - 如何在 Grails 中拆分域逻辑和数据访问

TDD 演示/指南/视频,包括假存储库或域模型

domain-driven-design - DDD 领域实体与持久化实体

java - Spliterator 中 estimatedSize 和 getExactSizeIfKnown 的区别

java - Wicket 中的 ResourceReferences 是什么,它们是如何工作的?

java - 如何使用 JavaFX 在直线末端绘制箭头

repository - DDD : Repository to read and Unit Of Work to write?

验证和 DDD - kotlin 数据类

java - DDD - 复杂的 ORM 映射