小编zug*_*ugo的帖子

如何正确处理事件采购中的聚合关系?

当具有某种"复杂"的域模型时,拥有相关实体是不可避免的(这是聚合根的意义).但是我应该如何从事件中重建关系呢?在序列化事件中搜索其他聚合ID显然不是一种选择.

我有一个想法,使用这样的数据库结构(例如).它只聚合具有id和外键的表,以简化从不同实体检索所有必要事件的过程.这不违反ES原则吗?

在此输入图像描述

architecture rdbms domain-driven-design cqrs event-sourcing

4
推荐指数
1
解决办法
2026
查看次数

如何处理DDD + CQRS +事件采购方法中的业务规则?

我试图找出如何使用CQRS/ES方法处理复杂域模型.让我们假设我们有例如Order域实体,它处理订单的状态和行为.它有一个Status属性,带有用于在状态之间切换的转换规则(实现状态模式或任何其他类型的状态机).据DDD原理,该逻辑应在Order类(表示订单模型)来实现本身,具有类似的方法approve(),cancel(),ship()等.

看看这种体系结构的不同 公共 示例,结果表明域实体和聚合根是相同的,它处理状态和行为,甚至是自己对事件的预测.这不违反SRP吗?

但我的问题更具体:如果我想处理新命令(并应用新事件),我应该从事件流(即从写模型和写入数据库)重建实体并调用其行为方法(将事件应用于状态)处理业务规则?或者只是处理命令和事件本身,而没有任何写模型实体?

伪代码说明:

class ApproveOrderHandler
{
    private EventStore eventStore

    // ...

    public void handle(ApproveOrder event)
    {
        Order order = this.eventStore.findById(event.getOrderId()); // getting order projection from event store
        order.approve(); // handling business logic
        this.eventStore.save(order.releaseEvents()); // save new events (OrderApproved)
    }
}

class Order extends AbstractAggregate
{
    private Uuid id;

    private DateTime takenAt;

    private OrderStatus status;

    // ...

    public void approve()
    {
        this.status.approve(); // business rules blah blah
        this.Apply(new …
Run Code Online (Sandbox Code Playgroud)

architecture domain-driven-design business-rules cqrs event-sourcing

2
推荐指数
1
解决办法
1002
查看次数