Агрегат будет создан некоторым 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;
}
Это AbstractDomainEvent
и DomainEvent
@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));
Иногда это терпит неудачу, а иногда и успешно.