/// <summary> /// The action in aggregate causes an event /// </summary> /// <typeparam name="TAggregate"></typeparam> /// <param name="aggregate"></param> /// <param name="event"></param> public static void Causes <TAggregate>(this TAggregate aggregate, IDomainEvent @event) where TAggregate : EventSourcedAggregate { ((dynamic)aggregate).Apply((dynamic)@event); //RedirectToApply.InvokeEventOptional(aggregate, @event); // dynamic seems faster EventSourcedAggregate eventSourcedAggregate = (EventSourcedAggregate)aggregate; eventSourcedAggregate.Version++; eventSourcedAggregate.AddChange(@event); }
public void Store(EventSourcedAggregate aggregate) { using (IDocumentSession session = store.OpenSession()) { // Take non-persisted events, push them to the event stream, indexed by the aggregate ID IEvent[] events = aggregate.PendingEvents.ToArray(); session.Events.Append(aggregate.Id, aggregate.PendingEvents.ToArray()); session.SaveChanges(); } // Once succesfully persisted, clear events from list of uncommitted events aggregate.PendingEvents.Clear(); }
public async Task SaveAggregateAsync(EventSourcedAggregate aggregate) { await _eventStore.SaveAggregateEventsAsync(aggregate.Id.ToString(), aggregate.UncommittedEvents()); aggregate.ClearUncommittedEvents(); }
protected async Task SaveAndPublish(EventSourcedAggregate eventSourcedAggregate, CancellationToken cancellationToken = default(CancellationToken)) { await _context.SaveChangesAsync(cancellationToken); await _eventBus.Publish(eventSourcedAggregate.PendingEvents.ToArray()); }