Class AggregateRoot<ID,​EVENT_TYPE extends Event<ID>,​AGGREGATE_TYPE extends AggregateRoot<ID,​EVENT_TYPE,​AGGREGATE_TYPE>>

  • Type Parameters:
    ID - the aggregate id type
    EVENT_TYPE - the type of event
    AGGREGATE_TYPE - the aggregate self type (i.e. your concrete aggregate type)
    All Implemented Interfaces:
    Aggregate<ID,​AGGREGATE_TYPE>, StatefulAggregate<ID,​EVENT_TYPE,​AGGREGATE_TYPE>
    Direct Known Subclasses:
    AggregateRootWithState

    public abstract class AggregateRoot<ID,​EVENT_TYPE extends Event<ID>,​AGGREGATE_TYPE extends AggregateRoot<ID,​EVENT_TYPE,​AGGREGATE_TYPE>>
    extends Object
    implements StatefulAggregate<ID,​EVENT_TYPE,​AGGREGATE_TYPE>
    A specialized and opinionated mutable Aggregate design
    This AggregateRoot is designed to work with Class based Event's that inherit from Event.
    This design is deliberate and will manage a lot of things for you as a developer at the cost of some flexibility.

    Specifically you only have to supply the Aggregate ID, through Event.aggregateId(), on the FIRST/initial Event that's being applied to the AggregateRoot using the apply(Event) method.
    Every consecutive Event applied will automatically have its Event.aggregateId(Object) method called IF it doesn't already have a value.
    I.e. you can be lazy and skip setting the aggregate id on the Event if you don't want to.
    The AggregateRoot also automatically keeps track of the Event.eventOrder() value and will set it for you and ensure that it's consecutively growing.

    Note: The AggregateRoot works best in combination with the StatefulAggregateRepository

    You don't have to use the AggregateRoot IF it doesn't fit your purpose. It's always possible to build your own Aggregate concept.

    See Also:
    AggregateRootWithState