40 lines
1.1 KiB
TypeScript
40 lines
1.1 KiB
TypeScript
import { DomainEvents, IDomainEvent } from "../events";
|
|
import { Entity } from "./Entity";
|
|
|
|
export abstract class AggregateRoot<
|
|
T extends { [s: string]: any },
|
|
> extends Entity<T> {
|
|
private _domainEvents: IDomainEvent[] = [];
|
|
|
|
get domainEvents(): IDomainEvent[] {
|
|
return this._domainEvents;
|
|
}
|
|
|
|
protected addDomainEvent(domainEvent: IDomainEvent): void {
|
|
// Add the domain event to this aggregate's list of domain events
|
|
this._domainEvents.push(domainEvent);
|
|
|
|
// Add this aggregate instance to the domain event's list of aggregates who's
|
|
// events it eventually needs to dispatch.
|
|
DomainEvents.markAggregateForDispatch(this);
|
|
|
|
// Log the domain event
|
|
this.logDomainEventAdded(domainEvent);
|
|
}
|
|
|
|
public clearEvents(): void {
|
|
this._domainEvents.splice(0, this._domainEvents.length);
|
|
}
|
|
|
|
private logDomainEventAdded(domainEvent: IDomainEvent): void {
|
|
const thisClass = Reflect.getPrototypeOf(this);
|
|
const domainEventClass = Reflect.getPrototypeOf(domainEvent);
|
|
console.info(
|
|
`[Domain Event Created]:`,
|
|
thisClass?.constructor.name,
|
|
"==>",
|
|
domainEventClass?.constructor.name,
|
|
);
|
|
}
|
|
}
|