聊聊event-sourcing-cqrs的model

本文主要研究一下event-sourcing-cqrs的model

聊聊event-sourcing-cqrs的model

Event

public abstract class Event {  private final UUID aggregateId;  private final ZonedDateTime timestamp;  private final int version;  protected Event(UUID aggregateId, ZonedDateTime timestamp, int version) {    this。aggregateId = checkNotNull(aggregateId);    this。timestamp = checkNotNull(timestamp);    this。version = version;  }  public UUID getAggregateId() {    return aggregateId;  }  public ZonedDateTime getTimestamp() {    return this。timestamp;  }  public int getVersion() {    return version;  }}

Event定義了aggregateId、timestamp、version屬性

EventStore

public interface EventStore {  void store(UUID aggregateId, List newEvents, int baseVersion)      throws OptimisticLockingException;  List load(UUID aggregateId);}

EventStore介面定義了store、load方法

Aggregate

public abstract class Aggregate {  private UUID id;  private int baseVersion;  private List newEvents;  protected Aggregate(UUID id) {    this(id, emptyList());  }  protected Aggregate(UUID id, List eventStream) {    checkNotNull(id);    checkNotNull(eventStream);    this。id = id;    eventStream。forEach(e -> {      apply(e);      this。baseVersion = e。getVersion();    });    this。newEvents = new ArrayList<>();  }  protected void applyNewEvent(Event event) {    checkArgument(event。getVersion() == getNextVersion(),        “New event version ‘%s’ does not match expected next version ‘%s’”,        event。getVersion(), getNextVersion());    apply(event);    newEvents。add(event);  }  private void apply(Event event) {    try {      Method method = this。getClass()。getDeclaredMethod(“apply”, event。getClass());      method。setAccessible(true);      method。invoke(this, event);    } catch (InvocationTargetException e) {      Throwables。propagate(e。getCause());    } catch (NoSuchMethodException | IllegalAccessException e) {      throw new UnsupportedOperationException(          format(“Aggregate ‘%s’ doesn‘t apply event type ’%s‘”, this。getClass(), event。getClass()),          e);    }  }  public UUID getId() {    return id;  }  public int getBaseVersion() {    return baseVersion;  }  public List getNewEvents() {    return ImmutableList。copyOf(newEvents);  }  protected int getNextVersion() {    return baseVersion + newEvents。size() + 1;  }}

Aggregate定義了id、baseVersion、newEvents屬性;其applyNewEvent方法會執行apply(event)及newEvents。add(event);apply方法透過反射執行event的apply方法

ValueObject

public abstract class ValueObject {  @Override  public boolean equals(Object o) {    return EqualsBuilder。reflectionEquals(this, o);  }  @Override  public int hashCode() {    return HashCodeBuilder。reflectionHashCode(this);  }  @Override  public String toString() {    return ToStringBuilder。reflectionToString(this, ToStringStyle。SHORT_PREFIX_STYLE);  }}

ValueObject覆蓋了equals、hashCode、toString方法

Specification

public interface Specification {  boolean isSatisfiedBy(T value);}

Specification介面定義了isSatisfiedBy方法

小結

event-sourcing-cqrs-examples的model定義了Event、Aggregate、ValueObject抽象類以及EventStore、Specification介面。

doc

event-sourcing-cqrs-examples