基于DDD时间的状态转换

时间:2014-05-29 15:40:40

标签: time domain-driven-design state stateful temporal

我有一个带有" startTime"的聚合根。价值对象。在不同的点上,我需要确定AR是否已经开始"强制执行不同的行为(在AR的内部和外部)。我还需要能够通过"启动"来过滤存储层的聚合根。因性能原因而说。

我不确定如何以DDD友好的方式实现这一点。我已经考虑将状态更改暴露给外部源(预定的事件处理程序)并明确定义状态:

public class AggregateRoot {
    private Time startTime;
    private boolean started;
    ...
    public void start() {
        started = true;
    }
    public boolean isStarted() {
        return started;
    }
}

这样做的好处是可以在存储层轻松查询,但看起来很奇怪,因为startTime值对象变得冗余,并且域中没有任何内容可以强制AR在定义的startTime处切换状态。

我还考虑过根据" now"的比较隐式定义状态。与" startTime" (无论是在AR构造还是在吸气剂上,例如在吸气剂上)。这意味着AR完全控制其自身的状态等,但意味着我无法按状态过滤存储层的查询,而不会重复此逻辑(对可维护性不利):

public class AggregateRoot {
    private Time startTime;
    ...
    public boolean isStarted() {
        return now().isAfter(startTime);
    }
}

是否存在处理基于时间的状态变化的现有模式?有没有更好的方法来解决这个问题?

1 个答案:

答案 0 :(得分:1)

有趣。我对你的域名一无所知,但我想知道你的聚合在它开始之后的行为有多大不同?您是否有可能实际拥有两个不同的聚合,这些聚合依赖于相同的状态?它可以被提取出来 - 而不是把这种行为放在聚合本身中 - 我敢于暗示 - 工厂吗?

public class MyAggregateBeforeItHasStarted : IMyTemporalAggregate
{
    public MyAggregateBeforeItHasStarted(State state) { }
}

public class MyAggregateAfterItHasStarted : IMyTemporalAggregate
{
    public MyAggregateAfterItHasStarted(State state) { }
}

public class MyTemporalAggregateFactory 
{
    public IMyTemporalAggregate(StartTime startTime) 
    {
        if (startTime.LaterThan(x)) 
            return new MyAggregateAfterItHasStarted(state);

        return new MyAggregateBeforeItHasStarted(state);
    }
}