Presupuestador_web/shared/lib/contexts/common/domain/entities/AggregateRoot.ts
2024-04-23 17:29:38 +02:00

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,
);
}
}