我有一个带有" 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);
}
}
是否存在处理基于时间的状态变化的现有模式?有没有更好的方法来解决这个问题?
答案 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);
}
}