если у вас есть архитектура Event Sourcing, это означает, что вы уже храните свое событие в хранилище событий «только для добавления». С точки зрения архитектуры вам необходимо десериализовать события и повторно применить их (в проекции памяти), чтобы восстановить состояние вашего агрегата.
Интерфейс EventStore будет выглядеть примерно так:
public interface EventStore {
public void appendWith(EventStreamId aStartingIdentity, List<DomainEvent> anEvents);
public void close();
public EventStream eventStreamSince(EventStreamId anIdentity);
public EventStream fullEventStreamFor(EventStreamId anIdentity);
}
Затем в своем хранилище вы передаете весь поток событий в агрегат, который будет отвечать за применение проекции в памяти:
public class EventStoreForumRepository
extends EventStoreProvider
implements ForumRepository {
@Override
public Forum forumOfId(Tenant aTenant, ForumId aForumId) {
// snapshots not currently supported; always use version 1
EventStreamId eventId = new EventStreamId(aTenant.id(), aForumId.id());
EventStream eventStream = this.eventStore().eventStreamSince(eventId);
Forum forum = new Forum(eventStream.events(), eventStream.version());
return forum;
}
}
Тогда совокупная часть:
public abstract class EventSourcedRootEntity {
private List<DomainEvent> mutatingEvents;
private int unmutatedVersion;
public int mutatedVersion() {
return this.unmutatedVersion() + 1;
}
public List<DomainEvent> mutatingEvents() {
return this.mutatingEvents;
}
public int unmutatedVersion() {
return this.unmutatedVersion;
}
protected EventSourcedRootEntity(List<DomainEvent> anEventStream, int aStreamVersion) {
for (DomainEvent event : anEventStream) {
this.mutateWhen(event);
}
this.setUnmutatedVersion(aStreamVersion);
}
}
Ваш агрегат должен расширять EventSourcedRootEntity, а EventStore должен манипулировать mutatingEvents при сохранении (сохраняя только новые).
Образцы написаны на Java и взяты из репозитория Вона Вернона, автора книги «Реализация доменного дизайна (IDDD)».
https://github.com/VaughnVernon/IDDD_Samples