0

聚合将由 some 创建application service,而不是由另一个聚合。

像这样

SomeAggregate aggregate = new SomeAggregate();
repo.save(aggregate);

期望在应用程序服务结束时aggregate保存并SomeAggregateCreated发布一个事件。我测试过,并不总是有效,有时构造函数执行后没有立即注册事件。

这是教师课:

public class Teacher extends AbstractAggregateRoot<Teacher> {

    public Teacher() {
        registerEvent(new TeacherAdded(id, name));
    }
}

这是TeacherAdded

@AllArgsConstructor
@Getter
@ToString
@EqualsAndHashCode(callSuper = true)
public class TeacherAdded extends AbstractDomainEvent {
    private TeacherId teacherId;    
    private String name;
}

这是AbstractDomainEventDomainEvent

@Getter
@ToString()
@EqualsAndHashCode()
public abstract class AbstractDomainEvent implements DomainEvent {
    protected Date occurredOn;

    public AbstractDomainEvent() {
        this(new Date());
    }

    public AbstractDomainEvent(Date occurredOn) {
        this.occurredOn = occurredOn != null ? occurredOn : new Date();
    }

    @Override
    public Date occurredOn() {
        return occurredOn;
    }    
}

public interface DomainEvent {
    public Date occurredOn();
}

AbstractAggregateRoot复制自,org.springframework.data.domain.AbstractAggregateRoot<A>hasCapturedEvent添加方法进行测试。

public boolean hasCapturedEvent(DomainEvent event) {
    return domainEvents.contains(event);
}

如果我运行这个:

// ...
TeacherAdded teacherAdded = new TeacherAdded(teacherId, teacherName);
Teacher teacher = new Teacher();
assertTrue(teacher.hasCapturedEvent(teacherAdded)); 

它有时会失败,有时会成功。

4

1 回答 1

0

答案是yes。构造函数注册的领域事件可以正常发布和监听。它们与通常方法注册的事件相同。

我在问题描述中提供的测试有缺陷。修改AbstractDomainEvent.hasCapturedEvent及其相关代码后,测试可以通过。

这是新AbstractDomainEvent.hasCapturedEvent的测试方法。

    public boolean hasCapturedEvent(DomainEvent event, long occurredOnAdjustment) {
        if (occurredOnAdjustment <= 0) {
            return this.domainEvents.contains(event);
        } else {
            return this.domainEvents.stream().anyMatch(eventOnStream -> {
                return eventOnStream.equalsExcludedOccurTime(event)
                    && System.currentTimeMillis() - eventOnStream.occurredOn().getTime() <= occurredOnAdjustment;
            });
        }
    }

        TeacherAdded teacherAdded = new TeacherAdded(teacherId, teacherName);
        Teacher teacher = new Teacher();
        assertTrue(teacher.hasCapturedEvent(teacherAdded, 1000L)); 

这是新的TeacherAdded

public interface DomainEvent {
    public Date occurredOn();

    public default boolean equalsExcludedOccurTime(DomainEvent other) {
        return false;
    }
}

@lombok...
public class TeacherAdded extends AbstractDomainEvent {
    private TeacherId teacherId;    
    private String name;

    @Override
    public boolean equalsExcludedOccurTime(DomainEvent other) {
        if (!(other instanceof TeacherAdded)) {
            return false;
        } else {
            TeacherAdded other2 = (TeacherAdded)other;
            return Objects.equals(teacherId, other2.teacherId)
                && Objects.equals(name, other2.name);
        }
    }
}
于 2018-09-28T09:18:20.350 回答